在Python中允许Markdown,同时防止XSS攻击的最佳做法?

Ala*_* H. 26 python xss markdown sanitization

我需要让用户将Markdown内容输入我的Web应用程序,该应用程序具有Python后端.我不想不必要地限制他们的条目(例如,不允许任何 HTML,这违背了Markdown的精神和规范),但显然我需要防止跨站点脚本(XSS)攻击.

我不能成为第一个有这个问题的人,但是没有看到所有关键词"python","Markdown"和"XSS"的任何SO问题,所以这里就是这样.

使用Python库处理Markdown并防止XSS攻击的最佳实践方法是什么?(支持PHP Markdown Extra语法的奖励点.)

Ala*_* H. 21

我无法确定"最佳做法",但通常在接受Markdown输入时有三种选择:

  1. 在Markdown内容中允许HTML(这是Markdown最初/正式工作的方式,但如果处理得天真,则会引发XSS攻击).

  2. 只需将任何HTML视为纯文本,实际上让您的Markdown处理器逃脱用户的输入.因此<small>…</small>在输入中不会创建小文本,而是创建文字文本" <small>…</small>".

  3. 丢弃Markdown中的所有HTML标记.这是非常用户敌对的,可能会<3根据实施情况阻塞文本.这是Stack Overflow上采用的方法.

我的问题特别关注案例#1.

鉴于此,对我来说效果很好的是通过发送用户输入

  1. Markdown for Python,可选择支持Extra语法 ,然后通过
  2. html5lib的消毒剂.

我在这个组合上投了一堆XSS攻击尝试,都失败了(欢呼!); 但使用良好的标签像<strong>完美无瑕地工作.

这样,您实际上使用选项#1(根据需要),除了可能存在危险或格式错误的HTML片段,这些片段在选项#2中处理.

(感谢YH Wong将我指向Markdown图书馆的方向!)

  • 将Markdown与Python和[Bleach](https://github.com/jsocol/bleach)(基于html5lib)结合使用,使事情变得更加轻松。 (2认同)