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 错误消息的主要内容,如果未能解决你的问题,请参考以下文章

为 ion auth 和 codeigniter 构建表

Ion Auth (Codeigniter) - 如何使用不同的数据库

如何防止codeigniter中的自动注销?

codeigniter nodejs 和 nowjs 集成

如何在codeigniter中要求一次

Tank Auth 的 Codeigniter 路由设置