跳到内容

suspicious-mark-safe-usage (S308)

源自 flake8-bandit linter。

作用

检查对 django.utils.safestring.mark_safe 调用的使用情况。

为什么这不好?

跨站脚本 (XSS) 漏洞允许攻击者执行任意 JavaScript。 为了防御 XSS 攻击,Django 模板假定数据是不安全的,并在渲染之前自动转义恶意字符串。

django.utils.safestring.mark_safe 将字符串标记为在 HTML 模板中安全使用,从而绕过 XSS 保护。 如果字符串的内容是动态生成的,则其使用可能是危险的,因为如果字符串未正确转义,则可能允许跨站点脚本攻击。

对于动态生成的字符串,请考虑使用 django.utils.html.format_html

预览 中,此规则还将标记对 django.utils.safestring.mark_safe 的引用。

示例

from django.utils.safestring import mark_safe


def render_username(username):
    return mark_safe(f"<i>{username}</i>")  # Dangerous if username is user-provided.

建议改为

from django.utils.html import format_html


def render_username(username):
    return django.utils.html.format_html("<i>{}</i>", username)  # username is escaped.

参考