跳到内容

unsafe-markup-use (S704)

源自 flake8-bandit linter。

作用

检查传递给 markupsafe.Markup 的非字面量字符串。

为什么这不好?

[markupsafe.Markup][markupsafe.Markup] 不执行任何转义,因此传递动态内容(如 f-字符串、变量或插值字符串)可能会导致 XSS 漏洞。

相反,您应该插值 Markup 对象。

使用 lint.flake8-bandit.extend-markup-names 可以将其他对象视为 Markup

此规则最初受 flake8-markupsafe 启发,但默认情况下不为 i18n 相关调用创建任何例外。

您可以使用 lint.flake8-bandit.allowed-markup-calls 来指定例外情况。

示例

给定

from markupsafe import Markup

content = "<script>alert('Hello, world!')</script>"
html = Markup(f"<b>{content}</b>")  # XSS

建议改为

from markupsafe import Markup

content = "<script>alert('Hello, world!')</script>"
html = Markup("<b>{}</b>").format(content)  # Safe

给定

from markupsafe import Markup

lines = [
    Markup("<b>heading</b>"),
    "<script>alert('XSS attempt')</script>",
]
html = Markup("<br>".join(lines))  # XSS

建议改为

from markupsafe import Markup

lines = [
    Markup("<b>heading</b>"),
    "<script>alert('XSS attempt')</script>",
]
html = Markup("<br>").join(lines)  # Safe

Options (选项)

参考