25

什么是转义 HTML 以防止 Rails 应用程序中的 XSS 漏洞的推荐方法是什么?

您是否应该允许用户将任何文本放入数据库但在显示时对其进行转义?您是否应该添加 before_save 过滤器来转义输入?

4

5 回答 5

24

解决这个问题有三种基本方法。

  1. h()在您的意见中使用。这里的缺点是,如果你忘记了,你会得到 pwnd。
  2. 使用保存时转义内容的插件。我的插件xss_terminate就是这样做的。然后你不必h()在你的视图中使用(大部分)。还有其他在控制器级别上工作。这里的缺点是(a)如果转义代码中存在错误,您可能会在数据库中获得 XSS;和 (b) 在某些极端情况下您仍想使用h().
  3. 使用在显示内容时转义内容的插件。CrossSiteSniper可能是其中最著名的。这会为您的属性设置别名,以便当您调用 foo.name 时,它​​会转义内容。如果您需要未转义的内容,有一种解决方法。我喜欢这个插件,但我并不热衷于让 XSS 首先进入我的数据库......

然后是一些混合方法。

没有理由不能同时使用 xss_terminate 和 CrossSiteSniper。

还有一个名为Erubis的 ERb 实现,可以对其进行配置,以便任何类似的调用都<%= foo.name %>被转义——相当于<%= h(foo.name) %>. 不幸的是,Erubis 似乎总是落后于 Rails,因此使用它会减慢您的速度。

If you want to read more, I wrote a blog post (which Xavor kindly linked to) about using xss_terminate.

于 2009-03-31T16:16:24.503 回答
14

hhtml_escape的别名,它是一种用于转义所有 HTML 标记字符的实用方法:

html_escape('<script src=http://ha.ckers.org/xss.js></script>')
# => &lt;script src=http://ha.ckers.org/xss.js&gt;&lt;/script&gt;

如果您需要更多控制,请使用sanitize方法,该方法可用作标签和属性的白名单以允许:

sanitize(@article.body, :tags => %w(table tr td), :attributes => %w(id class style))

我将允许用户输入任何内容,将其按原样存储在数据库中,并在显示时转义。这样您就不会丢失输入的任何信息。您以后可以随时调整转义逻辑...

于 2009-03-30T23:09:36.607 回答
5

在视图模板中使用 h 方法。假设您有一个带有评论属性的 post 对象:

<div class="comment">
    <%= h post.comment %>
</div>
于 2009-03-30T19:41:37.717 回答
2

或者使用这个插件 - 不需要 h 8)

http://railspikes.com/2008/1/28/auto-escaping-html-with-rails

于 2009-03-30T20:18:03.463 回答
0

I've just released a plugin called ActsAsSanitiled using the Sanitize gem which can guarantee well-formedness as well being very configurable to what kind of HTML is allowed, all without munging user input or requiring anything to be remembered at the template level.

于 2009-10-15T07:24:13.913 回答