CSRF 令牌被大量使用。
服务器在该域的 cookie 中设置一个令牌,该令牌 (1) 包含在 HTML 表单中或 (2) Javascript 可以读取并包含在请求中。服务器验证请求中的令牌与 cookie 中的令牌匹配。
但是为什么不简单地检查 Origin 标头呢?根据OWASP,这就是它存在的原因:
引入了 Origin HTTP 标头标准作为防御 CSRF 和其他跨域攻击的方法。
“起源不存在吗?如果不存在,好的。如果存在,它是我信任的一个吗(例如,相同的起源)?如果是,好的。”
CSRF 令牌可能很麻烦。他们是
- 初学者更难理解——“等等……我发了两次?又是什么 CRSF?”
- 需要 cookie(授予,通常不是问题)
- 更难实现——需要控制器和视图
- 不太灵活——永远不能跨域工作
- 在非网络设置中很奇怪——“为什么你的 API 需要 CSRF 令牌?” “哦,因为 JS 也使用它。”
- 全局实现更麻烦——“糟糕,在我的 25 个 HTML 表单字段中忘记了 CSRF 标记”
鉴于这些缺点,为什么 CSRF 令牌如此常用,而不是 Origin 标头?