启用CI 2.0.x,ajax和CSRF时出现500错误

时间:2012-06-11 05:08:22

标签: codeigniter jquery codeigniter-2

提交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 个答案:

答案 0 :(得分:2)

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

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

ajax-csrf-protection-codeigniter-2.0

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

您必须同时使用令牌的名称和Cookie的名称,并使其成为post对象的一部分。所以令牌名称= cookie名称,并确保添加&amp;最后。

$('#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' });
                }
            });
        }
    });