通过模拟用户流程绕过基于令牌的CSRF防护是否可行?
关于双重提交CSRF防护机制的绕过疑问解答
背景:bank.com的CSRF防护流程
正常用户流程:
- 用户通过
bank.com/login登录,服务器设置会话Cookie和CSRF Cookie - 用户发送GET请求到
bank.com/transfer_form(浏览器自动携带会话Cookie),获取包含CSRF令牌隐藏字段的转账表单 - 用户提交POST请求到
bank.com/transfer?to=Bob&amount=1000&CSRF=XXXX完成转账
- 用户通过
防护核心逻辑:恶意站点
evil.com无法直接构造有效转账请求,因为它无法获取与用户当前会话绑定的CSRF令牌值
你的疑问:为什么模拟用户流程的绕过思路不成立?
你提出的绕过步骤:
- 用户访问
evil.com evil.com通过AJAX向bank.com/transfer_form发送GET请求获取CSRF令牌- 使用获取到的令牌发送POST转账请求到
bank.com
这个思路无法实现,核心原因并非仅依赖SameSite Cookie和CORS策略,双重提交CSRF防护本身的设计就会阻断攻击,具体如下:
1. 同源策略(SOP)的直接限制
浏览器的同源策略会禁止evil.com的JavaScript读取bank.com/transfer_form请求的响应内容。即使浏览器会自动携带用户的会话Cookie去请求bank.com/transfer_form,服务器返回了含CSRF令牌的页面,但evil.com的脚本根本拿不到令牌值——同源策略直接阻断跨域响应的读取操作。
2. 令牌与会话的绑定验证
双重提交CSRF防护的核心是令牌值与用户会话强绑定:
- 服务器生成的CSRF令牌会和当前用户会话关联(要么存在服务端会话存储,要么CSRF Cookie的值与请求中的令牌值对应)
- 即使恶意站点绕过同源策略拿到令牌(实际不可能),只要请求的会话上下文和令牌不匹配,服务器依然会拒绝请求。而恶意站点无法伪造会话上下文,因为会话Cookie由浏览器自动携带,且跨域场景下的Cookie发送也受限制。
关于你观点的纠正
你认为“仅SameSite Cookie属性和CORS策略能阻止该流程”的说法不准确:
- 同源策略是最基础的屏障,在SameSite和CORS出现之前,双重提交CSRF防护就已经通过“令牌+会话绑定+同源策略”的组合实现有效防护
- SameSite Cookie是额外的防护层,进一步限制跨域请求中Cookie的发送;CORS是用来放宽同源策略的机制,而非阻止攻击——正确配置的CORS会拒绝
evil.com的跨域请求,但它不是CSRF防护的核心依赖
简言之,双重提交CSRF防护本身是有效的,核心逻辑是让恶意站点无法获取与当前用户会话绑定的令牌,浏览器同源策略是实现这个逻辑的关键保障,SameSite和CORS只是额外的加固手段,而非唯一防护措施。
内容的提问来源于stack exchange,提问作者Ali_MM
相关产品推荐
相关产品推荐

