前端做威胁建模时,用户输入直接渲染到页面会不会有XSS风险?
我最近在学安全开发生命周期,尝试给一个简单的评论功能做威胁建模。我发现用户提交的评论内容会直接通过 innerHTML 插入到页面里,虽然现在只是本地测试,但总觉得这样不安全。我试过用 DOMPurify 清洗,但不确定是不是必须的?
比如下面这段代码,如果用户输入了 <script>alert(1)</script>,会不会真的执行?
<div id="comment-list"></div>
<script>
const userInput = "<img src=x onerror=alert('xss')>";
document.getElementById('comment-list').innerHTML = userInput;
</script>
看你的例子,
<img src=x onerror=alert('xss')>这种确实会触发弹窗。浏览器遇到这种情况,会创建一个无效的图像元素,然后执行onerror里的脚本。DOMPurify是必须的,我之前做过类似项目,刚开始也没用净化库,上线没多久就被发现了漏洞。这个库专门处理这种场景,能有效过滤掉危险内容。
你可以这样改:
记住,永远不要相信用户的任何输入,哪怕看起来再无害。处理用户输入这块,谨慎为上,不然容易被坑得不轻。
你贴的代码里用了
不过也有更干净的做法:如果只是展示文本,别用 innerHTML,改用 textContent 或 innerText,浏览器会自动转义 <、>、& 等字符,XSS 就直接没了。比如:
但如果评论里确实要支持富文本(比如加粗、链接),那就得用 DOMPurify 做清洗,而且最好配合 CSP(Content-Security-Policy)做纵深防御。比如:
记住一句话:只要内容不是你亲手写的字符串,就别直接塞进 innerHTML。本地测试也别侥幸——你永远不知道哪天漏了个 onerror 或 onmouseover。