"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" 这个词应该被提醒。我说得对吗?
根据 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:
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.
我正在通过这个 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" 这个词应该被提醒。我说得对吗?
根据 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:
Note: When inserted using the
document.write()
method,script
elements execute (typically synchronously), but when inserted usinginnerHTML
andouterHTML
attributes, they do not execute at all.