2008 年 11 月 18 日,星期二

绕过 Rails 2.1 中的 CSRF 保护

发布人:michael

Ruby on Rails 中的所有 2.1.x 版本都存在一个错误,它影响了 `protect_from_forgery` 提供的 CSRF 保护的有效性。

根据设计,rails 不会对内容类型为浏览器通常不会生成的特定内容类型的请求执行标记验证。遗憾的是,此列表中还包括浏览器可以生成的“text/plain”。

影响

可以编制出请求,完全绕过 CSRF 保护。Rails 不会解析随这些请求一起提供的参数,但这可能不足以保护你的应用。

受影响的版本

  • 2.1 系列中的所有版本
  • 所有 2.2 预发布版本

修复

即将推出的 2.1.3 和 2.2.2 版本将包含此问题的修复。

临时解决方法

建议 2.1.x 版本的用户在 config/initializers/ 中的文件中插入以下代码

> Mime::Type.unverifiable_types.delete(:text)

2.2.1 之后的 Edge Rails 用户,应该升级到 2-2-stable 中的最新版本。

2.1.x 系列的补丁在 github 上可用。这同样适用于在 此变更集(已于 2008 年 11 月 13 日星期四 11:19:53 CET 发布)之前发布的 2.2 预发布版本。建议在该日期之后签出 edge-rails 的用户升级到 2-2-stable 中的最新版本。

感谢 来自 Coderrr 的 Steve 报告此问题。