在开发 Web 应用程序时,我发现在引导您的应用程序时,初始数据中实际上可能存在危险字符:
<body>
<script>
var users = [
{ id: 1, bio: 'My beautiful bio' },
{ id: 2, bio: '</script><script>alert("hello")</script>' }
]
</script>
</body>
这对我来说是个新闻,因为我一直认为,由于 XSS 攻击存在于 JavaScript 中,它会被识别为只是一个字符串,并且在您实际去 DOM 中渲染它之前不会有危险,但确实如此,上面的代码是一种有效的攻击。</p>
如果我理解正确,那么要使用一些入门数据引导应用程序,您应该在服务器端将所有/任何字符翻译成它们受尊重的 HTML 实体,然后将它们翻译回它们的原始字符以防止在渲染到 DOM 时双重转义?为什么解析器不将其视为字符串,因为它用引号括起来并存在于脚本中?
JSFiddle:http://jsfiddle.net/5hgk7eux/
最佳答案
您发布的是两个 <script>
block 。第一个将因语法错误而失败,第二个将运行 alert()
.这是第一个脚本:
<script>
var users = [
{ id: 1, bio: 'My beautiful bio' },
{ id: 2, bio: '</script>
这是第二个:
<script>alert("hello")</script>
字符串的出现</script>
结束一个脚本 block ,不管它出现在什么 JavaScript 上下文中。
关于更广泛的问题,是的,在将用户提供的文本包含在 JavaScript 上下文中时,您必须对其进行清理。最简单的方法是使用 JSON 编码器。 JSON编码器一般包括/
在必须用 \
引起来的字符列表中在 JavaScript 字符串常量中。该功能会保护您,因为 </script>
将呈现为 <\/script>
.
任何 JSON 表达式都是有效的 JavaScript 对象初始化字符串(或者,如果要求 JSON 编码器对原始字符串进行编码,则为有效的字符串常量)。
最后,如果您希望您的应用程序正常工作,总是应用 HTML 编码绝对不是您应该做的。必须应用于用户提供的文本的净化类型取决于它被馈送到的解析器的语法。您对 SQL、服务器端日志文件、HTML 和 JavaScript 应用不同的清理。
关于javascript - Javascript 数据中的 XSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28326555/