为什么用innerHTML渲染用户输入时会引发XSS漏洞?

FSD-宏旭 阅读 35

最近在做论坛项目时,用innerHTML动态显示用户提交的评论内容,结果被测试工具提示存在XSS漏洞。我尝试过滤了输入里的尖括号和script关键字,但漏洞检测还是报错,这是为什么呢?

代码是这样的:


// 用户输入直接拼接到innerHTML
const userContent = document.querySelector('#user-input').value;
document.getElementById('comment-area').innerHTML += 
  <div class="comment">
    ${userContent}
  </div>
;

我明明做了输入过滤,为什么还是不安全?是不是过滤方法有问题?有没有更稳妥的替代方案?

我来解答 赞 3 收藏
二维码
手机扫码查看
2 条解答
UE丶新利
直接用 innerHTML 渲染用户输入确实不安全,就算你过滤了尖括号和 script 关键字,还是可能被绕过,比如通过事件属性 onerror 或者其他标签像 <img> 来执行恶意代码。稳妥的方法是用 textContent 替代,它会自动转义内容,不会解析 HTML。

我之前这样搞的:
// 使用 textContent 安全渲染
const userContent = document.querySelector('#user-input').value;
const newComment = document.createElement('div');
newComment.className = 'comment';
newComment.textContent = userContent;
document.getElementById('comment-area').appendChild(newComment);


如果非要支持部分富文本,可以用库比如 DOMPurify 来清理 HTML,但别自己手写过滤规则,太容易漏。
点赞 1
2026-02-15 14:05
慕容玉泽
你那过滤方法太简单了,XSS绕过手段多得很。试试用textContent显示内容,浏览器会自动转义html标签。

const userContent = document.querySelector('#user-input').value;
const commentDiv = document.createElement('div');
commentDiv.className = 'comment';
commentDiv.textContent = userContent;
document.getElementById('comment-area').appendChild(commentDiv);
点赞 6
2026-02-04 19:02