2016-07-21 11 views
5

jQueryのchangeイベントでサーバーにイメージをアップロードしたいが、codeigniter csrfを使用しています。イメージを1回だけアップロードできます。複数requests.Pleaseは心に留めておくために、私は私が複数のリクエストにjQueryのonchangeイベントを送信することができていますが、csrf_protectionが偽であることを行っているときに、私はあると思うし、このCodeigniter CSRTは1回のみajaxリクエストに有効

config['csrf_protection'] = FALSE; 

を設定したとき、私は、Ajaxを使用して画像をアップロードするにはどうすればよいですcsrfの利点はありません。だから問題は、csrf_protectionが有効である間にajaxを使用して複数のリクエストを送信する方法です。私のjqueryのコードは、私の意見では

$("#avatar").change(function(){ 
    var link = $("#avatar").val();  
    $.ajax({ 
     url : "<?php echo base_url('main/test'); ?>", 
     type: 'post', 
     data: {'<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>',"id":"hello","link":link},    
     success : function(data) 
     { 
      alert(data); 
     } 
    }); 
}); 
+0

あなたは、Ajaxリクエストを取得し、コントローラのコードを投稿してもらえますか? – Edu

+0

公共機能テスト( ){ \t \t $ config ['upload_path'] = '/アップロード/ '; \t \t $ config ['allowed_types'] = 'gif | jpg | png'; \t \t $ config ['max_size'] = 500; \t \t $ config ['max_width'] = 260; \t \t $ config ['max_height'] = 260; \t \t $ this-> load-> library( 'upload'、$ config); \t \t if(!$ this-> upload-> do_upload( 'link')) { echo "error"; } else { \t \t $ data = array( 'upload_data' => $ this-> upload-> data()); $ image_name = $ data ['upload_data'] ['file_name']; \t \t echo $ image_name; \t} } – romio

+0

ありがとうございました – romio

答えて

8

に従っているあなたは、各要求

は、このコード例を試してみてください、あなたのCSRFトークンを再作成してみてください...

のjs funcion

var csrfName = '<?php echo $this->security->get_csrf_token_name(); ?>', 
    csrfHash = '<?php echo $this->security->get_csrf_hash(); ?>'; 
("#avatar").change(function(){ 
    var link = $("#avatar").val(); 

    $.ajax({ 
     url : "<?php echo base_url('main/test'); ?>", 
     type: 'post', 
     data: {csrfName:csrfHash,"id":"hello","link":link},    
     success : function(data) 
     { 
      csrfName = data.csrfName; 
      csrfHash = data.csrfHash; 
      alert(data.message); 
     } 
    }); 
}); 
のために

およびコントローラ用

public function test() { 
    $config['upload_path'] = './uploads/'; 
    $config['allowed_types'] = 'gif|jpg|png'; 
    $config['max_size'] = 500; 
    $config['max_width'] = 260; 
    $config['max_height'] = 260; 

    $reponse = array(
       'csrfName' => $this->security->get_csrf_token_name(), 
       'csrfHash' => $this->security->get_csrf_hash() 
       ) 

    $this->load->library('upload', $config); 
    if (!$this->upload->do_upload('link')) { 
     $reponse['message'] = "error"; 
    } 
    else { 
     $data = array('upload_data' => $this->upload->data()); 
     $image_name = $data['upload_data']['file_name']; 
     $reponse['message'] = $image_name; 
    } 

    echo json_encode($reponse); 
} 

私に教えてくださいと幸運

注:誰かがコメントや答えとしてそれを投稿していない、質問にはより多くのデータを投稿をお願いした場合、それは質問自体を編集した方が良いですし、ものを追加します

3

あなたはとてもCSRF保護は、すべてのセッション時間の間に、それはあなたの問題を解決する有効なconfig.phpの中で

$config['csrf_regenerate'] = FALSE; 

これを設定することができます。 あなたが $config['csrf_regenerate'] = true;を設定すると、CIが生成する新しいCSRFはCSRFトークン新しいはCSRFトークン生成と一致していない古いので、すべてのリクエストトークン

+0

私はたくさん検索しましたが、このアプローチを使用することをお勧めしません、それはセキュリティの損失を引き起こすでしょう、他の方法があります。 –

+0

私は、Marcelo CSRFの保護が公開Webアプリケーションで必要であることに同意します。 – Brian85

+0

私は、常にcsrfトークンを再生成するのが最善の方法ではなく、複数のタブ(例)にもたらす問題があなたのアプリを壊す可能性があるので、他の方法があります。それは残念だけど、CIはそれに対して何の解決策もありません。それは本当に私を悲しくし、コードイグナイターを残しています(他の理由でも)。 –

1

あなたはAJAX応答でSCRFトークンをリロードするだけです。それは簡単です!

+0

あなたは私にこれを行う方法を示すことができますか? – MZaragoza

+0

あなたが必要とするのは、あなたのajaxコントロールの応答がjson形式であり、jsonでは新しいcsrfトークンを渡すことができます。フロントエンドはjsonを解析し、フォームの非表示入力のscrf値を置き換えます。それは十分明確ですか? – Brian85

1

編集設定:

$config['csrf_exclude_uris'] = ['controller/method']; 

アレイを使用すると、CSRF保護はに対して無効にしたいすべてのホワイトリストコントローラ/メソッドを含めることができます。

配列には、また、正規表現処理できます。より多くの情報をご覧ください

$config['csrf_exclude_uris'] = array(
             'api/record/[0-9]+', 
             'api/title/[a-z]+' 
           ); 

Codeigniter Documentation - Security Class

関連する問題