我试图将一些数据传递给我的控制器,但是我得到了一个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>发布于 2012-06-30 06:06:34
该令牌需要在$.ajax的data参数中传递。
这应该可以工作,但请参阅我下面的说明。
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保留在一个位置而不是两个位置。
<form id="order" method="post" action="<?=base_url()?>admin/category/update_order">在$.ajax调用中,使用类似这样的url: $('#order').attr('action'),,假设#order是实际的表单id。
发布于 2012-07-01 07:53:23
CI将csrf存储在cookie中,您可以从那里获取它:
var csrf = $.cookie('csrf_cookie_name');这种方法的缺点是jQuery本身并不提供cookie访问。所以你需要一个jquery plugin。
发布于 2012-06-30 06:03:31
您是对的,只需将CSRF令牌添加到您的帖子数据中。您可以使用jQuery的$.extend函数将已经创建的order对象与CSRF令牌数据合并,如下所示:
$.extend(alerts, {
'<?php echo $this->security->get_csrf_token_name(); ?>' :
'<?php echo $this->security->get_csrf_hash(); ?>' });https://stackoverflow.com/questions/11269439
复制相似问题