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