CodeQL 文档

Jinja2 模板使用 autoescape=False

ID: py/jinja2/autoescape-false
Kind: problem
Security severity: 6.1
Severity: error
Precision: medium
Tags:
   - security
   - external/cwe/cwe-079
Query suites:
   - python-security-extended.qls
   - python-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

如果未对不受信任的输入进行转义,则可能会发生跨站点脚本 (XSS) 攻击。这适用于模板和代码。如果环境将 autoescape 设置为 False,则 jinja2 模板可能容易受到 XSS 攻击。不幸的是,jinja2 默认将 autoescape 设置为 False。在创建 Environment 对象时,将 autoescape 显式设置为 True 将可以防止这种情况。

建议

避免将 jinja2 autoescape 设置为 False。Jinja2 提供了函数 select_autoescape 来确保选择正确的自动转义。例如,它可以在创建环境时使用 Environment(autoescape=select_autoescape(['html', 'xml'])

示例

以下示例是一个最小的 Flask 应用程序,它展示了安全和不安全的方式将给定的姓名渲染回页面。第一个视图是不安全的,因为 first_name 未转义,导致页面容易受到跨站点脚本攻击。第二个视图是安全的,因为 first_name 被转义,所以它不容易受到跨站点脚本攻击。

from flask import Flask, request, make_response, escape
from jinja2 import Environment, select_autoescape, FileSystemLoader

app = Flask(__name__)
loader = FileSystemLoader( searchpath="templates/" )

unsafe_env = Environment(loader=loader)
safe1_env = Environment(loader=loader, autoescape=True)
safe2_env = Environment(loader=loader, autoescape=select_autoescape())

def render_response_from_env(env):
    name = request.args.get('name', '')
    template = env.get_template('template.html')
    return make_response(template.render(name=name))

@app.route('/unsafe')
def unsafe():
    return render_response_from_env(unsafe_env)

@app.route('/safe1')
def safe1():
    return render_response_from_env(safe1_env)

@app.route('/safe2')
def safe2():
    return render_response_from_env(safe2_env)

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私