在Rails中转义HTML

Rea*_*nly 25 xss ruby-on-rails

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

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

Luk*_*ncl 22

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

  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亲切地链接到).

  • 从Rails 3开始,`h()`在您的视图中不再需要,因为内容会自动转义 - 请参阅[此处](http://www.webbydude.com/posts/9-the-h-helper-in-rails -3) (3认同)
  • 呸.数据库中的转义数据对于理智而言是个坏主意. (2认同)

Dan*_*rez 14

ħ是一个别名html_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;
Run Code Online (Sandbox Code Playgroud)

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

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

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


Jas*_*yon 5

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

<div class="comment">
    <%= h post.comment %>
</div>
Run Code Online (Sandbox Code Playgroud)