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

有两种解决方案。两者都有效。检查这些帖子 - 拥有您需要的所有信息

一个简单的解决方案到 codeigniter-csrf-protection-and-ajax

ajax-csrf-protection-codeigniter-2.0

于 2012-06-11T06:04:03.850 回答
0

过去我在无意中使用<form>标签而不是使用 CI 的本机表单助手 form_open()时遇到过问题。这需要存在才能创建隐藏的令牌字段。这里也有一些很好的建议:csrf-token-problem

于 2012-06-12T14:59:20.187 回答
0

几天前我遇到了这个问题,解决方案很简单(至少对我来说)。
改变:
$.ajax({ csrf_cookie_name: $.cookie('csrf_cookie_name')

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

于 2012-06-12T19:17:09.757 回答
0

我终于让它工作了。这是我用来实现它的jquery:

您必须同时使用令牌的名称和 cookie 的名称,并使其成为 post 对象的一部分。所以令牌名称 = 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 回答