2017-01-13 17 views
1

最初は簡単な理由からフォーム/ ajaxを動作させるためにCSRFをオフにしました。今私はそれをオンにし、CSRFのための入力やものを使用しようとすると何も動作しません。私のフォームは提出しないか、私のページ全体がリフレッシュされますが、私はそれを起こさせることはできません。ここに私の現在のコードです。CSRF AJAX&FORMによる保護 - CodeIgniter - 送信していない

form method="post"> 
    <input type="text" name="vip_text_box" id="vip" value="<?php echo $total_amount ?>"> <br><br> 
    <input type="submit" id="submit" value="Redeem" onclick="return rebate_amount()"> 
    <input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>"> 
</form> 

とAjax:

function rebate_amount(){ 

    var value = document.getElementById('vip').value; 
    var datastring = 'vip='+value; 
    var url = base_url + '/index.php/home/redeeming_form_value'; 

    $.ajax({ 
    type : 'post', 
    url : url, 
    data: datastring, 
    cache: false, 
    success: function(html){ 

     $('#vip_point_redeeming').html(html); 

    } 
    }); 
    return false; 
} 

は覚えておいてください。これは、CSRFが設定ファイルでオフになっているときにすべて動作します。しかし、私はフォーム/ ajaxを持つCSRFのここでの問題だと思います。

+0

になります。 CodeIgniterはPOST操作を受け取ると、コードを実行する前にTOKENを見つけることができず、すべてをシャットダウンします。 –

答えて

2

ます。またcsrf_tokenを含めるべきデータと

500内部サーバーエラー

はあなたのAJAXリクエストがPOST操作を構築するが、 CSRFトークンを提供することができません。 CodeIgniterのは、POST操作を受信すると、それは TOKENを見つけることができない、あなたが 実行する機会に任意のコードを持って前に、すべてをシャットダウンし、したがって、あなたは、500内部サーバーエラーが表示さ

あなたは

を作るのどちらか
data : $("#your_form").serialize(); 

OR

data: { 
     '<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>', 

      /*....your data....*/ 
      vip:document.getElementById('vip').value 
     }, 

あなたの機能はあなたのAJAXリクエストがPOST操作を構築するが、CSRFトークンを提供するために失敗したやや

function rebate_amount(){ 

var url = base_url + '/index.php/home/redeeming_form_value'; 

$.ajax({ 
    type : 'post', 
    url : url, 
    data: { 
    '<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>', 

     /*....your data....*/ 
     vip:document.getElementById('vip').value 
    }, 
    cache: false, 
    success: function(html){ 
     $('#vip_point_redeeming').html(html); 
    } 
    }); 
    return false; 
} 
+0

これはかなり良いですね。 AJAXコードがどこで定義されているのかはっきりしていませんが、CodeIgniterにCSRFトークンを渡してPOSTデータを渡す必要があります。 –

+0

私はajaxコードがビュー内で定義されていると仮定しているので、ユーザーが '$ this-> load-> view(..) 'でビューを読み込むと、彼がまだシリアル化できない場合、データはトークンと値で事前に設定することができます –

+0

合理的な仮定。私はそれをテストしていない。私はあなたの投稿がかなり簡潔なので、OPのテキストを明確にすることを試みていました。 –