7

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

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

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

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

4

3 回答 3

4

我遵循几个原则:

  • 存储用户输入的内容
  • 消毒陈列
  • 只发送必要的数据

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

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

这是我的方法,而且效果非常好。

于 2009-09-07T04:10:29.930 回答
4

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

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

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

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

于 2009-10-15T07:00:27.147 回答
0

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

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

于 2009-09-06T03:41:57.363 回答