防止django中的xss孔

时间:2013-03-02 05:34:37

标签: html django security django-templates xss

在Django文档中它说:

  

Django模板特别转义特定字符   对HTML有危险。虽然这可以保护用户免受大多数恶   输入,它并非完全万无一失。例如,它不会保护   以下内容:

 <style class={{ var }}>...</style>
  

如果var设置为'class1 onmouseover = javascript:func()',则可以   导致未经授权的JavaScript执行,具体取决于如何执行   浏览器呈现不完美的HTML。

我该如何防止这种情况?

2 个答案:

答案 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出现在带有原始字符的浏览器。