我正在使用GroceryCRUD 1.5.0与CodeIgniter 2.2.0。
使用以下命令启用CodeIgniter的内部CSRF保护时
$config['csrf_protection'] = TRUE;
在application/config/config.php
中,然后GroceryCRUD自动生成的操作按钮(编辑,查看)和链接(添加)不再有效。
似乎CSRF令牌未在Ajax调用中传递(使用Firebug确认)。可以将此CodeIgniter功能与GroceryCRUD一起使用吗?
答案 0 :(得分:1)
我终于设法解决了我的问题。有两种选择:
简单方法:
集:
$config['grocery_crud_dialog_forms'] = false;
application/config/grocery_crud.php
中的。
这个选项在没有启用CSRF保护的情况下运行良好(也就是说,它可以设置为true
以生成更优雅的表单),但如果在javascript中没有进行代码修改则设置失败。
优雅的方式:
如果我们想使用:
$config['grocery_crud_dialog_forms'] = true;
在application/config/grocery_crud.php
中有可爱的形式,然后:
在包含表单的页面中包含jquery.cookie plugin
将此代码添加到您的JS文件中,以自动神奇地在所有ajax POST调用中插入CSRF令牌:
$(document).ready(function() {
var csrf_token= $.cookie('csrf_cookie_name');
$.ajaxSetup({
data: {
'csrf_test_name' : csrf_token
}
});
});
我希望这会帮助别人。
答案 1 :(得分:1)
以防有人有同样的错误:对于CI 3.0.1和GroceryCRUD 1.5.1,Cookie 与AJAX请求一起正确发送,但是因为令牌更改,只有第一个请求才有效
要始终使用相同的令牌,请设置(在application/config/config.php
中):
$config['csrf_regenerate'] = FALSE;
修改:参考手册:http://www.codeigniter.com/user_guide/libraries/security.html#cross-site-request-forgery-csrf