CodeIgniter 的 CSRF 令牌问题

Posted

技术标签:

【中文标题】CodeIgniter 的 CSRF 令牌问题【英文标题】:CSRF token problem with CodeIgniter 【发布时间】:2011-07-19 00:49:57 【问题描述】:

我在 CodeIgniter 中遇到了一个非常奇怪的 CSRF 保护问题。我已确保使用 form_open 启动表单,在配置文件中将 csrf_protection 设置为 true,并且我还确保隐藏的 csrf 名称和值字段与 csrf cookie 匹配,如下所示:http://d.pr/3cfB。

发生的情况是,当我提交表单时,我收到“遇到错误。不允许执行您请求的操作。”错误,不知道为什么。当我关闭 csrf_protection 时,表单工作正常。

更奇怪的是,我使用 tank_auth 库进行身份验证,它还使用 form_open 作为登录表单。我确实检查以确保当 csrf_protection 开启时登录表单中有一个隐藏的 csrf 字段,并且我能够提交表单并毫无问题地登录。

关于我可以做些什么来调试这个问题的想法?

【问题讨论】:

【参考方案1】:

我发现了问题。在我的一个自定义库中,我有 parent::_sanitize_globals() 这显然是导致错误的原因。我在某处读到,如果我打开了 xss 过滤,我不需要对全局进行清理。

【讨论】:

【参考方案2】:

首先,会话类需要一个名为“csrf_token_name”的令牌,而不是一个名为“csrf_salemarked_token$...”的令牌。

这篇博文涵盖AJAX with CSRF Protection in Codeigniter 2.0。

Tank_auth 正在从隐藏的输入表单字段中获取令牌,而不是从 cookie。您的 AJAX 请求需要从隐藏字段中获取令牌(如果可用)或 cookie(如果没有表单)。

【讨论】:

嗯,我不确定我是否同意你的看法。有几件事 - 首先,csrf_token_name 是 CI 配置的一部分 - d.pr/lQHG,所以 'csrf_salemarked_token$...' 是令牌的名称。其次,我没有尝试提交任何 ajax 表单。第三,我创建表单的方式与 tank_auth 创建表单的方式相同,我进行了双重检查,两个表单都有一个带有 csrf 令牌名称和值的隐藏输入。 woof...您对令牌名称是正确的。不知何故,我升级时没有迁移新的配置文件

以上是关于CodeIgniter 的 CSRF 令牌问题的主要内容,如果未能解决你的问题,请参考以下文章

在没有表格的情况下获取 Codeigniter CSRF 令牌?

如果我从CodeIgniter表单复制csrf令牌,则表单成功提交

Codeigniter CSRF - 它是如何工作的

Codeigniter CSRF - 它是如何工作的

防止在 Codeigniter 中显示默认的 CSRF 错误页面

一个令牌与多个令牌以防止 CSRF 攻击