Jinja: 默认情况下禁用自动转义是危险的默认设置

创建于 2016-01-06  ·  4评论  ·  资料来源: pallets/jinja

我今天通过外部报告的 XSS 发现 Jinja 默认情况下不会打开自动转义。 这是一个危险的默认设置,由于许多人通过他们以前对 Django 模板的了解而被介绍到 Jinja 的事实变得更加危险,这些模板自 2007 年以来默认启用了自动转义。

通过互联网看,这个事实似乎并不为人所知。 事实上,我什至发现一些书籍(Python 3 Object Oriented Programming,第 12 章,cc @buchuki)推荐在网站上使用 jinja2 并关闭自动转义。 Github 项目的随机样本还表明,大多数人不会在他们的项目中添加 autoescape=True 或 autoescape 扩展。

虽然我知道此时迁移到更安全的默认值可能会很痛苦,但文档至少应该清楚地表明默认情况下自动转义是关闭的。 也许在所有创建 jinja2.Environment 对象的示例中添加 autoescape=True 和/或在文档的早期添加一个部分。

最有用的评论

听起来像是一个拉取请求的好候选人:)

所有4条评论

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 以获取文档更新。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

pkrasimirov picture pkrasimirov  ·  14评论

chuwy picture chuwy  ·  21评论

RickGray picture RickGray  ·  6评论

ekultails picture ekultails  ·  7评论

FreddieChopin picture FreddieChopin  ·  9评论