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

标签 python xss markdown sanitization

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

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

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

最佳答案

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

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

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

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

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

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

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

我对这个组合进行了一系列 XSS 攻击尝试,但都失败了(欢呼!);但使用良性标签,如 <strong>完美无瑕。

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

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

关于python - 在 Python 中允许 Markdown 的最佳实践,同时防止 XSS 攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266134/

相关文章:

python - python3中的安赋值

python - 上传到pypi,然后用pip下载

javascript - 如何在 Selenium 中保存 Tampermonkey 脚本?

yaml - Jekyll 中的液体嵌套 For-Loop 语法问题

python - web2py 数据库中的外键

java - 创建白名单以防范基于 Java 的应用程序中的 XSS 漏洞

asp.net - AntiXss.JavaScriptEncode 将结果用单引号括起来是否有充分的理由?

php - Form将数据存储在mysql数据库中——XSS漏洞

php - div 内的段落与 parsedown

reactjs - 如何从 React 组件安全地渲染 Markdown?