为什么用了escape()后XSS过滤还是没效果? ♫子寨 提问于 2026-01-25 16:48:24 阅读 54 安全 最近在做用户评论功能,前端用escape()转义了输入内容,但测试时发现输入alert(1)依然能执行,这是怎么回事?我检查过代码确实调用了escape,但漏洞还是存在… 尝试过在服务端也做了过滤,但跨站脚本仍然能绕过。难道escape()不能防止XSS?有没有更可靠的前端转义方法? 安全开发生命周期安全编码 我来解答 赞 14 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 设计师子武 Lv1 escape()这个方法早就被废弃了,它确实不能完全防止XSS攻击。问题出在它只对部分字符做了转义,比如将空格转成%20,但对很多危险字符如<>"'这些却放过了,这就给了攻击者可乘之机。 我建议你换成更可靠的编码方式。如果是在浏览器环境,直接用textContent属性来设置文本内容是最安全的,它会自动处理所有特殊字符。比如: element.textContent = userInput; 实在需要手动转义的话,可以自己写个函数,把关键的几个字符都转掉: function escapeHtml(str) { return str.replace(/[<>"'&]/g, function(match) { const map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return map[match]; }); } 这样更清晰,也更安全。不过记住,前端防护只是辅助,真正关键的是后端要做严格的校验和转义。别太依赖前端,毕竟请求是可以被篡改的。 回复 点赞 7 2026-02-18 20:09 诗雯 Dev Lv1 escape()真别用来防XSS,它只是个URL编码函数,根本挡不住脚本执行。你这个问题得用encodeURIComponent()或者直接在输出时用HTML实体转义,比如这样: function escapeHtml(unsafe) { return unsafe .replace(/&/g, "&") .replace(/ .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } console.log(escapeHtml("")); 前端只做第一步,服务端必须再严格过滤和验证,XSS不是单靠前端能搞定的。 回复 点赞 22 2026-01-30 09:03 加载更多 相关推荐 1 回答 37 浏览 前端怎么防范XSS攻击?我用了DOMPurify还是被绕过了? 我在项目里引入了 DOMPurify 来过滤用户输入,但安全测试时还是报了 XSS 漏洞。比如用户提交的内容里有 <img src=x onerror=alert(1)>,明明应该被过滤掉... 技术若溪 安全 2026-03-09 19:29:21 2 回答 56 浏览 CSS样式中的expression()如何绕过事件属性过滤导致XSS? 我在开发评论系统时发现,即使过滤了所有on开头的事件属性,用户提交的CSS代码还是能触发XSS。比如有人写了个这样的样式: div { width: expression(alert('XSS'));... 打工人尚勤 安全 2026-02-12 21:11:25 2 回答 30 浏览 前端输入过滤真能防XSS吗?我这样写安全吗? 我在React项目里做用户评论功能,担心XSS攻击,就对输入做了个简单过滤,但不确定这样够不够。比如把script标签替换成空字符串,但听说还有其他绕过方式? 下面是我现在的处理代码: const s... 开发者玉聪 安全 2026-03-25 11:41:19 2 回答 70 浏览 前端做XSS输入过滤到底该在哪儿处理? 我最近在用 Vue 写一个评论功能,用户输入的内容会直接渲染到页面上。我知道要防 XSS,但不确定是在输入时就过滤掉危险字符,还是在渲染时转义?试过在提交前用正则替换 script 标签,但好像还是能... Code°秀云 安全 2026-03-19 08:44:24 2 回答 79 浏览 xss库过滤后内容变空白是怎么回事? 我用 xss 库对用户输入做过滤,但有些内容直接变成空字符串了,比如输入 alert(1) 确实该被清掉,但像 test 这种,为啥连 "test" 都没了? 我试过默认配置和自定义白名单,还是不行。... Mr-熙然 安全 2026-03-18 14:13:19 2 回答 25 浏览 xss库过滤后内容显示异常怎么办? 我用 xss 库对用户输入做了过滤,但有些正常内容也被转义了,比如 <div> 这种标签直接显示成文本了,不是渲染成 HTML。是不是我用法不对? 我是这样用的: import { san... Good“洛熙 安全 2026-03-05 16:23:18 1 回答 55 浏览 AppScan 扫出 Vue 项目 XSS 漏洞怎么修复? 最近用 AppScan 扫我们 Vue 项目,报了个反射型 XSS 高危漏洞,说是在路由参数没过滤。但我明明用的是 Vue Router,参数都是通过 this.$route.query 拿的,页面上... 司徒子聪 安全 2026-03-30 11:34:17 2 回答 33 浏览 XSStrike扫描时为什么总报错“Connection refused”? 我用XSStrike测试本地开发的前端页面,一运行就报“Connection refused”,明明服务已经启动了啊。我试过python3 xsstrike.py -u http://localhos... 夏侯东霞 安全 2026-03-14 08:34:17 2 回答 67 浏览 设置了X-XSS-Protection头还是被Chrome提示XSS防护已禁用? 最近在配置安全头的时候发现了个怪事,明明在Express里设置了X-XSS-Protection: 1; mode=block,但Chrome控制台还是弹出“XSS 防护已禁用”的警告,这是怎么回事啊... 春萍酱~ 安全 2026-02-18 12:01:29 2 回答 42 浏览 Nessus扫描显示React组件存在XSS漏洞,但代码已经过滤输入了怎么办? 大家好,我在用Nessus扫描公司前端项目时,发现一个React组件被标记为XSS漏洞。但代码明明已经用了DOMPurify过滤输入,这是怎么回事? 我的代码是这样的: import DOMPurif... 设计师锦灏 安全 2026-02-10 12:07:31
我建议你换成更可靠的编码方式。如果是在浏览器环境,直接用
textContent属性来设置文本内容是最安全的,它会自动处理所有特殊字符。比如:实在需要手动转义的话,可以自己写个函数,把关键的几个字符都转掉:
这样更清晰,也更安全。不过记住,前端防护只是辅助,真正关键的是后端要做严格的校验和转义。别太依赖前端,毕竟请求是可以被篡改的。
escape()真别用来防XSS,它只是个URL编码函数,根本挡不住脚本执行。你这个问题得用encodeURIComponent()或者直接在输出时用HTML实体转义,比如这样:前端只做第一步,服务端必须再严格过滤和验证,XSS不是单靠前端能搞定的。