Laravel CSRF保护

Nor*_*gul 8 php cookies csrf token laravel

我知道CSRF攻击是什么,我已经阅读了有关它的文档,但是我无法理解CSRF保护如何深入工作,并且有一些我无法找到的一般性问题.

文档中,它说Laravel会自动为其生成令牌

...由应用程序管理的每个活动用户会话.

  1. 它在哪里创建令牌(代码的哪一部分触发它)?
  2. 创建后,令牌在cookie中存储在哪里?在会议中?如何提取并查看已存储的内容?这一切都是由session.php
  3. 当我重新加载页面时,这意味着什么,令牌仍然与session.php120分钟的默认生命周期相同?
  4. 如果我将我的domain属性设置为导航到同一个应用程序处理的子域,那么该cookie会发生什么"." . env('APP_URL')

因此,一旦令牌被创建并存储在某个地方,在发出请求时,我必须向csrf_token()表单提供隐藏属性,或者将其生成为元字段并在我正在执行AJAX请求时重定向到我的JS文件.

  1. 那么当我实际提出请求时,在低级别会发生什么?请求生成csrf_token(),Laravel加密cookie,Laravel检查发送的cookie是否与会话中的cookie相同.如果是,则表示请求有效,如果不是,则抛出TokenMissmatchException

  2. 这是否意味着cookie生命周期内的每个请求都具有相同的令牌?

  3. Laravel是否以不同方式加密请求和响应cookie?如果我在EncryptCookies类I中从cookie加密中排除令牌获得相同的令牌,但是当我离开它时,哈希是不同的.

  4. 如何_token在请求数据中提供与转发令牌不同的X-CSRF-TOKEN标头?如果我看到它们未加密,Laravel如何验证这些?请求后他们是否加密?

lin*_*ref 1

  1. 它在哪里创建令牌(代码的哪一部分触发它)?

浏览完助手文件后

/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php
Run Code Online (Sandbox Code Playgroud)

其中有辅助方法的定义csrf_token(),该方法调用令牌方法

/vendor/laravel/framework/src/Illuminate/Session/Store.php
Run Code Online (Sandbox Code Playgroud)

如果您检查未设置start()哪个调用,它会将随机的 40 个字符的字符串保存到会话中,密钥为regenerateToken()_token_token

/**
 * Regenerate the CSRF token value.
 *
 * @return void
 */
public function regenerateToken()
{
    $this->put('_token', Str::random(40));
}
Run Code Online (Sandbox Code Playgroud)
  1. 创建后令牌存储在 cookie 中的哪里?在会议中?如何提取并查看已存储的内容?这一切实际上都是由session.php控制的吗?

令牌存储在会话中,您可以使用 提取它session('_token')session.php使用中控制会话过期时间

'lifetime' => env('SESSION_LIFETIME', 120),

'expire_on_close' => false,
Run Code Online (Sandbox Code Playgroud)
  1. 当我重新加载页面时,令牌是否仍然与 session.php 具有 120 分钟默认生存期相同?

如果您办理start()登机手续/vendor/laravel/framework/src/Illuminate/Session/Store.php

/**
 * Start the session, reading the data from a handler.
 *
 * @return bool
 */
public function start()
{
    $this->loadSession();

    if (! $this->has('_token')) {
        $this->regenerateToken();
    }

    return $this->started = true;
}
Run Code Online (Sandbox Code Playgroud)

如果会话没有 ,则重新生成令牌_token。所以_token在会话过期之前都是一样的