CSRF 是什么
CSRF(跨站请求伪造)利用的是浏览器会自动携带 Cookie 这一行为:用户登录站点 A 后访问攻击者页面,该页面构造出对站点 A 的请求,浏览器自动附上会话 Cookie,服务端只看到「已登录的用户发起了请求」,于是转账、改密、绑定邮箱这类操作在用户不知情时被执行。它的成因是接口只凭 Cookie 判断身份,却没有判断这次请求是否由本站页面有意发起,因此防护核心是让请求携带攻击者无法伪造的凭据,或让浏览器不自动携带身份凭据。
基本信息
| 风险类别 | OWASP Top 10 2021 A01 失效的访问控制;CWE-352 |
|---|---|
| 成因 | 接口仅凭 Cookie 鉴权,不校验请求来源意图 |
| 影响 | 以受害者身份完成转账、改密、绑定等操作 |
| 主防护 | CSRF Token:与会话绑定、每次校验 |
| 辅助 | SameSite Cookie、Origin 校验、敏感操作二次确认 |
| 判断口径 | 有副作用的请求都算风险点,GET 不应产生副作用 |
典型场景
- 后台管理系统的增删改接口仅凭会话 Cookie 鉴权
- 修改邮箱、手机号与密码等账号安全相关操作
- 绑定与解绑第三方账号、授权应用范围变更
- 文件上传与删除接口,被利用可篡改站点内容
- 以 GET 实现的删除与状态变更链接,最容易被图片标签触发
- 内网管理平台鉴权弱但影响面大,常被忽略
防护选择顺序
防护选择顺序
1. 状态变更接口全部使用 POST/PUT/DELETE,并校验 CSRF Token
2. Cookie 设 SameSite=Lax 起步,高敏感后台评估 Strict
3. 请求带 Origin 头时进行校验
4. 转账改密等敏感操作叠加二次认证
# 令牌要与会话绑定并一次性使用,不能仅靠随机字符串复用
# 前后端分离站点把令牌放在自定义请求头里,同时要求接口不接受跨站表单提交防护手段对照
| 手段 | 适用场景 | 局限 |
|---|---|---|
| CSRF Token | 所有状态变更接口 | 需要全量改造,漏一个接口就留缺口 |
| SameSite Cookie | 浏览器端会话 | 老浏览器兼容性与跨站登录流程需评估 |
| Origin 与 Referer 校验 | 作为补充判断 | 头部可能缺失或被代理改写 |
| 自定义请求头 | 前后端分离的 JSON 接口 | 依赖前端统一封装请求 |
| 二次确认与二次认证 | 资金与账号安全操作 | 影响体验,需分级使用 |
GET 请求不应产生副作用:delete 类接口应先改成 POST,否则无法用令牌机制完整保护。
跨站登录回调、支付回跳等业务链条本身就需要跨站请求,上线 SameSite=Strict 前要先跑通这些流程,必要时在个别路径上单独放宽。