0

ajax リクエストを送信すると、500 エラーが発生し続けます。設定でCSRFをオフにすると、投稿が機能します。ただし、電源を入れると、500エラーが再び発生します。

config.php には、次の値が設定されています。

$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';

jquery cookie が読み込まれており、jquery ファイルには次のコードがあります。

 $('#reorder').sortable({
    opacity: '0.5',
    update: function(e, ui){
        newOrder = $( "#reorder" ).sortable('serialize');
        csrf_cookie_name = $.cookie('csrf_cookie_name')
        console.log(newOrder);
        console.log(csrf_cookie_name);
        $.ajax({
            csrf_cookie_name: $.cookie('csrf_cookie_name'),
            url: "/client/saveOrder",
            type: "POST",
            data: newOrder,
            // complete: function(){},
            success: function(feedback){
                console.log('success');
                $("#feedback").html(feedback);
                //$.jGrowl(feedback, { theme: 'success' });
            }
        });
    }
});

現在、csrf_cookie_name の console.log は次のとおりです: cd660b153522bef89dc53f7f95cd6b1d

最後に、データ処理を行うクライアントの非常に単純な関数です。通常、これの一部をモデルに分離しますが、機能するまではシンプルに保つように努めました。

function saveOrder()
    {
        $items = $this->input->post('item');
        echo '<br/>Items2:' . var_dump($items);
        $total_items = count($this->input->post('item'));

        for($item = 0; $item < $total_items; $item++ )
        {

            $data = array(
                'pageid' => $items[$item],
                'rank' => $item
            );

            $this->db->where('pageid', $data['pageid']);

            $this->db->update('pages', $data);

//          echo '<br />'.$this->db->last_query();

        }

ビューで使用されているフォームはありません。それは、並べ替えるためにドラッグしている LI のコレクションを含む単なる UL です。

4

4 に答える 4

2

2つの解決策があります。どちらも機能します。これらの投稿を確認してください-必要なすべての情報があります

a-simple-solution-to-codeigniter-csrf-protection-and-ajax

ajax-csrf-protection-codeigniter-2.0

于 2012-06-11T06:04:03.850 に答える
0

私は数日前にこの問題を抱えていましたが、解決策は簡単です(少なくとも私にとっては)。
変更:
$.ajax({ csrf_cookie_name: $.cookie('csrf_cookie_name')

$.ajax({ csrf_test_name: $.cookie('csrf_cookie_name')

于 2012-06-12T19:17:09.757 に答える
0

過去に、CI のネイティブフォーム ヘルパー<form>を使用する代わりにタグを誤って使用したときに問題が発生しました。これは、非表示のトークン フィールドを作成するために存在する必要があります。ここにもいくつかの良い提案があります: csrf-token-problem form_open()

于 2012-06-12T14:59:20.187 に答える
0

私はついにそれを働かせました。これを実現するために使用したjqueryは次のとおりです。

トークンの名前と Cookie の名前の両方を使用して、それを投稿オブジェクトの一部にする必要があります。したがって、トークン名 = Cookie 名であり、最後に & を必ず追加してください。

$('#reorder').sortable({
        opacity: '0.5',
        update: function(e, ui){
            newOrder = 'csrf_test_name=' + $.cookie('csrf_cookie_name') + '&';
            newOrder += $( "#reorder" ).sortable('serialize');
            console.log(newOrder);
            $.ajax({
                url: "/client/saveOrder",
                type: "POST",
                data: newOrder,
                csrf_test_name: $.cookie('csrf_cookie_name'),
                // complete: function(){},
                success: function(feedback){
                    console.log('success');
                    $("#feedback").html(feedback);
                    //$.jGrowl(feedback, { theme: 'success' });
                }
            });
        }
    });
于 2012-06-13T12:52:29.347 に答える