Как заставить Uploadify работать с Codeigniter + CSRF? - PullRequest
3 голосов
/ 23 марта 2012

Я пытаюсь заставить 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, но ничего не работает. Я всегда получаю 500 HTTP, если не отключаю CSRF.

Если кто-то может помочь, это будет очень признательно. Я понимаю, что этот вопрос часто задают, и это сводит меня с ума. С другой стороны, передача CSRF вместе со стандартными запросами AJAX работает нормально, но только не с uploadify.

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Используйте этот код, он позволяет вам определить массив методов контроллера, которые не подлежат CSRF: https://github.com/EllisLab/CodeIgniter/pull/236.

0 голосов
/ 23 марта 2012

Проблема заключается в том, что Uploadify использует объект Flash, который похож на совершенно другой браузер, с другим сеансом, поэтому CSRF не будет соответствовать вашему сеансу, если вы поместите POST-данные cookie.

Вам необходимо переопределить исходную функцию CSRF с помощью файла MY_Security.php и сделать так, чтобы вы могли обойти его, например, отправив весь файл cookie сеанса через POST и сделав так, чтобы CSRF мог его прочитать, чтобы вы могли быть сопоставленным.

Вы также можете попробовать загрузчики HTML5, такие как https://github.com/blueimp/jQuery-File-Upload, которые, по крайней мере, дают вам больше шансов не делать таких переопределений.

...