2009-09-06 68 views
6

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

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

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

另外,关于这种方法的一般想法?我想到的另一个策略是渲染和消毒服务器上的HTML,并且只有在用户想编辑文章时才将Markdown拉到客户端。

回答

4

我跟着一对夫妇校长:

  • 店什么类型的用户
  • 消毒上显示
  • 只发送数据是必要

这使我的替代架构你建议:

  • st在数据库
  • 上呈现,降价/消毒,并发送HTML到浏览器矿石降价
  • 时(如果)用户选择“编辑”,通过AJAX
  • 从服务器请求原料降价,如果我有编辑过程中的“预览”视图,我尝试使用服务器来渲染它(尽管如果速度太慢,您可能需要删除此步骤)。在预览期间,消毒可能不是那么重要。

这是我的方法,它工作得很干净。

0

我还没有在Rails中使用Markdown,但我的方法是采用提交的Markdown并将其存储在数据库中,并将其存储在HTML中,并将其存储在HTML中。这样你就不会在消毒过程中丢掉任何信息,并且每次你想显示文章时都不需要重新渲染Markdown。

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

+0

当用户点击文章上的“编辑”时,通过AJAX从服务器上下载Markdown源代码? – 2009-09-06 03:52:46

+0

没错。否则,在你的Markdown - >消毒HTML - > Markdown转换中,你可能会丢失你不应该的数据。 – nfm 2009-09-06 04:01:12

+0

为什么要存储消毒的HTML?您可以轻松使用片段缓存,然后在降价变化时使缓存过期。 – 2009-09-06 11:22:22

4

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

我相信目前最好的和最具前瞻性的卫生处理是html5lib,因为它被编写为像浏览器一样进行解析,这是该领域的许多领导者的合作。然而,它有点缓慢,并不像Ruby那样。

在Ruby中我建议,要么Loofah又带动了一些HTML5消毒的东西一字不差,但使用引入nokogiri和运行得更快或Sanitize具有坚实的测试套件和很好的可配置性(不拍自己的脚,虽然)。

我刚刚发布了一个名为ActsAsSanitiled的插件,它重写了ActsAsTextiled以及使用Sanitize gem自动清理文本输出。它旨在为您提供两全其美的解决方案:在数据库中输入未触及,但该字段始终输出安全的HTML,而无需记忆模板中的任何内容。我自己不使用Markdown,但我会考虑添加BlueCloth支持。

+0

谢谢。如果你最终支持Markdown,RDiscount比BlueCloth好得多(更快,有“Smarty”支持) – 2009-10-15 18:35:01