Javascript 数据内的 XSS

XSS Within Javascript Data

在开发 Web 应用程序时,我发现 bootstrapping 您的应用程序时,初始数据中实际上可能存在危险字符:

<body>
    <script>
        var users = [
            { id: 1, bio: 'My beautiful bio' },
            { id: 2, bio: '</script><script>alert("hello")</script>' }
        ]
    </script>
</body>

这对我来说是个新闻,因为我一直认为,由于 XSS 攻击存在于 JavaScript 中,它会被识别为只是一个字符串,并且在您真正去渲染它之前不会有危险DOM,但果然,上面的代码是一个有效的攻击。

如果我理解正确,bootstrap 一个带有一些入门数据的应用程序,你应该在服务器端将 all/any 个字符翻译成它们受尊重的 HTML 个实体,然后将它们翻译回原来的字符,以防止在渲染到 DOM?为什么解析器不将其视为字符串,因为它用引号括起来并存在于脚本中?

JSFiddle:http://jsfiddle.net/5hgk7eux/

您发布的是两个 <script> 块。第一个将因语法错误而失败,第二个将 运行 alert()。这是第一个脚本:

<script>
    var users = [
        { id: 1, bio: 'My beautiful bio' },
        { id: 2, bio: '</script>

这是第二个:

<script>alert("hello")</script>

字符串 </script> 的出现结束了脚本块,无论它出现在 JavaScript 上下文中。

关于您的更广泛的问题,是的,在将用户提供的文本包含在 JavaScript 上下文中时,您必须对其进行清理。最简单的方法是使用 JSON 编码器。 JSON 编码器通常在 JavaScript 字符串常量中必须用 \ 引用的字符列表中包含 /。该功能会保护您,因为 </script> 会呈现为 <\/script>.

任何 JSON 表达式都是有效的 JavaScript 对象初始化字符串(或者,如果 JSON 编码器被要求对原始字符串进行编码,则为有效的字符串常量)。

最后,始终应用 HTML 编码绝对 不是 如果您希望您的应用程序正常工作,您应该做的。必须应用于用户提供的文本的净化类型取决于它被馈送到的解析器的语法。您对 SQL、服务器端日志文件、HTML 和 JavaScript.

应用不同的清理