在Rails中消除Markdown?

时间:2009-09-06 03:33:19

标签: ruby-on-rails xss markdown sanitization

用户可以在我的应用程序中编辑“文章”。每篇文章都在DB中掌握并作为Markdown发送到客户端 - 我使用Javascript将其转换为HTML客户端。

我这样做是为了当用户想要编辑文章时他可以编辑并将Markdown直接发回服务器(因为它已经在页面上)。

我的问题是如何清理我发送给客户端的Markdown - 我可以使用Rails'sanitize帮助器吗?

此外,对这种方法有何看法?我想到的另一个策略是在服务器上渲染和清理HTML,并仅在用户想要编辑文章时将Markdown拉到客户端。

3 个答案:

答案 0 :(得分:4)

我跟随几位校长:

  • 存储用户输入的内容
  • 显示清理
  • 仅发送必要的数据

这让我想到了你建议的替代架构:

  • 在数据库中存储markdown
  • on render,markdown / sanitize,并将HTML发送到浏览器
  • 当(如果)用户选择“编辑”时,通过AJAX从服务器请求原始降价
  • 如果我在编辑过程中有一个“预览”视图,我会尝试使用服务器来渲染它(尽管如果它太慢,你可能需要删除这个步骤)。但在预览期间,消毒可能并不那么重要。

这是我的方法,它的工作非常干净。

答案 1 :(得分:4)

这里的其他答案都很好,但让我就消毒问题提出一些建议。 Rails内置消毒剂是不错的,但它不能保证良好的形状,这往往是问题的一半。它也很可能被利用,因为它不是最好的,它有很大的安装足迹让黑客攻击。

我相信今天最好和最具前瞻性的清理工具是html5lib,因为它是像浏览器那样编写解析的,而且它是该领域许多领导者的合作。然而,它有点慢,而不是像Ruby那样。

在Ruby中,我建议Loofah逐字提取一些html5清理工具,但使用Nokogiri并运行得更快或Sanitize具有可靠的测试套件和非常好的可配置性(不是'尽管如此,你仍然可以在脚下射击。

我刚刚发布了一个名为ActsAsSanitiled的插件,该插件重写了ActsAsTextiled,以便使用Sanitize gem自动消毒textiled输出。它旨在为您提供两全其美的优势:数据库中的输入不受影响,但字段始终输出安全的HTML,而无需记住模板中的任何内容。我自己不使用Markdown,但我会考虑添加BlueCloth支持。

答案 2 :(得分:0)

我没有在Rails中使用Markdown,但我的方法是将提交的Markdown存储起来,并将其存储在数据库中,并将其呈现并清理它。这样,您就不会在清理过程中丢弃任何信息,而且每次要显示文章时都不必重新渲染Markdown。

Rails的消毒助手应该做的工作。还有一些插件(例如xss_shield和xss_terminate)可用于将输出列入白名单,只是为了确保您不会忘记消毒!