我可以对我计划向其他用户展示的用户输入文字使用ActionView::Helpers::SanitizeHelper#sanitize吗?例如,它会正确处理all cases described on this site吗?
此外,文档提到:
请注意消毒 用户提供的文字不保证 生成的标记有效 (符合文件类型)或 甚至结构良好。输出可能仍然存在 包含例如unescaped'<','>','&' 字符和混淆浏览器。
处理此问题的最佳方法是什么?在显示之前通过Hpricot
传递已清理的文本?
答案 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)
最佳行动方案取决于两件事:
作为一般规则,我不允许我的用户输入html - 而是让他们输入纺织品。
在rails 3.x上:
默认情况下,用户输入已清理。除非您希望用户能够发送一些HTML,否则您无需执行任何操作。在这种情况下,继续阅读。
This railscast处理rails 3上的XSS攻击。
在轨道上2.x:
如果您不允许用户使用任何HTML,请使用h
方法保护您的输出,如下所示:
<%= h post.text %>
如果您希望用户发送一些HTML:您可以使用rails sanitize
方法或HTML::StathamSanitizer