Rails sanitize()方法有多好?

我可以对用户输入的文本使用ActionView :: Helpers :: SanitizeHelper #sanitize ,我打算向其他用户展示吗? 例如,它是否能正确处理本网站上描述的所有案例 ?

此外,文档提到:

请注意,清理用户提供的文本并不能保证生成的标记有效(符合文档类型)或格式正确。 输出可能仍包含未转义的”,’&’字符和混淆浏览器。

处理这个问题的最佳方法是什么? 在显示之前通过Hpricot传递已清理的文本?

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。 在此模式下,不会添加到链接。

Sanitize当然比“h”帮手更好。 它实际上允许您指定的html标记,而不是转义所有内容。 是的,它确实阻止了跨站点脚本,因为它完全从混合中删除了javascript。

简而言之,两者都将完成工作。 如果您不想要明文以外的其他任何内容,请使用“h”,当您想要允许某些内容时使用清理,或者您认为人们可能会尝试输入它。 即使你不允许使用sanitize的所有标签,它也会“删除”代码,而不是像“h”那样转义代码。

至于不完整的标签:您可以在通过hpricot传递包含html的字段的模型上运行validation,但我认为这在大多数应用程序中都是过度的。

最好的行动方案取决于两件事:

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

作为一般规则,我不允许我的用户输入html – 而是让他们输入纺织品。

在rails 3.x上:

默认情况下,用户输入已清理。 除非您希望用户能够发送一些HTML,否则您无需执行任何操作。 在这种情况下,继续阅读。

此railscast处理rails 3上的XSS攻击。

在rails 2.x上:

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

 <%= h post.text %> 

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