什么" JavaScript清理不会使你免于innerHTML"是什么意思?

时间:2015-07-31 02:46:44

标签: javascript html xss

我通过此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;
&#13;
&#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;应该提醒。我是对的吗?

1 个答案:

答案 0 :(得分:7)

根据MDNinnerHTML阻止<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个元素执行(通常是同步的),但使用innerHTMLouterHTML插入时属性,它们根本不执行。