【问题标题】:How to get Uploadify working with Codeigniter + CSRF?如何让 Uploadify 与 Codeigniter + CSRF 一起工作?
【发布时间】:2023-03-18 09:55:01
【问题描述】:

我正在尝试让 Uploadify 2.1.4 与 Codeigniter 2.1.0 和 CSRF 一起使用,但我运气不佳。我有一个非常基本的上传控制器和以下用于上传的代码:

$(function() {
        var cct = $.cookie('csrf_cookie_name');
        $('#uploadifyMe').uploadify({
            'uploader'       : '<?php echo site_url(); ?>js/uploadify/uploadify.swf',
            'script'         : '<?php echo site_url(); ?>upload/',
            'cancelImg'      : '<?php echo site_url(); ?>js/uploadify/cancel.png',
            'multi'          : true,
            'auto'           : false,
            'fileExt'        : '*.jpg;*.jpeg',
            'fileDesc'       : 'Image Files (JPG, JPEG)',
            'fileDataName' : 'imgData',
            'queueID'        : 'fileQueue',
            'simUploadLimit' : 1,
            'sizeLimit'   : 7340032,
            'removeCompleted': false,
            'scriptData' : { 'csrf_token_name' : cct, 'upload' : 'true' },
            'onSelectOnce'  : function(event, data) {
                $('.uploadifyProgress').addClass('progress');
                $('.uploadifyProgressBar').addClass('bar');
            },
            'onComplete' : function(e, i, f, r, d) {
                console.log(r);
            },
            'onError' : function(e, i, f, eO) {
                console.log(eO);
                if(eO.info == 500) {
                    $('#status').prop('class', 'alert alert-error').html('<a class="close" data-dismiss="alert">&times;</a><h4>Hmmm. Something gone wrong it has.</h4> Yoda has discovered that your security token has expired. This is because you have been here for longer than two hours. we cannot refresh your key automatically, please refresh the page and try again.');
                }
            }
        });
});

问题是,当我上传图片时,我收到了 HTTP 500。我现在知道这是因为 CSRF 被打开了,因为如果我把它关闭它就可以正常工作。

我已经尝试了很多解决问题的方法。您可以在我的代码中看到一个,以及从这里克隆您的会话数据并使用 CSRF 密钥发送它的一个,但没有任何作用。除非我关闭 CSRF,否则我总是以 500 HTTP 结束。

如果有人能提供帮助,将不胜感激。我意识到这个问题似乎被问了很多,这让我发疯了。附带说明一下,将 CSRF 与标准 AJAX 请求一起传递可以正常工作,只是不能与 uploadify 一起传递。

【问题讨论】:

  • 一个小笔记。虽然我启用了 CSRF,但匹配用户代理选项被禁用。

标签: php codeigniter uploadify csrf


【解决方案1】:

使用此代码,它使您可以定义不受 CSRF 约束的控制器方法数组:https://github.com/EllisLab/CodeIgniter/pull/236

【讨论】:

  • 我意识到我接受答案有点晚了,但这很有效。从那以后,我开始在新项目中使用 Laravel,这似乎更容易使用 CSRF 系统,但这对客户的需求非常有用。
【解决方案2】:

问题是 Uploadify 使用 Flash 对象,它就像一个完全不同的浏览器,具有不同的会话,因此如果您 POST cookie 数据,CSRF 将无法匹配您的会话。

您需要使用 MY_Security.php 文件覆盖原始 CSRF 函数并 make 以便您可以绕过它,例如,通过 POST 发送整个会话 cookie 并 make 以便 CSRF 可以读取它,因此您可以匹配。

您不妨试试像 https://github.com/blueimp/jQuery-File-Upload 这样的 HTML5 上传器,这至少让您有更好的机会不必进行此类覆盖。

【讨论】:

  • 嗨。感谢您的回答。我最终为上传表单的 CSRF 添加了一个覆盖。结果客户还是决定不使用该系统。 :(
猜你喜欢
  • 1970-01-01
  • 2012-07-23
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 2011-08-10
  • 2012-03-01
  • 2016-09-24
相关资源
最近更新 更多