用户可以在我的应用程序中编辑“文章”。每篇文章都在DB中掌握并作为Markdown发送到客户端 - 我使用Javascript将其转换为HTML客户端。
我这样做是为了当用户想要编辑文章时他可以编辑并将Markdown直接发回服务器(因为它已经在页面上)。
我的问题是如何清理我发送给客户端的Markdown - 我可以使用Rails'sanitize
帮助器吗?
此外,对这种方法有何看法?我想到的另一个策略是在服务器上渲染和清理HTML,并仅在用户想要编辑文章时将Markdown拉到客户端。
答案 0 :(得分:4)
我跟随几位校长:
这让我想到了你建议的替代架构:
这是我的方法,它的工作非常干净。
答案 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)可用于将输出列入白名单,只是为了确保您不会忘记消毒!