我一直在使用带有Ion Auth的 CodeIgniter 2.1.4 版已经有一段时间了,一切都很好。昨天,我将 Ion Auth 更新到了最新版本,现在每当我尝试“编辑”任何用户配置文件时都会收到 CSRF 错误。
“这个表格帖子没有通过我们的安全检查。”
controllers/auth.php
修改文件以便将各种 Ion Auth 视图加载到我自己的模板中后,我收到此错误。毕竟,如果我不能将它整合到我的网站设计中,这有什么好处。 但是,即使auth.php
控制器根本没有修改,我也会在旧版本的 Safari 中收到此错误。
auth.php
这是我对控制器文件的简单修改。
替换了这一行:
$view_html = $this->load->view($view, $this->viewdata, $render);
有了这条线:
$view_html = $this->template->load('default', $view, $this->viewdata, $render);
是的,我的load
函数(在Template.php
位于 的文件中/libraries/
)从一开始(几个月前)就一直运行良好。即使使用新版本的 Ion Auth,我的模板加载功能也可以正常工作……但是,如上所述,我只是不断收到安全错误。
经过一番研究,错误的原因是 Ion Auth 的 CSRF 安全例程。这两个函数在整个auth.php
控制器中被调用,并在_valid_csrf_nonce()
函数返回时显示上面的错误false
。
function _get_csrf_nonce()
{
$this->load->helper('string');
$key = random_string('alnum', 8);
$value = random_string('alnum', 20);
$this->session->set_flashdata('csrfkey', $key);
$this->session->set_flashdata('csrfvalue', $value);
return array($key => $value);
}
function _valid_csrf_nonce()
{
if ($this->input->post($this->session->flashdata('csrfkey')) !== FALSE &&
$this->input->post($this->session->flashdata('csrfkey')) == $this->session->flashdata('csrfvalue'))
{
return TRUE; // <-- no error
}
else
{
return FALSE; // <-- error
}
}
作为临时(或永久?)解决方法,我在 CodeIgniterconfig/config.php
文件的第 298 行启用了“CSRF 保护”选项。
$config['csrf_protection'] = TRUE; // enabled CSRF protection
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
true
然后我通过始终从函数返回来抑制 Ion Auth 中的 CSRF 保护。
function _valid_csrf_nonce()
{
return TRUE;
}
但是,我真的很想了解这里的根本原因。为什么我只是通过使用较旧的浏览器或尝试将 Ion Auth 视图放在我自己的模板中而得到所有这些 CSRF 错误?一切都在使用相同域的同一台服务器上。
(编辑:是的,CIsession
库正在自动加载,显然工作正常。毕竟我可以保持登录状态。)