4

我一直在使用带有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库正在自动加载,显然工作正常。毕竟我可以保持登录状态。)

4

1 回答 1

10

我从来没有找到根本原因,但是我有一个理论可以解释其中的一些:

Ion Auth CSRF 保护依赖于flashdata,其中flashdata仅在对服务器的“下一次”调用中存活。我的自定义模板加载器可能会调用服务器两次,因为它首先调用构建页面的加载器函数,然后调用 CodeIgniter 的视图函数。

然而,这个理论并不能真正解释为什么未经修改的 Ion Auth 版本在 Safari 中仍然失败。如果您可以为此添加任何实质性或结论性的内容,请随时发布另一个答案。


根据 Ion Auth 的开发者 Ben Edmunds 的个人回复...

“在 CI 将 Ion Auth 示例构建到框架之前,我们为 Ion Auth 示例添加了 CSRF 保护,因此如果您使用的是内置 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 保护代替:

“酷,这确实是一个更好的解决方案,因为它已集成到您的应用程序中。”

于 2013-11-01T18:44:23.170 回答