Rails的sanitize()方法有多好?

15

我可以在计划向其他用户显示的用户输入文本上使用ActionView::Helpers::SanitizeHelper#sanitize吗?比如,它能正确处理此网站上描述的所有情况吗?

此外,文档提到:

请注意,对用户提供的文本进行清理并不能保证生成的标记是有效的(符合文档类型)或者形式良好。输出可能仍然包含未转义的“<”、“>”、“&”字符,并导致浏览器出现混乱。

如何处理这个问题?在显示之前,将经过过滤的文本通过Hpricot处理吗?

3个回答

16

Ryan Grove的Sanitize比Rails 3的sanitize功能更加强大。它确保生成的HTML格式正确,并具有三个内置白名单:

Sanitize::Config::RESTRICTED 只允许非常简单的行内格式标记。不允许链接、图像或块级元素。

Sanitize::Config::BASIC 允许各种标记,包括格式标签、链接和列表。不允许图像和表格,链接仅限于FTP、HTTP、HTTPS和mailto协议,并为所有链接添加了一个属性以减少SEO垃圾邮件。

Sanitize::Config::RELAXED 比BASIC允许更多种类的标记,包括图像和表格。链接仍然仅限于FTP、HTTP、HTTPS和mailto协议,而图像仅限于HTTP和HTTPS。在此模式下,链接不添加属性。


2
иҝҷжҳҜдёҖзҜҮжңҖиҝ‘е…ідәҺRyan Groveзҡ„Sanitizeе’ҢRails 3дёӯ'sanitize'зҡ„ж–Үз« пјҡhttp://devblog.supportbee.com/2011/08/15/sanitizing-css-in-rails/ - Purplejacket

11

相比于"h"助手,Sanitize(净化)肯定更好。它不仅可以转义所有内容,还可以允许指定的HTML标签。是的,它确实可以防止跨站脚本攻击,因为它彻底地去除了JavaScript。

简而言之,两者都能完成工作。当您不希望输入其他内容时,请使用"h";当您想允许某些内容或者您认为人们可能会尝试输入这些内容时,请使用sanitize。即使您使用sanitize禁止所有标记,它也会"美化"代码,而不像"h"一样转义它们。

至于不完整的标记:您可以对包含HTML字段的模型运行验证,但我认为这在大多数应用程序中都过于繁琐。


3
每个人都应该注意,Rails 4正在转向使用Loofah宝石进行净化,在Rails 3中可以独立使用,目前看起来非常不错。 - MBHNYC

4

最佳的操作方式取决于两个因素:

  • 您的rails版本(2.x或3.x)
  • 用户是否应该在输入时输入任何html。

通常情况下,我不允许用户输入html - 相反,我让他们输入textile。

对于rails 3.x:

用户输入默认经过了消毒处理。除非您希望用户能够发送一些html,否则您无需采取任何行动。如果是这样,请继续阅读。

这个railscast 处理了关于rails 3的XSS攻击。

对于rails 2.x:

如果您不允许用户输入任何html,则只需使用h方法来保护您的输出,如下所示:

<%= h post.text %>

如果您希望用户发送一些html: 您可以使用rails的sanitize方法或HTML::StathamSanitizer


不是直接相关,但这是对于一个随机的谷歌用户(我)更好地理解问题的好信息。 - brittohalloran
我认为应该补充说明,默认情况下用户输入是被转义而不是被清理的,如果您正在使用 <%= raw() %> 处理用户可以输入的任何内容,则应对其进行清理。 - Breno Salgado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接