我如何纺织和消毒HTML?

时间:2009-02-01 22:30:22

标签: html ruby-on-rails escaping textile

现在我遇到了一些愚蠢的情况。我希望用户能够使用纺织品,但他们不应该在他们的条目周围乱用我的有效HTML。所以我必须以某种方式逃避HTML。

  • html_escape(textilize("</body>Foo"))会破坏纺织品

  • textilize(html_escape("</body>Foo"))会起作用,但会破坏各种纺织品功能,例如链接(写成"Linkname":http://www.wheretogo.com/),因为引号会转换为&quot;,因此不再被纺织品检测到

  • sanitize做得不好。

对此有任何建议吗?我不想使用 Tidy 来解决这个问题。 提前谢谢。

3 个答案:

答案 0 :(得分:7)

对于遇到同样问题的人:如果你使用的是 RedCloth gem ,你可以定义自己的方法(在你的一个助手中)。

def safe_textilize( s )
  if s && s.respond_to?(:to_s)
    doc = RedCloth.new( s.to_s )
    doc.filter_html = true
    doc.to_html
  end
end

摘自文档:

  

用于设置安全限制的访问者。

     

如果您使用RedCloth进行格式化,这是一件好事   公共场所(例如Wiki),您不希望用户滥用HTML来处理不良内容。

     

如果设置了filter_html,则不是由Textile处理器创建的HTML   逃过一劫。或者,如果设置了sanitize_html,则HTML可以通过Textile   处理器,但未经授权的标签和属性将被删除。

答案 1 :(得分:2)

这适用于我并且防范我尝试过的所有XSS攻击,包括onmouse ...处理程序在pre和代码块中:

<%= RedCloth.new( sanitize( @comment.body ), [:filter_html, :filter_styles, :filter_classes, :filter_ids] ).to_html -%>

初始清理消除了许多潜在的XSS攻击,包括鼠标悬停。

据我所知:filter_html除了代码和pre之外还逃脱了大多数html标签。其他过滤器是因为我不希望用户应用任何类,ID和样式。

我刚用您的示例

测试了我的评论页面
"</body>Foo" 

它完全删除了流氓身体标签

我使用的是Redcloth版本4.2.3和Rails版本2.3.5

答案 2 :(得分:0)

看起来纺织品根本不支持你想要的东西。

您确实只想允许精心控制的HTML子集,但纺织品旨在允许任意HTML。在这种情况下,我认为你根本不能使用纺织品(除非它支持这种限制)。

你需要的可能是一种特殊的“限制”版本的纺织品,它只允许“安全”标记(然而定义它可能已经很棘手)。但是,我不知道是否存在。

您可以查看BBCode,它允许限制可能的标记。