2026年5月27日 01:05

什么是 CSRF 攻击?如何防御?

CSRF(跨站请求伪造)的攻击逻辑很简单:利用用户在其他网站已登录的身份,伪造请求执行非授权操作。

典型场景:你登录了银行网站,cookie 还在。这时你打开了攻击者的网页,里面有一张隐藏的图片 <img src="https://bank.com/transfer?to=attacker&amount=10000">。浏览器加载这张"图片"时,自动带上了你的银行 cookie,银行收到请求以为是你的操作,转账就发生了。

关键在于:浏览器发跨站请求会自动带上目标域名的 cookie——这是浏览器的默认行为。

防御方式:

  • Anti-CSRF Token:服务端生成随机 token,表单提交时带上,服务端验证。攻击者无法获取这个 token
  • SameSite CookieSet-Cookie: SameSite=Strict,告诉浏览器跨站请求不要带这个 cookie。这是现代浏览器的标配方案
  • Referer/Origin 检查:服务端验证请求来源,合法的请求才处理
  • 二次验证:关键操作(转账、改密码)要求重新输入密码或验证码

追问

CSRF 和 XSS 有什么区别?

XSS 是在用户浏览器里执行恶意 JS(利用了网站对输入的信任),CSRF 是伪造用户的请求(利用了网站对浏览器身份的信任)。一句话:XSS 是"偷你的权限",CSRF 是"借用你的身份"。

SameSite 三个值分别什么意思?

  • Strict:任何跨站请求都不带 cookie,最安全。但用户从外部链接点进来是未登录状态
  • Lax:大部分跨站请求不带 cookie,但"安全"的 GET 请求(如 <a> 链接点击)会带。兼顾安全和体验
  • None:和以前一样,跨站请求都带 cookie,但必须同时设置 Secure(仅 HTTPS)

Anti-CSRF Token 怎么防止攻击者自己获取一个 token?

token 绑定到用户 session,攻击者拿到的 token 是绑给他自己的 session 的,放到跨站请求里服务端一对不上就拒了。关键不是"token 不能被获取",而是"token 和用户 session 绑定"。

标签:前端Web安全