Spa*_*rky 4 php codeigniter csrf csrf-protection ion-auth
我一直在使用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);
Run Code Online (Sandbox Code Playgroud)
有了这条线:
$view_html = $this->template->load('default', $view, $this->viewdata, $render);
Run Code Online (Sandbox Code Playgroud)
是的,我的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
}
}
Run Code Online (Sandbox Code Playgroud)
作为临时(或永久?)解决方法,我在CodeIgniter config/config.php文件中的第298行启用了"CSRF Protection"选项.
$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;
Run Code Online (Sandbox Code Playgroud)
然后我总是true从函数返回来抑制Ion Auth中的CSRF保护.
function _valid_csrf_nonce()
{
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)
但是,我真的想了解这里的根本原因.为什么我只是通过使用旧版浏览器或尝试将Ion Auth视图放在我自己的模板中来获取所有这些CSRF错误?一切都在使用相同域的同一台服务器上.
(编辑:是的,CI session库正在自动加载,显然工作正常.毕竟,我可以保持登录状态.)
Spa*_*rky 10
我从来没有找到根本原因,但是我有一个理论可以解释其中的一些:
Ion Auth CSRF保护取决于flashdata哪里flashdata只能存活到服务器的"下一次"呼叫.我的自定义模板加载器可能会调用服务器两次,因为它首先调用构建页面的加载器函数,然后调用CodeIgniter的视图函数.
然而,这个理论并没有真正解释为什么未修改版本的Ion Auth仍然在Safari中失败.如果您可以添加任何实质性或决定性的内容,请随意发布另一个答案.
根据Ion Auth的开发人员Ben Edmunds的个人回应......
"在CI将它们构建到框架中之前,我们已经为Ion Auth示例添加了CSRF保护,因此您最好将它们从Ion Auth示例控制器中删除,并查看是否使用内置的更新版本的CI."
由于我已经在使用最新版本的CodeIgniter(2.1.4),所以我决定采用这条路线.
我的OP的临时解决方法现在是永久性的:
我在CodeIgniter config/config.php文件中的第298行启用了"CSRF Protection"选项.
$config['csrf_protection'] = TRUE; // enabled CSRF protection
Run Code Online (Sandbox Code Playgroud)
然后我总是true从这个函数返回来抑制Ion Auth中的CSRF保护.
function _valid_csrf_nonce()
{
return TRUE; // effectively disables Ion Auth's CSRF protection
}
Run Code Online (Sandbox Code Playgroud)
最后,开发人员评论使用CodeIgniter的CSRF保护:
"很酷,这真的是一个更好的解决方案,因为它集成在整个应用程序中."