2017-08-24 23 views
0

私のアプリケーションでCodeIgniter3を使用していますが、フォームの中にはajaxを使用しています。私はcsrf_regenerate = TRUEに設定しました。最初は、(コンボボックスに入力するための)連続するajax呼び出しでcsrfトークンを渡すという問題がありましたが、解決しました。 CodeIgniter 3のCSRFとAjaxの問題

<script type="text/javascript" language="javascript"> 

var csfrData; 
csfrTokenName = '<?php echo $this->security->get_csrf_token_name(); ?>'; 
csfrHash = '<?php echo $this->security->get_csrf_hash(); ?>'; 

setCSRF(csfrTokenName, csfrHash); 

function setCSRF(name, value) { 
    csfrData = {}; // Reset csrfData to an empty array 
    csfrData[name] = value;  
} 
</script> 

が続いてAjaxの呼び出しのために、私は次の操作を行います:すべてのコンボボックスを移入され

$('#department_id').change(function() { 

var department_id=$("#department_id").val(); 
var domain=$("#domain").val(); 

$.ajax({   
    'type': "POST", 
      url: domain + "index.php/project/get_scheme", 
      data: {department_id: department_id, csrf_test_name: csfrData.csrf_test_name}, 
      dataType: 'json', 
      success: 
     function(j){ 

       setCSRF(j.csrfTokenName, j.csrfTokenHash); 
       if(j.schemes.length >= 2) { 
       var options = ''; 
       for (var i = 0; i <= (j.schemes.length-1); i++) { 
         options += '<option value="' + j.schemes[i].id + '">' + j.schemes[i].name + '</option>'; 
       } 
       $("#scheme_id").html(options); 
       $('#scheme_id option:first').prop('selected', 'selected'); 
       }       
     } 
     }); 

    }); 

この方法

は私がCSRFTokenを更新ページを持っています。しかし、最終的にフォームを送信すると、次のエラーが表示されます。

リクエストされた操作は許可されていません。

私がBurpsuiteを使用して確認したところ、今回はcsrf_token_nameとcsrf_cookieの値が一致せず、エラーが発生していました。私はなぜこれが起こっているのか理解できません。どんな指導も歓迎されます。

+0

Mr Suneel ...私の質問を重複としてマークする前にその投稿を読んだことがありますか?私は解決しようとしている問題でかなりの時間を過ごしました – John

+0

こんにちは!! get_schemeファイルでセッションやパーミッションを使用していますか? – Dario

+0

wwwとwwwのないドメインをテストします。 – Dario

答えて

0

私はこの問題を解決しました。私はここにそれを掲示していますので、将来的に答えを探している人々に役立ちます。私は、csrfトークンはすべてのAjaxリクエストで変更されていますが、フォームにはまだ古いトークンが残っているという重要な点は認識していませんでした。したがって、フォームの送信中に、古いトークンがサーバーのトークンと一致しません。

最後の呼び出しで、私は隠しフィールドから古いトークンを削除し、最新のトークンで置き換えました。フォームが正常に送信されました。

$('input:hidden[name=csrf_test_name]').val(''); 
$('input:hidden[name=csrf_test_name]').val(j.csrfTokenHash);  

ありがとうございました。