在Django文档中它说:
Django模板特别转义特定字符 对HTML有危险。虽然这可以保护用户免受大多数恶 输入,它并非完全万无一失。例如,它不会保护 以下内容:
<style class={{ var }}>...</style>
如果var设置为'class1 onmouseover = javascript:func()',则可以 导致未经授权的JavaScript执行,具体取决于如何执行 浏览器呈现不完美的HTML。
我该如何防止这种情况?
答案 0 :(得分:1)
您可以做的一件事是不允许变量类。你可以使用像
这样的东西<style class={% if class_foo %}foo{% elif class_bar %}bar{% else %}baz{% endif %}>...</style>
还有一些过滤器可用于阻止其他地方使用xss:https://docs.djangoproject.com/en/dev/ref/templates/builtins/#std:templatefilter-escape
答案 1 :(得分:1)
我对Django并不是特别熟悉,但在我看来,他们想要指出的错误是属性值周围没有引号,这意味着示例值中的空格会导致字符串的其余部分(onmouseover=...
)被解释为单独的属性。相反,你应该这样写引号:
<style class="{{ var }}">...</style>
如果我理解正确,这将是安全的,因为所有可能干扰引用的字符都被转义。您可能想要验证该解释;例如,编写<span title="{{ var }}">foo</span>
,运行模板并将foo
设置为<>"'&
,然后确保它们在HTML中正确转义并且title
出现在带有原始字符的浏览器。