在Rails中转义HTML

为了防止Rails应用程序中存在XSS漏洞,推荐使用HTML的方法是什么?

是否允许用户将任何文本放入数据库但在显示时将其转义? 你应该添加before_savefilter来逃避输入吗?

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

  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,所以使用它可能会减慢你的速度。

如果你想阅读更多内容,我写了一篇关于使用xss_terminate的博客文章(Xavor亲切地链接到)。

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

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

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

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

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

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

 
<%= h post.comment %>

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

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

我刚刚使用Sanitize gem发布了一个名为ActsAsSanitiled的插件,它可以保证良好的格式,并且可以配置为允许哪种HTML,所有这些都不会改变用户输入或者需要在模板级别记住任何内容。