CodeIgniter 2,Ion Auth 在配置文件编辑时给出 CSRF 错误消息
Posted
技术标签:
【中文标题】CodeIgniter 2,Ion Auth 在配置文件编辑时给出 CSRF 错误消息【英文标题】:CodeIgniter 2, Ion Auth gives a CSRF error message upon profile edit 【发布时间】: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
库正在自动加载,显然工作正常。毕竟我可以保持登录状态。)
【问题讨论】:
【参考方案1】:我从来没有找到根本原因,但是我有一个理论可以解释其中的一些原因:
Ion Auth CSRF 保护依赖于flashdata
,其中flashdata
只能在对服务器的“下一次”调用中存活。我的自定义模板加载器可能会调用服务器两次,因为它首先调用构建页面的加载器函数,然后调用 CodeIgniter 的视图函数。
然而,这个理论并不能真正解释为什么未经修改的 Ion Auth 版本在 Safari 中仍然失败。如果您可以对此添加任何实质性或结论性的内容,请随时发布另一个答案。
根据 Ion Auth 的开发者 Ben Edmunds 的个人回复...
“在 CI 将 Ion Auth 示例构建到框架之前,我们将 CSRF 保护添加到了 Ion Auth 示例中,因此如果您使用的是较新版本的 CI,您最好将它们从 Ion Auth 示例控制器和视图中删除内置的。”
因为我已经在使用最新版本的 CodeIgniter (2.1.4),所以我决定走这条路。
我的 OP 的临时解决方法现在是永久性的:
我在 CodeIgniter config/config.php 文件的第 298 行启用了“CSRF 保护”选项。
$config['csrf_protection'] = TRUE; // enabled CSRF protection
然后我通过始终从该函数返回true
来抑制 Ion Auth 中的 CSRF 保护。
function _valid_csrf_nonce()
return TRUE; // effectively disables Ion Auth's CSRF protection
最后,开发者评论使用 CodeIgniter 的 CSRF 保护代替:
“酷,这确实是一个更好的解决方案,因为它已集成到您的应用程序中。”
【讨论】:
感谢您回答自己的问题。这似乎是解决该问题的好方法以上是关于CodeIgniter 2,Ion Auth 在配置文件编辑时给出 CSRF 错误消息的主要内容,如果未能解决你的问题,请参考以下文章