在Rails中转义HTML
为了防止Rails应用程序中存在XSS漏洞,推荐使用HTML的方法是什么?
是否允许用户将任何文本放入数据库但在显示时将其转义? 你应该添加before_savefilter来逃避输入吗?
这个问题有三种基本方法。
- 在视图中使用
h()
。 这里的缺点是,如果你忘了,你得到了pwnd。 - 使用在保存内容时转义内容的插件。 我的插件xss_terminate就是这样做的。 然后,您不必在视图中使用
h()
(大多数情况下)。 还有其他一些在控制器级别上工作。 这里的缺点是(a)如果转义代码中存在错误,您可以在数据库中获取XSS; (b)有些情况下你仍然想要使用h()
。 - 使用在显示内容时转义内容的插件。 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,所有这些都不会改变用户输入或者需要在模板级别记住任何内容。