如何将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); } }); } }); } );
需要在$.ajax
的data
参数中传递令牌。
这应该工作,但请参阅下面的笔记。
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数据的隐藏字段。