5月27日 21:35
XSS 和 CSRF 有什么区别?
核心区别
XSS 是往页面里注入恶意脚本,让脚本在用户浏览器里执行;CSRF 是伪造用户身份,让浏览器替攻击者发请求。一个攻的是"用户对网站的信任",一个攻的是"网站对浏览器的信任"。
| XSS | CSRF | |
|---|---|---|
| 原理 | 注入脚本在浏览器执行 | 伪造请求冒充用户 |
| 能力 | 可读写 DOM、窃取 Cookie、发任意请求 | 只能发请求,无法读响应 |
| 依赖登录 | 不需要 | 需要用户已登录 |
| 防护核心 | 输入过滤 + 输出编码 | Token + SameSite Cookie |
XSS 防护要点
三种类型:存储型(脚本入库,持久危害最大)、反射型(URL 参数带脚本)、DOM 型(前端 JS 拼接执行)。
防护三板斧:
- 输入侧:白名单校验,过滤特殊字符
- 输出侧:HTML/JS/URL 分上下文编码,
textContent替代innerHTML - 纵深防御:CSP 禁内联脚本,Cookie 设 HttpOnly
javascript// 输出编码示例 function escapeHtml(str) { return str.replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """); }
CSRF 防护要点
攻击者构造隐藏表单或图片标签,浏览器自动携带 Cookie 发请求,服务器以为是用户本人操作。
防护四招:
- CSRF Token:每次请求携带服务端签发的随机 Token,攻击者拿不到就无法伪造
- SameSite Cookie:设为
Strict或Lax,阻止跨站携带 - 校验 Referer/Origin:拒绝非本站来源的敏感请求
- 自定义 Header:前端加
X-Requested-With,跨域限制让攻击者无法伪造
html<!-- 典型 CSRF 攻击 --> <img src="https://bank.com/transfer?to=hacker&amount=10000" style="display:none">
追问:XSS 能绕过 CSRF 防护吗?
能。XSS 可以直接在页面内读取 CSRF Token 再发请求,等于 CSRF 的所有防线全部失效。所以防护 XSS 优先级更高——XSS 搞定了,CSRF 的 Token 机制才真正有效。