5月27日 21:35

XSS 和 CSRF 有什么区别?

核心区别

XSS 是往页面里注入恶意脚本,让脚本在用户浏览器里执行;CSRF 是伪造用户身份,让浏览器替攻击者发请求。一个攻的是"用户对网站的信任",一个攻的是"网站对浏览器的信任"。

XSSCSRF
原理注入脚本在浏览器执行伪造请求冒充用户
能力可读写 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, "&amp;") .replace(/</g, "&lt;") .replace(/>/g, "&gt;") .replace(/"/g, "&quot;"); }

CSRF 防护要点

攻击者构造隐藏表单或图片标签,浏览器自动携带 Cookie 发请求,服务器以为是用户本人操作。

防护四招:

  • CSRF Token:每次请求携带服务端签发的随机 Token,攻击者拿不到就无法伪造
  • SameSite Cookie:设为 StrictLax,阻止跨站携带
  • 校验 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 机制才真正有效。

标签:XSS