前端输出用户内容时怎么防止XSS攻击? 西门培静 提问于 2026-03-02 09:23:19 阅读 35 前端 我在做一个评论功能,用户提交的内容直接用 innerHTML 插入到页面上,结果发现如果输入 <script>alert(1)</script> 会被执行,这明显有安全风险。 我试过用 replace 把尖括号替换成 < 和 >,但感觉不太靠谱,有没有更标准的做法?比如有没有现成的转义函数或者框架推荐的方案? 前端安全输出转义 我来解答 赞 11 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 设计师啸喆 Lv1 你的思路是对的,innerHTML直接插用户内容确实是典型XSS漏洞。简单replace确实不靠谱,光替换尖括号远远不够,空格、引号、事件属性这些都能绕过。 最直接的方案是先把用户输入做HTML转义,把 < > & " ' 这些字符转成实体编码,然后再innerHTML就不会被执行了。 自己写一个转义函数大概这样: function escapeHtml(str) { const div = document.createElement('div'); div.textContent = str; return div.innerHTML; } // 用法 commentDiv.innerHTML = escapeHtml(userInput); 这个写法利用浏览器的textContent特性来帮你做转义,比手写replace稳多了。 不过更推荐的做法是用 DOMPurify 这个库,它专门干这个的,考虑了各种边界情况: import DOMPurify from 'dompurify'; commentDiv.innerHTML = DOMPurify.sanitize(userInput); 如果你是用 React 或 Vue 这些框架,框架本身已经帮你做了转义,只要别用 dangerouslySetInnerHTML 或者 v-html 这种显式跳过转义的方式就行。 总结一下:要么用 escapeHtml 这种简单转义,要么直接上 DOMPurify,别自己写正则,容易漏。 回复 点赞 2026-03-20 11:11 小利 Dev Lv1 最简单的办法就是别用 innerHTML,改成 textContent 或 innerText,浏览器会自动帮你转义,根本不会执行脚本。 如果你确实需要渲染一些格式(比如换行),那就写个转义函数: function escapeHtml(str) { const div = document.createElement('div'); div.textContent = str; return div.innerHTML; } // 用的时候 element.innerHTML = escapeHtml(userContent); 要是用 Vue 或 React,直接用双花括号 {{ content }} 或者 {content},框架默认就帮你转义了,根本不用操心。 回复 点赞 1 2026-03-02 09:41 加载更多 相关推荐 2 回答 46 浏览 前端代码里怎么防止XSS攻击?我这样写安全吗? 最近在做渗透测试,发现我们项目里有个用户输入展示的地方可能有XSS风险。我用React直接渲染用户输入的内容,但听说这样不安全,可又不确定具体哪里有问题。 我试过用DOMPurify处理,但团队有人说... Des.统思 安全 2026-03-22 11:11:22 2 回答 42 浏览 前端如何正确处理用户输入防止XSS攻击? 我在做一个评论功能,用户提交的内容要显示在页面上,但担心XSS漏洞。比如用户输入了alert(1),直接innerHTML就会执行,这太危险了。 我试过用DOMPurify库清理,但有些场景又需要保留... UI美含 安全 2026-03-15 15:26:19 2 回答 33 浏览 前端如何用安全沙箱防止XSS攻击? 最近在做一个富文本编辑器的功能,用户可以输入HTML内容,但我担心XSS问题。听说可以用沙箱隔离,比如把内容放到iframe里?我试过动态创建iframe然后写入内容,但样式全乱了,而且有些脚本还是能... UP主~静静 安全 2026-03-27 18:24:25 1 回答 41 浏览 前端如何在Vue项目中安全地处理用户输入以防止XSS攻击? 我在做DevSecOps集成时,安全扫描工具报了一个高危XSS漏洞,说用户输入直接渲染到页面上了。我试过用v-text,但有些地方必须用v-html展示富文本,结果就被扫出问题了。 比如下面这段代码,... 长孙艳杰 安全 2026-03-24 10:12:22 1 回答 35 浏览 前端输入验证只靠CSS能防XSS吗? 我在做一个评论功能,用户输入内容后直接显示在页面上。听说要防止XSS攻击,但我看有些项目只用了CSS的white-space: pre-wrap和overflow-wrap: break-word来处... Mr.梦玲 前端 2026-03-21 09:41:19 1 回答 34 浏览 前端安全审计时如何防止XSS攻击? 最近在做项目的安全审计,发现有个地方可能有XSS漏洞。用户输入的内容直接插到页面里了,虽然用了innerText,但不确定是不是真的安全。 比如下面这段代码,把URL参数里的值直接显示出来,这样写会不... 巧云酱~ 前端 2026-03-17 16:11:15 2 回答 40 浏览 前端安全审计时如何防止XSS攻击? 最近在做项目的安全审计,发现用户输入的内容直接渲染到页面上,担心有XSS风险。比如下面这段代码,把用户昵称直接插进HTML里,会不会被注入脚本? <div class="user-info"&g... A. 清梅 前端 2026-03-10 06:20:21 1 回答 44 浏览 前端怎么防范XSS攻击?我用了DOMPurify还是被绕过了? 我在项目里引入了 DOMPurify 来过滤用户输入,但安全测试时还是报了 XSS 漏洞。比如用户提交的内容里有 <img src=x onerror=alert(1)>,明明应该被过滤掉... 技术若溪 安全 2026-03-09 19:29:21 2 回答 59 浏览 前端如何安全地处理用户输入避免XSS攻击? 我在做一个评论功能,用户提交的内容直接用 innerHTML 插入到页面,结果被安全扫描工具报了 XSS 风险。我试过用 DOMPurify,但不确定是不是用对了,比如下面这样写安全吗? const ... 丽萍(打工版) 安全 2026-03-05 21:53:18 2 回答 46 浏览 前端被XSS攻击了,应急响应该怎么做? 我们线上 Vue 项目突然收到用户反馈,页面里弹出了奇怪的 alert,怀疑是 XSS 攻击。我看了下代码,确实有个地方直接用了 v-html 渲染用户输入的内容,但之前没做任何过滤。现在想知道:一旦... 设计师红芹 安全 2026-02-24 19:23:19
最直接的方案是先把用户输入做HTML转义,把 < > & " ' 这些字符转成实体编码,然后再innerHTML就不会被执行了。
自己写一个转义函数大概这样:
这个写法利用浏览器的textContent特性来帮你做转义,比手写replace稳多了。
不过更推荐的做法是用 DOMPurify 这个库,它专门干这个的,考虑了各种边界情况:
如果你是用 React 或 Vue 这些框架,框架本身已经帮你做了转义,只要别用 dangerouslySetInnerHTML 或者 v-html 这种显式跳过转义的方式就行。
总结一下:要么用 escapeHtml 这种简单转义,要么直接上 DOMPurify,别自己写正则,容易漏。
innerHTML,改成textContent或innerText,浏览器会自动帮你转义,根本不会执行脚本。如果你确实需要渲染一些格式(比如换行),那就写个转义函数:
要是用 Vue 或 React,直接用双花括号
{{ content }}或者{content},框架默认就帮你转义了,根本不用操心。