我需要让用户将 Markdown 内容输入到我的网络应用程序中,该应用程序有一个 Python 后端。我不想不必要地限制他们的条目(例如,不允许 any HTML,这违背了 Markdown 的精神和规范),但显然我需要防止跨站点脚本 (XSS) 攻击.
我不是第一个遇到这个问题的人,但是没有看到任何包含所有关键字“python”、“Markdown”和“XSS”的 SO 问题,所以就这样吧。
使用 Python 库处理 Markdown 和防止 XSS 攻击的最佳实践方法是什么? (支持 PHP Markdown Extra 语法的奖励积分。)
最佳答案
我无法确定“最佳实践”,但通常在接受 Markdown 输入时您有三个选择:
在 Markdown 内容中允许 HTML(这是 Markdown 最初/官方的工作方式,但如果处理得天真,这可能会引发 XSS 攻击)。
只需将任何 HTML 视为纯文本,本质上就是让您的 Markdown 处理器逃避用户的输入。因此
<small>…</small>
in input 不会创建小文本,而是文字文本“<small>…</small>
”。扔掉 Markdown 中的所有 HTML 标签。这对用户非常不利,可能会阻塞
<3
之类的文本取决于实现。这是 Stack Overflow 上采用的方法。
我的问题是关于案例 #1,特别是。
鉴于此,对我来说效果很好是通过
发送用户输入- Markdown for Python ,可选supports Extra syntax然后通过
- html5lib的 sanitizer 。
我对这个组合进行了一系列 XSS 攻击尝试,但都失败了(欢呼!);但使用良性标签,如 <strong>
完美无瑕。
这样,您实际上是使用选项 #1(根据需要),除了潜在危险或格式错误的 HTML 片段,它们被视为选项 #2。
(感谢 Y.H Wong 为我指明了那个 Markdown 库的方向!)
关于python - 在 Python 中允许 Markdown 的最佳实践,同时防止 XSS 攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266134/