最近版本的 Ruby on Rails 中的 XSS 防护支持允许一些字符串操作,当与用户提供的数据结合使用时,这些操作可能会错误地将“不安全字符串”视为安全字符串。应用程序不太可能调用这些方法,但是我们今天提供的版本可以阻止使用这些方法来确保不会意外调用这些方法。
当字符串呈现给客户端时,如果该字符串未标记为“安全 HTML”,则该字符串将自动转义并标记为“安全 HTML”。一些辅助方法会自动返回已标记为安全的字符串。
例如
<%= link_to('hello world', @user) %>
link_to
方法将返回一个标记为安全 HTML 的字符串。由于 link_to
返回一个“安全 HTML”字符串(也称为安全缓冲区),因此文本将直接输出,这意味着用户看到的是链接标记而不是转义的 HTML。
安全缓冲区允许通过 sub!
等方法进行就地更改。这些方法可以将不安全字符串添加到安全缓冲区,并且安全缓冲区将继续被标记为安全。
一个示例的问题可能是这样的
<%= link_to('hello world', @user).sub!(/hello/, params[:xss]) %>
在上面的示例中,将一个不受信任的字符串(params[:xss]
)添加到 link_to
返回的安全缓冲区,并且不受信任的内容成功发送给客户端且未转义。为了防止这种情况发生,sub!
和其他类似的方法现在将在安全缓冲区上调用时引发异常。
除了就地版本,这些方法中返回字符串副本的一些版本会错误地将字符串标记为安全。例如
<%= link_to('hello world', @user).sub(/hello/, params[:xss]) %>
新版本现在将确保这些方法在安全缓冲区上返回的所有字符串都标记为不安全。
此问题影响所有版本的 Rails:3.1.0.rc1、3.0.7 和 2.3.11。
任何在不转义输入的情况下更改安全缓冲区的函数现在都会引发异常。
如果你需要修改安全缓冲区,请首先通过调用 to_str
方法将其转换为 Ruby 字符串
<%= link_to('hello world', @user).to_str.sub!(/hello/, params[:xss]) %>
此问题已在 Rails 3.1.0.rc2、3.0.8 和 2.3.12(带有 rails_xss
)中修复。如果您由于某种原因无法升级 Rails 安装,请应用以下补丁
衷心感谢 LinuxFr.org 的 Bruno Michel 和 Brett Valantine,他们向我们独立报告了这个问题。