【问题标题】:Flask / Jinja2 - best pratice of HTML escapingFlask / Jinja2 - HTML 转义的最佳实践
【发布时间】:2014-11-01 18:17:10
【问题描述】:

我正在使用 Flask 在后端构建一个带有数据库的 Web 应用程序。我需要转义哪些数据以确保没有像 XSS 这样的站点操作?

Jinja2 模板引擎提供了 '|safe' 过滤器来确保这种转义。使用 cmets 和其他用户可以编辑(并可能操纵)的东西,似乎在逻辑上可以逃脱,但其他内容也容易受到攻击吗?应该使用哪些过滤器、扩展或技巧,尤其是在 Flask 和 Jinja2 的上下文中?

【问题讨论】:

  • 注意:安全过滤器用于指示变量不需要转义。

标签: python html flask escaping jinja2


【解决方案1】:

您可能希望使用 autoescape 扩展名启用自动过滤。来自the docs

env = Environment(autoescape=guess_autoescape,
                  loader=PackageLoader('mypackage'),
                  extensions=['jinja2.ext.autoescape'])

这有一些性能开销,但经验告诉我们非常很容易忘记转义一个变量,这会给我们带来 XSS(即使是大型网站,比如eBay,已成为此事件的受害者)。

这也回答了您的问题,“应该转义什么?”。在较大的应用程序中,通常不容易确定哪些变量可以直接(或间接!)受用户影响。此外,转义不仅仅是一种安全功能,因为This is a <test> & a string 等固定字符串也需要对<& 进行转义。

您仍然可以使用safe 过滤器打印 HTML,即。 my_string|safe.

编辑:回复您的问题:

  1. 转义用户字符串或类似的东西会不会有点矫枉过正?

如果我的用户名是 <script>alert('boo!')</script> 怎么办?或者如果是&fancy&?我想您可以通过在注册期间禁止某些字符来解决这个问题,但是您确定没有办法绕过这个问题吗?如果我在我的用户名中填写\x26 怎么办?或者,如果您可以通过其他方式绕过检查怎么办?如果(将来)您想要允许此类字符,或者将来您连接允许此类字符的外部登录服务(facebook、google、github)怎么办?

是的,有(很小的)性能开销,但它更安全,也更容易编程。像 Python 和 Jinja 这样的环境的全部意义在于以牺牲性能为代价来优化程序员的生产力:)

  1. 一些带有数据库的 Web 应用程序使用 phmyadmin 之类的工具进行管理(有些人忘记删除或保护这些工具)。在这种情况下,黑客可以在不接触应用程序本身的情况下操纵数据库内的数据。逃避一切是否会减少这种最坏的情况及其损害(参见 1.)

是的。这显然是一场灾难。但是,如果攻击者获得了对您数据库的完全访问权限,那么他/她可能不需要为 XSS 攻击而烦恼,因为所有数据都已经触手可及。
但是,出现问题的恶意程度较低,例如,管理员手动创建(或编辑)具有需要转义字符的用户。

【讨论】:

  • 1.甚至逃避用户字符串或类似的东西会不会过大? 2. 一些带有数据库的 Web 应用程序使用 phmyadmin 之类的工具进行管理(有些人忘记删除或保护这些工具)。在这种情况下,黑客可以在不接触应用程序本身的情况下操纵数据库内的数据。逃避一切是否会减少这种最坏的情况及其损害(参见 1.)
  • @user3147268 我已经编辑了我的答案来回答你的问题,因为答案相当长:)
  • 感谢您的详细回答。简而言之 - 尽你所能对吗?
  • @user3147268 是的,这可以用几句话概括我的建议 :)
  • Flask 默认开启自动转义。
【解决方案2】:

试试这个:

{% extends "template.html" %}
{% block body %}
{{ data|safe }}
{% endblock %}

【讨论】:

  • 我已经在文档中看到了这个。但是当我从数据库中输出任何数据时,我是否每次都需要它?通常每个程序员都应该检查输入,但只是为了确定。
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 2015-05-25
  • 2014-10-01
  • 2014-10-24
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多