前端安全审计时如何防止XSS攻击?
最近在做项目的安全审计,发现有个地方可能有XSS漏洞。用户输入的内容直接插到页面里了,虽然用了innerText,但不确定是不是真的安全。
比如下面这段代码,把URL参数里的值直接显示出来,这样写会不会被注入脚本?该怎么改才安全?
<div id="user-content"></div>
<script>
const urlParams = new URLSearchParams(window.location.search);
const msg = urlParams.get('msg') || '默认消息';
document.getElementById('user-content').innerText = msg;
</script>
或者
这样的payload,浏览器也只会把它显示成字符串,不会执行。官方文档里说innerText会自动对内容进行HTML转义,跟textContent的区别在于innerText会处理CSS样式和隐藏元素,但安全效果是一样的。
不过别高兴太早,你这个写法在当前场景是安全的,但安全审计不能只看一处。URL参数这玩意儿来源不可控,虽然显示层面用了innerText,但得注意几点:
第一,如果其他地方用到这个msg,比如拼接到innerHTML里、放到eval里执行、或者写入到HTML属性值(比如
里的href),那分分钟跪给你看。第二,URL参数本身也可以用来做钓鱼,比如参数值里带
javascript:alert(1)之类的,要是你把它直接塞到a标签的href里,点击就完蛋。第三,最好还是做个参数校验,不管来源哪里,先过滤一遍再使用。
总结一下:你这段代码单独看是防XSS的,但审计时要覆盖所有用到用户输入的地方,确保每个出口都做了合适的转义或白名单处理。