我需要让用户将Markdown内容输入我的网络应用程序,该应用程序具有Python后端。我不想不必要地限制他们的条目(例如,不允许任何 HTML,这违背了Markdown的精神和规范),但显然我需要防止跨站点脚本(XSS)攻击
我不能成为第一个有这个问题的人,但是没有看到所有关键词“python”,“Markdown”和“XSS”的任何SO问题,所以这里就是。
使用Python库处理Markdown并防止XSS攻击的最佳实践方法是什么? (支持PHP Markdown Extra语法的加分点。)
答案 0 :(得分:20)
我无法确定“最佳做法”,但通常在接受Markdown输入时有三种选择:
在Markdown内容中允许HTML(这是Markdown最初/正式工作的方式,但如果处理得天真,则会引发XSS攻击。)
只需将任何HTML视为纯文本,基本上让您的Markdown处理器逃脱用户的输入。因此输入中的<small>…</small>
不会创建小文本,而是创建文本文本“<small>…</small>
”。
丢弃Markdown中的所有HTML标记。这是非常用户敌意的,可能会根据实施情况阻塞<3
等文本。这是Stack Overflow上采用的方法。
我的问题特别关注案例#1。
鉴于此,对我来说效果很好是通过
发送用户输入我在这个组合上投掷了一堆XSS攻击,但都失败了(欢呼!);但使用像<strong>
这样的良性标签可以完美地运作。
这样,您实际上使用选项#1(根据需要),除了可能存在危险或格式错误的HTML片段,这些片段在选项#2中被视为。
(感谢Y.H Wong将我指向Markdown图书馆的方向!)
答案 1 :(得分:2)
Markdown in Python可能就是你要找的东西。它似乎也涵盖了你要求的很多extensions。
为防止XSS攻击,首选方法与其他语言完全相同 - 在渲染时转义用户输出。我刚看了documentation和source代码。 Markdown似乎可以通过一些简单的配置调整开箱即用。