innerHTML插入script代码为什么不会被XSS

  1. HTML5不会执行由innerHTML插入的<script>标签内的代码。
  • 测试代码
window.onload = function () {
    let str = "<script>alert(1)</script>"
    document.getElementById('div').innerHTML = str
}

image

  1. innerHTML插入内容不确定的字符串时仍然存在安全风险。
  • 测试代码
<!DOCTYPE html>
<meta charset="utf-8">
<head>
    <title>
        innerHTML测试
    </title>
    <script>
        window.onload = function () {
            document.cookie = 'sessionid=5f74be5f82044e6a8d06b415bf96fdb4;path=/'
        }
        function test() {
            // 弹出消息
            document.getElementById('div').innerHTML = `<img src='x' onerror='alert(1)'>`;
            // 读取cookie
            // document.getElementById('div').innerHTML = `<img src='x' onerror='alert(document.cookie)'>`;
            // 跳转
            // document.getElementById('div').innerHTML = `<img src='x' onerror='document.location.href = "http://www.baidu.com"'>`;
        }
    </script>
</head>
<body>
    <button onclick="test()">点我购买</button>
    <div id='div'>hello</div>
</body>
</html>
  • XSS效果

a. 弹出消息
image

b. 跳转
image

c. 读取cookie
image

  1. 插入纯文本时建议不要使用innerHTML,用textContent取而代之。
document.getElementById('div').textContent = `<img src='x' onerror='document.location.href = "http://www.baidu.com"'>`;

可以看到,textContent是将代码原样显示出来而不是当作脚本执行
image

扫描关注公众号
image

posted @ 2024-11-26 20:42  chyun2011  阅读(7)  评论(0编辑  收藏  举报