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

时间:2011-03-10 21:29:03

标签: python xss markdown sanitization

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

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

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

2 个答案:

答案 0 :(得分:20)

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

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

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

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

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

    鉴于此,对我来说效果很好是通过

    发送用户输入
    1. Markdown for Python ,可选supports Extra syntax然后通过
    2. html5lib的消毒剂
    3. 我在这个组合上投掷了一堆XSS攻击,但都失败了(欢呼!);但使用像<strong>这样的良性标签可以完美地运作。

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

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

答案 1 :(得分:2)

Markdown in Python可能就是你要找的东西。它似乎也涵盖了你要求的很多extensions

为防止XSS攻击,首选方法与其他语言完全相同 - 在渲染时转义用户输出。我刚看了documentationsource代码。 Markdown似乎可以通过一些简单的配置调整开箱即用。