我在启用CSRF的情况下使用CodeIgniter 3。我有一个页面使用X-editable库http://vitalets.github.io/x-editable/index.html在该页面上进行内联编辑。
是否有人使用X-editable与CodeIgniter并启用了CSRF?
我的问题是当我启用CSRF时,我收到以下CodeIgniter生成的错误:
<h1>An Error Was Encountered</h1>
<p>The action you have requested is not allowed.</p>
如果我在CI中禁用CSRF,它可以正常工作。
我所知道的是,在使用X-editable库时,我无法找到使用CSRF令牌添加隐藏字段的方法,因为javascript库会添加它自己的表单和表单领域。我知道CI的open_form()方法会自动添加带有CSRF令牌的隐藏字段,但我没有选择将其用于此特定库。
有什么想法吗?我已经被困在这几天了。
这是我的CI项目中的config.php文件
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'mycsrfname';
$config['csrf_cookie_name'] = 'csrfcookiename';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();
这是在控制器中
$name = $this->input->post('name');
$value = $this->input->post('value');
$pk = $this->input->post('pk');
$result = $this->garage_model->editItem($name,$value,$pk);
答案 0 :(得分:1)
禁用ajax调用的CSRF令牌不是一个好主意。相反,你应该通过参数发送令牌:
params: function(params) {
params.csrfToken = $.cookie('csrfCookie');
return params;
}
答案 1 :(得分:0)
在我的情况下,我已经排除了网址CSRF以使这个脚本工作; 查看配置文件:$ config ['csrf_exclude_uris'] = array('thename / ofcontrollertodisable');
告诉我你是否找到了更好的解决方案!
答案 2 :(得分:0)
如果它仍然是最新的,也许这可以帮助你。
为了避免Ajax的跨站点请求伪造(CSRF)问题,您可以在全局页面中编写以下内容javascript:
var csfrData = {};
csfrData['<?php echo $this->security->get_csrf_token_name(); ?>'] = '<?php echo $this->security->get_csrf_hash(); ?>';
然后在你的函数中使用它:
// Attach CSFR data token
$.ajaxSetup({ data: csfrData });