【问题标题】:Best practice for allowing Markdown in Python, while preventing XSS attacks?在 Python 中允许 Markdown 的最佳实践,同时防止 XSS 攻击?
【发布时间】:2011-07-13 01:48:11
【问题描述】:

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

我不是第一个遇到这个问题的人,但是没有看到任何包含所有关键字“python”、“Markdown”和“XSS”的 SO 问题,所以就这样吧。

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

【问题讨论】:

  • “Python 后端”?这到底是什么意思?如果你支持markdown,所有的HTML都可以用<pre>引用。
  • 您可以在ha.ckers.org/xss.html 处针对 XSS 备忘单测试您的应用程序
  • @S.Lott:这意味着服务器端脚本是用 Python 编写的。 <pre> 不完全是解决方案。 Markdown 是我们在 SO 上用来编写 cmets 和问题的工具……它唯一会导致 <pre> 块的情况是您专门请求代码块(通过缩进)。
  • @S.Lott 不用担心,我是问那些已经了解 Markdown 工作原理以及后端是什么的人。
  • @S.Lott 我拒绝了。我希望这个问题相当笼统,而不是局限于例如Django、App Engine 或 Zope 等(我假设您不希望我定义“服务器端”或“Python 后端”,而是澄清我可能正在使用哪个框架。毕竟,如果你需要那些定义的,你肯定不会知道答案。)

标签: python xss markdown sanitization


【解决方案1】:

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

  1. 在 Markdown 内容中允许 HTML(这是 Markdown 最初/官方的工作方式,但如果处理不当,可能会引发 XSS 攻击)。

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

  3. 丢弃 Markdown 中的所有 HTML 标签。这对用户非常不利,并且可能会阻塞 <3 之类的文本,具体取决于实现。这是 Stack Overflow 上采用的方法。

我的问题是关于案例 #1,特别是。

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

发送用户输入
  1. Markdown for Python,其中可选supports Extra syntax,然后通过
  2. html5lib 的消毒剂

我对这个组合进行了一系列 XSS 攻击尝试,但都失败了(欢呼!);但是使用像<strong> 这样的良性标签可以完美地工作。

这样,您实际上是使用选项 #1(根据需要),除了潜在危险或格式错误的 HTML sn-ps,它们被视为选项 #2。

(感谢 Y.H Wong 为我指明了那个 Markdown 库的方向!)

【讨论】:

  • 将 Markdown 与 Python 和 Bleach(基于 html5lib)结合起来,让事情变得更简单。
  • 您有两个选择,#1 或 #2 或 #3 :D
  • 迦勒:哈哈。接得好。固定。
【解决方案2】:

Markdown in Python 可能是您正在寻找的。它似乎也涵盖了您请求的很多extensions

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

【讨论】:

  • 这是不对的……转义输出会在页面上显示标签。
  • "Markdown in Python" 确实看起来像我想要的。谢谢你,非常感谢。
  • “转义输出将标签显示在页面上”。还有什么可能发生?使用<PRE> 标记转义HTML 都会使HTML 变成简单的格式化文本,从而阻止任何脚本编写。或者你允许 XSS。 “允许” HTML 并神奇地阻止 XSS 几乎没有中间立场。
  • S.Lott,你愤怒的无知令人困惑。 (1):我可能会选择something like html5lib,它正是这样做的。这叫消毒。你从未见过例如一个允许 HTML cmets 但只有某些标签和很少或没有属性的博客?这当然是可能的。 (2): <pre> 标签实际上并没有逃避任何东西或防止 XSS 攻击,你知道的,对吧?将</pre><script>…</script> 视为输入:pwned, 正如他们所说。
  • 不要喊孩子。通过转义输出,我的意思是只有直接插入的 HTML 代码(markdown 标记中的 html)会被转义。应该是 HTML(markdown 的目标)的实际输出仍然是 HTML。试试看,你会看到的。
猜你喜欢
  • 2021-01-30
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多