我今天通过外部报告的 XSS 发现 Jinja 默认情况下不会打开自动转义。 这是一个危险的默认设置,由于许多人通过他们以前对 Django 模板的了解而被介绍到 Jinja 的事实变得更加危险,这些模板自 2007 年以来默认启用了自动转义。
通过互联网看,这个事实似乎并不为人所知。 事实上,我什至发现一些书籍(Python 3 Object Oriented Programming,第 12 章,cc @buchuki)推荐在网站上使用 jinja2 并关闭自动转义。 Github 项目的随机样本还表明,大多数人不会在他们的项目中添加 autoescape=True 或 autoescape 扩展。
虽然我知道此时迁移到更安全的默认值可能会很痛苦,但文档至少应该清楚地表明默认情况下自动转义是关闭的。 也许在所有创建 jinja2.Environment 对象的示例中添加 autoescape=True 和/或在文档的早期添加一个部分。
Jinja 不仅适用于 HTML,而且适用于通用模板引擎。 我认为大多数人在 Flask 中使用 Jinja,它默认为 HTML 模板启用自动转义。 如果您将模板引擎集成到您自己的框架中,您应该阅读有关如何安全使用它的文档。
也就是说,我认为在文档中非常清楚您应该在生成 HTML 时使用 autoescape 是一个很好的建议。
我认为大多数主要框架都能做到这一点(更多的眼睛,更少的错误等),但也有许多手动集成 Jinja 的小型项目确实犯了这个错误。
坦率地说,Jinja 的文档在这个主题上真的很糟糕。 这是您打开 Jinja 文档时首先看到的内容:
Jinja2 是一种现代且对设计人员友好的 Python 模板语言,以 Django 的模板为模型。 它通过可选的沙盒模板执行环境快速、广泛使用且安全:
“仿照 Django 的模板”和“安全”可能会导致认为它具有 Django 的模板安全功能,例如自动转义。
然后是一个例子,它是 HTML。 在那之后,在功能列表中:
强大的自动 HTML 转义系统,用于 XSS 预防
其中没有提到它是可选的,默认情况下未启用。
“基本 API 使用”文档页面没有显示启用了自动转义,但也没有显示 HTML,所以我想这很好。 但是当你进入API“基础”页面时:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
template = env.get_template('mytemplate.html')
print template.render(the='variables', go='here')
第一个例子容易受到普通 XSS 的攻击。 人们感到困惑是对的。
听起来像是一个拉取请求的好候选人:)
我们现在不能在不破坏每个人的代码的情况下关闭它。 但是,我很高兴相应地更新文档。 我将作为一个 wontfix 关闭它,但可以随意打开 PR 以获取文档更新。
最有用的评论
听起来像是一个拉取请求的好候选人:)