【问题标题】:Sanitize Markdown in Rails?在 Rails 中清理 Markdown?
【发布时间】:2010-11-25 23:15:24
【问题描述】:

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

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

我的问题是如何清理我发送给客户的 Markdown ——我可以只使用 Rails 的 sanitize 助手吗?

另外,一般对这种方法有什么想法吗?我想到的另一个策略是在服务器上渲染和清理 HTML,只有当用户想要编辑文章时才将 Markdown 拉到客户端。

【问题讨论】:

    标签: ruby-on-rails xss markdown sanitization


    【解决方案1】:

    这里的其他答案很好,但让我提出一些关于消毒的建议。 Rails 内置的消毒剂很不错,但它不能保证格式良好,这往往是问题的一半。它也很有可能被利用,因为它不是同类最佳的,而且它有很大的安装空间可供黑客攻击。

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

    在 Ruby 中,我推荐 Loofah 逐字提升一些 html5 清理内容,但使用 Nokogiri 并且运行速度要快得多,或者 Sanitize 具有可靠的测试套件和非常好的可配置性(不要自欺欺人)脚)。

    我刚刚发布了一个名为 ActsAsSanitiled 的插件,它是对 ActsAsTextiled 的重写,用于自动清理纺织输出以及使用 Sanitize gem。它旨在为您提供两全其美的优势:输入在 DB 中保持不变,但该字段始终输出安全的 HTML,而无需记住模板中的任何内容。我自己不使用 Markdown,但我会考虑添加 BlueCloth 支持。

    【讨论】:

    • 谢谢。如果你最终支持 Markdown,RDiscount 比 BlueCloth 好得多(速度更快,支持“Smarty”)
    【解决方案2】:

    我遵循几个原则:

    • 存储用户输入的内容
    • 对展示进行消毒
    • 只发送必要的数据

    这使我想到了您建议的替代架构:

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

    这是我的方法,效果很好。

    【讨论】:

      【解决方案3】:

      我没有在 Rails 中使用 Markdown,但我的方法是获取提交的 Markdown 并将其存储在数据库中,以及它的 HTML 渲染和清理副本。这样一来,您就不会在清理过程中丢弃任何信息,也不必在每次显示文章时都重新渲染 Markdown。

      Rails 的 sanitize 助手应该可以完成这项工作。还有一些插件(例如 xss_shield 和 xss_terminate)可用于将您的输出列入白名单,以确保您不会忘记清理!

      【讨论】:

      • 而当用户点击文章上的“编辑”时,通过AJAX从服务器下载Markdown源?
      • 没错。否则,在您的 Markdown -> 净化的 HTML -> Markdown 转换中,您可能会丢失不应该丢失的数据。
      • 为什么要存储经过清理的 HTML?您可以轻松地使用片段缓存,然后在更改降价时使缓存过期。
      猜你喜欢
      • 2013-02-01
      • 2013-06-11
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多