5

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

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

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

  • sanitize没有做得更好。

有什么建议吗?我不想使用Tidy来解决这个问题。提前致谢。

4

3 回答 3

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
  结尾
结尾

文档摘录:

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

如果您在不希望用户滥用 HTML 做坏事的公共场所(例如 Wiki)使用 RedCloth 进行格式化,这是一件好事。

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

于 2009-02-04T19:46:29.187 回答
2

这对我有用,并且可以防止我尝试过的每一次 XSS 攻击,包括在 pre 和代码块中的 onmouse... 处理程序:

<%= 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 版

于 2010-09-09T14:43:56.277 回答
0

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

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

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

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

于 2009-02-01T23:33:16.873 回答