我知道什么是 CSRF 攻击,并阅读了相关文档,但我难以深入理解 CSRF 保护的工作原理,并有一些通用问题无法回答。
在文档中,它说 Laravel 自动为应用程序管理的每个活动用户会话生成一个令牌。
... each active user session managed by the application.
- 令牌是在哪里创建的(代码的哪个部分触发了它)?
- 令牌在创建后存储在何处,在 cookie 中?在会话中?我如何提取和查看已存储的内容?所有这些是否由
session.php
控制? - 当我重新加载页面时,这意味着什么,令牌是否仍然与
session.php
具有默认生存期 120 分钟相同? - 当我导航到同一应用程序处理的子域时,如果我将我的
domain
属性设置为"." . env('APP_URL')
,那么该 cookie 会发生什么?
因此,一旦令牌已被创建并存储在某处,在进行请求时,我必须在表单中提供 csrf_token()
隐藏属性,或者将其生成为元字段并重定向到我的 JS 文件,如果我正在执行 AJAX 请求。
那么,在实际进行请求时会发生什么?请求生成
csrf_token()
,Laravel 加密 cookie,Laravel 检查发送的 cookie 是否与会话中的 cookie 相同。如果是,则表示该请求有效;如果不是,则抛出TokenMissmatchException
?这是否意味着在 cookie 的生命周期内,每个请求都具有相同的令牌?
Laravel 是否以不同方式加密请求和响应 cookie?如果我在
EncryptCookies
类中排除 cookie 加密中的令牌,则会得到相同的令牌,但当我保留它时,哈希值是不同的。
提供请求数据中的_token
与将令牌作为X-CSRF-TOKEN
头转发有何不同?如果我在未加密的情况下看到它们,Laravel如何验证它们?它们会在请求后加密吗?