"JavaScript清理无法从innerHTML中拯救你"是什么意思?

Kre*_*eja 11 html javascript 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>
Run Code Online (Sandbox Code Playgroud)

当我在浏览器(chrome)上打开这个html时,我只看到了名字"Jeremy",通过使用F12,我看到了

<div id="test"><span>Jeremy<script>alert('boom')</script></span></div>
Run Code Online (Sandbox Code Playgroud)

虽然脚本已添加到html中,但警报框没有出现.

"JavaScript清理不会使你免于innerHTML"我认为这意味着应该提醒"繁荣"这个词.我对吗?

Bol*_*ock 7

根据MDN,innerHTML防止<script>元素直接执行1,这意味着您的测试不应该提醒任何事情.但是,它不会阻止事件处理程序稍后触发,这使得以下操作成为可能:

var name = "\x3Cimg src=x onerror=alert(1)\x3E";
document.getElementById('test').innerHTML = name; // shows the alert
Run Code Online (Sandbox Code Playgroud)
<div id="test"></div>
Run Code Online (Sandbox Code Playgroud)

(脚本改编自文章中的示例,带有转义序列,但我不确定它们是否与<script>元素相关)

由于<script>元素在插入时不会执行innerHTML,因此我不清楚幻灯片试图通过该示例传达的内容.


1这实际上是在HTML5中指定的.MDN链接到2008年草案; 在当前的W3C建议书中,它位于4.11.1节末尾附近,就在4.11.1.1节开始之前:

注意:使用该document.write()方法插入时,script元素执行(通常是同步),但使用innerHTMLouterHTML属性插入时,它们根本不执行.