Laravel 8的CSRF令牌实际是如何保障安全的?
你不存在配置错误,核心偏差来自对Laravel CSRF实现逻辑、以及相关安全结论适用前提的误解。
- 首先要明确安全结论的适用边界:仅当服务端把Cookie中自动携带的CSRF令牌作为唯一校验依据时,这种存Cookie的方案才没有防护效果。这种错误实现下,浏览器会自动在跨站请求中附带所有相关Cookie,攻击者不需要知道令牌具体值就能绕过校验,确实和无防护没有区别。
- Laravel的CSRF实现从来没有把Cookie里自动携带的令牌作为校验依据,它采用的是标准的双提交Cookie优化方案:
- 服务端会在响应中下发名为
XSRF-TOKEN的Cookie,但这个Cookie是给前端读取使用的,不是给服务端校验用的 - 所有非GET的状态变更请求,前端必须主动从当前站点的Cookie中读取
XSRF-TOKEN的值,要么放到请求体的_token字段,要么放到X-XSRF-TOKEN请求头中提交 - 服务端CSRF中间件校验时,只会读取请求体/请求头中前端主动提交的令牌值,和Session中存储的合法令牌做比对,完全不会采信Cookie中被浏览器自动附带的令牌值
- 服务端会在响应中下发名为
- 额外下发CSRF Cookie的设计,本质是为了降低前端接入成本:尤其是单页应用场景下,前端不需要额外调用接口获取CSRF令牌,直接读取同源Cookie就能拿到需要提交的令牌值,省掉了单独的令牌下发逻辑。
- 这套设计的安全逻辑完全成立:受浏览器同源策略限制,跨站场景下的恶意脚本根本无法读取目标站点下的Cookie内容,自然拿不到正确的令牌值,也就没法构造出能通过校验的请求。
你可以自行做两个简单验证就能确认逻辑:
- 构造跨站请求,让浏览器自动附带所有相关Cookie,但不在请求体/请求头中主动携带CSRF令牌,请求一定会被CSRF中间件拦截
- 手动构造请求,让请求体里提交的令牌值和Cookie中携带的
XSRF-TOKEN保持一致,但和Session中存储的合法令牌不匹配,请求同样会被拦截
内容的提问来源于stack exchange,提问作者cr001
相关产品推荐
相关产品推荐

