我通过此ppt学习xss预防:http://stash.github.io/empirejs-2014/#/2/23,我在此页面上有一个问题。
它说" JavaScript清理并没有让你免于innerHTML",我尝试了这样一个简单的测试:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>
<div id="test"></div>
<script>
var userName = "Jeremy\x3Cscript\x3Ealert('boom')\x3C/script\x3E";
document.getElementById('test').innerHTML = "<span>"+userName+"</span>";
</script>
</body>
</html>
&#13;
当我在浏览器(chrome)上打开这个html时,我只看到了名字&#34; Jeremy&#34;,通过使用F12,我看到了
<div id="test"><span>Jeremy<script>alert('boom')</script></span></div>
虽然脚本已添加到html中,但警告框并未出现。
&#34; JavaScript清理并不能保护您免受innerHTML&#34;我认为这意味着&#34;繁荣&#34;应该提醒。我是对的吗?
答案 0 :(得分:7)
根据MDN,innerHTML
阻止<script>
元素直接执行 1 ,这意味着您的测试不应该提醒任何内容。但是,它不会阻止事件处理程序稍后触发,这使得以下内容成为可能:
var name = "\x3Cimg src=x onerror=alert(1)\x3E";
document.getElementById('test').innerHTML = name; // shows the alert
<div id="test"></div>
(脚本改编自文章中的示例,带有转义序列,但我不确定它们是否与<script>
元素相关)
由于<script>
元素在通过innerHTML
插入时从不执行,因此我不清楚该幻灯片试图通过该示例传达的内容。
1 这实际上是在HTML5中指定的。 MDN链接到2008年草案;在当前的W3C建议书中,它位于4.11.1节的末尾附近,just before section 4.11.1.1 begins:
注意:使用
document.write()
方法插入时,script
个元素执行(通常是同步的),但使用innerHTML
和outerHTML
插入时属性,它们根本不执行。