"JavaScript sanitization doesn't save you from innerHTML" 是什么意思?

what does "JavaScript sanitization doesn't save you from innerHTML" mean?

我正在通过这个 ppt 学习 xss 预防:http://stash.github.io/empirejs-2014/#/2/23,我在这个页面上有问题。

它说 "JavaScript sanitization doesn't save you from 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>

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

<div id="test"><span>Jeremy<script>alert('boom')</script></span></div>

虽然脚本已经添加到html,但是提示框没有出来

"JavaScript sanitization doesn't save you from innerHTML" 我认为这意味着 "boom" 这个词应该被提醒。我说得对吗?

根据 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:

Note: When inserted using the document.write() method, script elements execute (typically synchronously), but when inserted using innerHTML and outerHTML attributes, they do not execute at all.