XSS攻击分为反射型、存储型和DOM型三类,防范需输出转义、CSP策略、安全API及前后端协同;现代框架默认转义可降低风险,但非万能,仍需警惕非受控数据源。

XSS攻击的三种常见类型
反射型XSS:恶意脚本通过URL参数传入,服务端未过滤就直接拼进HTML返回,用户点击链接即触发。比如搜索页把q=原样渲染。
存储型XSS:攻击者提交的恶意脚本被存进数据库,后续所有查看该内容的用户都会执行。常见于评论、用户昵称、后台日志展示等场景。
DOM型XSS:不经过服务端,纯前端JS操作DOM时引入不可信数据,例如用location.hash或document.referrer动态写入innerHTML。
核心防范手段:输出转义 + CSP + 安全API
所有用户可控的数据在插入HTML前必须转义,不能只靠“看起来安全”来判断:
立即学习“Java免费学习笔记(深入)”;
- 避免
innerHTML、document.write、eval、new Function等危险API;优先用textContent或setAttribute - 对HTML内容使用可靠的转义函数(如
→,"→"),不要自己手写正则简单替换 - 启用HTTP响应头
Content-Security-Policy,至少设置script-src 'self',禁用'unsafe-inline'和'unsafe-eval' - 富文本场景必须用
DOMPurify.sanitize()等专业库清洗,而非白名单字符串替换
前后端协同才是关键
XSS防护不能只靠前端。服务端同样要参与:
- 后端接收输入时做基础校验(如长度、格式、字符集),但不过度依赖“黑名单”过滤
- 服务端输出到HTML模板时,模板引擎应默认开启自动转义(如EJS的
vs) - 敏感接口(如修改密码、转账)必须校验CSRF Token,防止XSS结合CSRF扩大危害
- Cookie设为
HttpOnly+Secure+SameSite=Lax,降低XSS窃取凭证的风险
现代框架能帮大忙,但不是万能
React、Vue、Svelte等默认对插值内容做HTML转义,大幅降低XSS风险:
- React中
{userInput}是安全的,但dangerouslySetInnerHTML需极度谨慎 - Vue中
{{ msg }}自动转义,v-html等价于innerHTML,必须清洗后再用 - 即便用框架,也要警惕从
localStorage、URL参数、第三方API响应等非受控来源读取数据并直插DOM











