Django 中不安全的用户输入文本有哪些危险?

What are the dangers of unsafe user-inputted text in Django?

我的一位同事最近向开发中的页面介绍了一个漏洞。这允许用户插入 30 个字符的未转义代码,这些代码将使用 |safe 过滤器执行。因此 html 不安全字符(<>'"&)可以自由地插入到页面模板中。

该漏洞存在于表单的错误消息中,因此它不允许黑客编辑显示给其他用户(只能是他自己)的内容。我想用一个可怕的例子向我的同事展示漏洞的危险。此外,我个人对专业层面的这种漏洞的绝对最坏情况很感兴趣。我知道在 PHP(可能是旧版本)中这将允许用户回显服务器文件的内容。这个漏洞是否允许我类似地显示设置文件中的内容? Django 开发者(祝福他们)明智地选择 { 即使使用 |safe 过滤器也不会被转义。所以它不能用来显示上下文变量。

我自己想到的最糟糕的事情是插入(和执行)位于网络上任何地方的任何 JS 文件,如果它会影响其他用户,那将是可怕的,但它不会'如果只为黑客自己执行js文件,似乎也没有那么糟糕。

如果错误消息可以通过GET参数触发,那么你可以简单地制作一个link,当受害者点击它时执行JS。

即:http://example.com?email=<script>alert(1)</script>

否则,(我能想到的)利用此漏洞的唯一其他方法是在另一个页面上使用表单(假设允许此请求)。

<form name="xssForm" action="http://example.com" method="POST">
    <input type="hidden" name="email" value="<script>alert(1)</script>" />
</form>
<script>
    document.xssForm.submit();
</script>

第二个选项是 CSRF 漏洞,您的网站上可能存在也可能不存在。

假设这个漏洞只影响攻击者自己,我认为可以说这个实现的风险很小(如果有的话),但所有输出都应该作为标准进行转义。无需夸大特定漏洞的风险。