【发布时间】:2013-11-11 20:22:20
【问题描述】:
我使用 CodeIgniter 2.1.4 版和Ion Auth 已经有一段时间了,一切都很好。昨天,我将 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 函数(在位于/libraries/ 的Template.php 文件中)从一开始(几个月前)就一直运行良好。即使使用新版本的 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
}
}
作为临时(或永久?)解决方法,我在 CodeIgniter config/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 错误?一切都在使用相同域的同一台服务器上。
(编辑:是的,CI session 库正在自动加载,显然工作正常。毕竟我可以保持登录状态。)
【问题讨论】:
标签: php codeigniter csrf csrf-protection ion-auth