为什么用innerHTML渲染用户输入时会引发XSS漏洞?
最近在做论坛项目时,用innerHTML动态显示用户提交的评论内容,结果被测试工具提示存在XSS漏洞。我尝试过滤了输入里的尖括号和script关键字,但漏洞检测还是报错,这是为什么呢?
代码是这样的:
// 用户输入直接拼接到innerHTML
const userContent = document.querySelector('#user-input').value;
document.getElementById('comment-area').innerHTML +=
<div class="comment">
${userContent}
</div>
;
我明明做了输入过滤,为什么还是不安全?是不是过滤方法有问题?有没有更稳妥的替代方案?
innerHTML渲染用户输入确实不安全,就算你过滤了尖括号和script关键字,还是可能被绕过,比如通过事件属性onerror或者其他标签像<img>来执行恶意代码。稳妥的方法是用textContent替代,它会自动转义内容,不会解析 HTML。我之前这样搞的:
如果非要支持部分富文本,可以用库比如 DOMPurify 来清理 HTML,但别自己手写过滤规则,太容易漏。