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

30 投票
2 回答
6364 浏览
提问于 2025-04-16 13:28

我想让用户在我的网页应用里输入Markdown内容,而我的后端是用Python写的。我不想过于限制他们的输入(比如完全不允许任何HTML,这样就违背了Markdown的初衷和规范),但我当然需要防止跨站脚本攻击(XSS)。

我想我不是第一个遇到这个问题的人,但我在StackOverflow上没有找到同时包含“python”、“Markdown”和“XSS”的问题,所以我就来问了。

有没有什么好的方法可以用Python库来处理Markdown,同时防止XSS攻击?(如果能支持PHP Markdown Extra语法,那就更好了。)

2 个回答

2

Python中的Markdown可能正是你需要的东西。它似乎也涵盖了你请求的很多扩展功能

为了防止XSS攻击,最好的方法和其他编程语言一样,就是在用户输出被显示的时候进行转义。我刚刚看了一下文档源代码。Markdown似乎可以通过一些简单的配置调整,直接做到这一点。

21

我没法确定什么是“最佳实践”,但一般来说,当你要接受Markdown输入时,有三种选择:

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

  2. 把任何HTML当作普通文本处理,基本上就是让你的Markdown处理器忽略用户的输入。因此,输入中的<small>…</small>不会变成小字,而是会显示为字面上的“<small>…</small>”。

  3. 直接去掉Markdown中的所有HTML标签。这种做法对用户不太友好,可能会对像<3这样的文本处理不当。Stack Overflow就是采用这种方法。

我想讨论的是第一种情况,具体来说。

基于此,对我来说有效的方法是将用户输入通过

  1. Python的Markdown库,这个库可以选择性地支持额外的语法,然后再通过
  2. html5lib的清理工具

我对这个组合进行了很多XSS攻击尝试,结果都失败了(太好了!);而使用像<strong>这样的无害标签则完全没问题。

这样一来,实际上你是选择了第一种选项(正是想要的),除了那些可能危险或格式不正确的HTML片段,这些会按照第二种选项处理。

(感谢Y.H Wong指引我找到这个Markdown库!)

撰写回答