我使用Flask在后端使用数据库构建Web应用程序。我需要逃避哪些数据以确保没有像XSS那样的网站操作?
Jinja2模板引擎提供了' | safe'过滤以确保这样的转义。有了评论和其他东西,用户可以编辑(并可能操纵),它在逻辑上可以逃脱,但其他内容也是易受攻击的吗?应该使用哪些过滤器,扩展或技巧,尤其是在Flask和Jinja2的上下文中?
答案 0 :(得分:2)
您可能希望使用autoescape
扩展名启用自动过滤功能。来自the docs:
env = Environment(autoescape=guess_autoescape,
loader=PackageLoader('mypackage'),
extensions=['jinja2.ext.autoescape'])
这有一些性能开销,但经验告诉我们非常很容易忘记逃避那个变量,这给了我们一个XSS(甚至大型网站,如eBay,已经成为受害者了。)
这也回答了你的问题,“应该逃脱什么?”。在较大的应用程序中,通常不容易确定哪些变量可以直接(或间接)受用户影响。此外,转义不仅仅是一项安全功能,因为This is a <test> & a string
和<
等固定字符串也需要转义。
您仍然可以使用&
过滤器打印HTML,即。 safe
。
编辑:回复您的问题:
- 即使是用户串或类似的东西,是否会过度杀戮?
醇>
如果我的用户名是my_string|safe
怎么办?或者如果是<script>alert('boo!')</script>
?我想你可以通过在注册期间禁止某些字符来解决这个问题,但是你确定没有办法绕过这个?如果我在用户名中填写&fancy&
该怎么办?或者,如果你能以其他方式绕过支票怎么办?如果(将来)你想允许这样的角色,或将来你用允许这些角色的外部登录服务(facebook,google,github)连接怎么办?
是的,存在(小)性能开销,但它更安全,并且更容易编程。 Python和&amp;等环境的全部要点Jinja将以牺牲性能为代价来优化程序员的工作效率:)
- 一些带有数据库的Web应用程序使用phmyadmin等工具管理(有些人忘记删除或保护)。在这种情况下,黑客可以在不触及应用程序本身的情况下操纵数据库内的数据。通过逃避一切(参见1.)
,这种最坏的情况及其损害会减少吗? 醇>
是。这显然是一场灾难。但是,如果攻击者获得对您数据库的完全访问权限,那么他/她可能不需要为XSS攻击而烦恼,因为所有数据都已经在他/她的指尖。 但是,出现问题的方式可能会出现问题,例如,管理员手动创建(或编辑)具有需要转义字符的用户。
答案 1 :(得分:1)
试试这个:
{% extends "template.html" %}
{% block body %}
{{ data|safe }}
{% endblock %}