如何将Codeigniter中的CSRF包含到ajax数据中

Mot*_*ive 5 jquery codeigniter

我试图将一些数据传递到我的控制器,但我得到500错误.经过一些研究,我发现它是由CSRF令牌未被发送引起的.

似乎我需要将其与数据一起包含在内: <?php echo $this->security->get_csrf_token_name(); ?>:"<?php echo $this->security->get_csrf_hash(); ?>"

我的JS非常弱,所以我对如何改变它以包含上述内容感到困惑.

<script type="text/javascript"> 
$(document).ready(function() {
    $("#order").sortable({
        update : function (event, ui) {
            order = $('#order').sortable('serialize');
            $.ajax({
                url: "<?=base_url().'admin/category/update_order'?>",
                type: "POST",
                data: order,
                success: function(response){
                    console.log(response);
                }
            });
        }
    });
}
);
</script>
Run Code Online (Sandbox Code Playgroud)

jch*_*ook 4

令牌需要在data的参数中传递$.ajax

这应该可行,但请参阅下面我的注释。

order['<?php echo $this->security->get_csrf_token_name(); ?>'] = '<?php echo $this->security->get_csrf_hash(); ?>';

然而,这里存在一些不好的做法。主要是您不应该在 javascript 中使用 PHP,因为这会阻止您将 javascript 作为单独的文件进行访问(这很好,因为浏览器会缓存它以使您的页面加载速度更快并消耗更少的带宽)。

最好将令牌存储在您的订单<form>html 中,如下所示。

<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>" />

然后它将与表单数据的其余部分一起序列化。

您还可以将 URL 存储在表单的 action 属性中。这将帮助您的脚本正常降级,并将 URL 保留在一个位置而不是 2 个位置。

<form id="order" method="post" action="<?=base_url()?>admin/category/update_order">
Run Code Online (Sandbox Code Playgroud)

$.ajax调用中,使用类似的内容,url: $('#order').attr('action'),假设 #order 是实际的表单 id。