我如何纺织和消毒HTML?

Mar*_*rth 5 html escaping ruby-on-rails textile

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

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

  • textilize(html_escape("</body>Foo"))可以工作,但打破各种纺织品功能,如链接(写得像"Linkname":http://www.wheretogo.com/),因为引号将转化为&quot;纺织品,因此不再被纺织品检测到.

  • sanitize 没有做得更好.

有关那个的任何建议吗?我宁愿不使用Tidy来解决这个问题.提前致谢.

Mar*_*rth 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

摘自文档:

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

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

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