当前位置: 代码迷 >> JavaScript >> “JavaScript清理无法从innerHTML中拯救你”是什么意思?
  详细解决方案

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

热度:74   发布时间:2023-06-05 14:17:27.0

我正在通过这个ppt学习xss预防: : ,我在这个页面上有一个问题。

它说“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> 

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

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

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

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

根据 , 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节末尾附近, :

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

  相关解决方案