我正在调查一个 XSS 问题,该问题可以在以下简单的 html 文件中复制,该文件在加载时显示值为“1”的警报。
为什么会这样? title
字符串中有一个警报脚本标记,但令我惊讶的是浏览器会呈现它,因为 </script>
标签在字符串中?
测试.html
<html>
<head>
<script>
var title = "</script><svg/onload=alert(1)>";
</script>
</head>
<body></body>
</html>
编辑:请注意,我已将示例简化为简单的字符串分配。
最佳答案
因为 </script>
在title
里面字符串结束你的脚本,所以下面的 svg
是 HTML 的一部分。
为了防止这种情况:
不要使用内联脚本,或者
如果这样做,您在其中呈现的任何 用户源输入都不需要有
</script>
在里面。 (我可能会偏执,并允许<
和/
和script
和>
之间有空格;在 JavaScript 正则表达式中,<\s*/\s*script\s*>
带有m
标志。)
对于#2,编码实体会起作用,或者只是在内容中的斜杠前面插入一个反斜杠。如果你这样做(服务器端),那么你会:
<html>
<head>
<script>
var test = {
"id" : 12181,
"title" : "<\\/script><svg/onload=alert(1)>",
"email" : null
};
</script>
</head>
<body>
</body>
</html>
...不会提醒。 (我只添加了一个反斜杠,当然,它在字符串文字中,所以它会被转义。)
但是,如果您将不受信任的内容放在您的页面中,那么通读 owasp.org XSS (Cross Site Scripting) Prevention Cheat Sheet 将对您有好处。 .以上内容对于这一特定用途可能已经足够了,但您可能想更进一步,并且您肯定希望对包含在 HTML(而不是脚本)元素、属性中的任何内容进行 HTML 转义(它们是 HTML 文本,即使它们是 onclick
等),等等。
关于javascript - XSS:为什么在分配此 javascript 字符串时会触发警报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50842278/