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 上找到。此补丁也能轻松应用于 2.2 预发布版本(在 2008 年 11 月 13 日星期四上午 11:19:53 CET 发布此更改集之前)。使用此日期之后的 edge-rails 签出版本的用户,建议升级到 2-2-stable 的最新代码。

感谢 Coderrr 的 Steve 报告此问题。