为什么用了escape()后XSS过滤还是没效果?

♫子寨 阅读 28

最近在做用户评论功能,前端用escape()转义了输入内容,但测试时发现输入alert(1)依然能执行,这是怎么回事?我检查过代码确实调用了escape,但漏洞还是存在…

尝试过在服务端也做了过滤,但跨站脚本仍然能绕过。难道escape()不能防止XSS?有没有更可靠的前端转义方法?

我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
设计师子武
escape()这个方法早就被废弃了,它确实不能完全防止XSS攻击。问题出在它只对部分字符做了转义,比如将空格转成%20,但对很多危险字符如<>"'这些却放过了,这就给了攻击者可乘之机。

我建议你换成更可靠的编码方式。如果是在浏览器环境,直接用textContent属性来设置文本内容是最安全的,它会自动处理所有特殊字符。比如:

element.textContent = userInput;


实在需要手动转义的话,可以自己写个函数,把关键的几个字符都转掉:

function escapeHtml(str) {
return str.replace(/[<>"'&]/g, function(match) {
const map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return map[match];
});
}


这样更清晰,也更安全。不过记住,前端防护只是辅助,真正关键的是后端要做严格的校验和转义。别太依赖前端,毕竟请求是可以被篡改的。
点赞
2026-02-18 20:09
诗雯 Dev
escape()真别用来防XSS,它只是个URL编码函数,根本挡不住脚本执行。你这个问题得用encodeURIComponent()或者直接在输出时用HTML实体转义,比如这样:

function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/ .replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}

console.log(escapeHtml(""));


前端只做第一步,服务端必须再严格过滤和验证,XSS不是单靠前端能搞定的。
点赞 14
2026-01-30 09:03