Rails sanitize()方法有多好?

时间:2010-06-06 19:32:46

标签: ruby-on-rails xss sanitize

我可以对我计划向其他用户展示的用户输入文字使用ActionView::Helpers::SanitizeHelper#sanitize吗?例如,它会正确处理all cases described on this site吗?

此外,文档提到:

  

请注意消毒   用户提供的文字不保证   生成的标记有效   (符合文件类型)或   甚至结构良好。输出可能仍然存在   包含例如unescaped'<','>','&'   字符和混淆浏览器。

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

3 个答案:

答案 0 :(得分:16)

Ryan Grove的Sanitize比Rails 3 sanitize走得更远。它确保输出HTML格式正确,并具有三个内置白名单:

<强>消毒::配置:: RESTRICTED 仅允许非常简单的内联格式化标记。没有链接,图像或块元素。

<强>消毒::配置:: BASIC 允许各种标记,包括格式标记,链接和列表。不允许使用图像和表格,链接仅限于FTP,HTTP,HTTPS和mailto协议,并且所有链接都添加了一个属性以减轻SEO垃圾邮件。

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

答案 1 :(得分:11)

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

简而言之,两者都可以完成工作。当你不想要明文以外的任何东西时使用“h”,当你想要允许某些东西时使用消毒,或者你相信人们可能试图输入它。即使你禁止使用sanitize的所有标签,它也会“删除”代码,而不是像“h”那样转义代码。

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

答案 2 :(得分:4)

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

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

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

在rails 3.x上:

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

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

在轨道上2.x:

如果您不允许用户使用任何HTML,请使用h方法保护您的输出,如下所示:

<%= h post.text %>

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