2012-03-23 78 views
3

我想讓Uploadify 2.1.4與Codeigniter 2.1.0和CSRF一起工作,我沒有太多的運氣。我有一個很基本的上傳控制器&爲uploadify下面的代碼:如何使用Codeigniter + CSRF獲取Uploadify?

$(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。

+0

小記。當我啓用CSRF時,匹配用戶代理選項被禁用。 – Vunus 2012-03-23 13:31:54

回答

2

使用此代碼,它使您能夠定義不受CSRF控制器方法的數組:https://github.com/EllisLab/CodeIgniter/pull/236

+1

我意識到我接受的答案有點晚了,但是這很有幫助。自那以後,我開始使用Laravel來開發新的項目,這似乎更容易使用CSRF系統,但這對於客戶的需求。 – Vunus 2013-04-24 13:06:34

0

問題是Uploadify使用Flash對象,它像一個完全不同的瀏覽器,具有不同的會話,所以如果POST POST cookie數據,CSRF將與您的會話不匹配。

您需要用MY_Security.php文件覆蓋原始的CSRF函數,然後設置爲讓您可以繞過它,例如,通過POST發送整個會話cookie並使CSRF可以讀取它,讓您可以匹配。

您不妨嘗試一下HTML5上傳器,如https://github.com/blueimp/jQuery-File-Upload,它們至少可以讓您更有機會不必做這樣的重寫。

+0

嗨。感謝你的回答。我最終爲uploadify表單添加了CSRF覆蓋。原來客戶決定反對使用該系統。 :( – Vunus 2012-06-21 13:41:42