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

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

似乎我需要将其与数据一起包括在内: security->get_csrf_token_name(); ?>:"security->get_csrf_hash(); ?>" security->get_csrf_token_name(); ?>:"security->get_csrf_hash(); ?>"

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

  $(document).ready(function() { $("#order").sortable({ update : function (event, ui) { order = $('#order').sortable('serialize'); $.ajax({ url: "", type: "POST", data: order, success: function(response){ console.log(response); } }); } }); } );  

需要在$.ajaxdata参数中传递令牌。

这应该工作,但请参阅下面的笔记。

order['security->get_csrf_token_name(); ?>'] = 'security->get_csrf_hash(); ?>';

但是,这里有一些不良做法。 主要是你不应该在你的javascript中使用PHP,因为这会阻止你作为一个单独的文件访问javascript(这很好,因为浏览器会缓存它以使你的页面加载更快,消耗更少的带宽)。

最好将令牌存储在您的订单

html中,如下所示。

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

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

 

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

CI将csrf存储在cookie中,您可以从那里获取它:

 var csrf = $.cookie('csrf_cookie_name'); 

这种方法的缺点是jQuery本身不提供cookie访问。 所以你需要一个jquery插件 。

你是对的,只需将CSRF令牌添加到你的post数据中。 您可以使用jQuery的$ .extend函数将您已创建的订单对象与CSRF令牌数据合并,如下所示:

 $.extend(alerts, { 'security->get_csrf_token_name(); ?>' : 'security->get_csrf_hash(); ?>' }); 

这是一种不同的方法。 Auth.php中的简单函数,它以JSON格式返回csrf标记名称和哈希。 然后,在我们的javascript中,进行两次ajax调用,第一次获取csrf信息并将其插入隐藏的表单字段,第二次处理我们的实际表单提交。

//在Auth.php控制器中放置函数

 public function get_csrf() { $csrf['csrf_name'] = $this->security->get_csrf_token_name(); $csrf['csrf_token'] = $this->security->get_csrf_hash(); echo json_encode($csrf); } 

// myFunction()

  

// html

 


我将form_helper扩展为MY_form_helper.php以将csrf标记提供给我自己的表单生成代码 – 您可以使用类似的东西:

  function secure_form() { $CI =& get_instance(); return ''; } 

另一个解决方案是使用.serialize():

 $.post("user/save", $('#frmUser').serialize(),function(html){ $("#results").html(html); }); 

将找到存储CSRF数据的隐藏字段。