Flask / Jinja2 - HTML 转义的最佳实践

0 投票
2 回答
2543 浏览
提问于 2025-05-01 01:01

我正在使用Flask来构建一个有数据库的网页应用。为了防止像XSS这样的站点攻击,我需要对哪些数据进行处理呢?

Jinja2这个模板引擎提供了一个叫做'|safe'的过滤器,可以帮助我们处理这些问题。对于用户可以编辑的内容,比如评论等,确实应该进行处理,以防止被恶意修改。但是,其他内容也会有风险吗?在Flask和Jinja2的环境下,应该使用哪些过滤器、扩展或者技巧呢?

暂无标签

2 个回答

1

试试这个:

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

你可能想要开启自动过滤功能,这个功能叫做 autoescape 扩展。从文档中可以找到相关信息:

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. 一些带有数据库的网络应用程序是通过像phmyadmin这样的工具进行管理的(有些人会忘记删除或保护这些工具)。在这种情况下,黑客可以在不接触应用程序本身的情况下操纵数据库中的数据。通过转义所有内容(见1.),这种最坏的情况及其损害会减少吗?

是的。这显然是一个灾难。然而,如果攻击者获得了你数据库的完全访问权限,那么他/她可能根本不需要担心XSS攻击,因为所有数据都已经在他/她的掌控之中。
不过,也有一些不那么恶意的情况可能出错,比如,管理员手动创建(或编辑)一个需要转义的用户时,可能会出现问题。

撰写回答