簡體   English   中英

Laravel CSRF 保護

[英]Laravel CSRF protection

我知道 CSRF 攻擊是什么,我已經閱讀了有關它的文檔,但是我無法深入理解 CSRF 保護的工作原理,並且有一些我找不到的一般問題。

文檔中它說 Laravel 自動生成一個令牌

...由應用程序管理的每個活動用戶會話。

  1. 它在哪里創建令牌(代碼的哪一部分觸發它)?
  2. 創建后令牌存儲在哪里,在cookie中? 在會議? 如何提取並查看已存儲的內容? 這一切實際上是由session.php控制的嗎?
  3. 這是什么意思,當我重新加載頁面時,令牌是否仍然與session.php相同,具有 120 分鍾的默認生命周期?
  4. 如果我將domain屬性設置為"." . env('APP_URL') ,當我導航到由同一應用程序處理的子域時,該 cookie 會發生什么情況"." . env('APP_URL') "." . env('APP_URL') "." . env('APP_URL')

因此,一旦令牌被創建並存儲在某處,在發出請求時,我必須向csrf_token()提供csrf_token()隱藏屬性,或者將其生成為元字段並重定向到我的 JS 文件(如果我正在執行 AJAX)請求。

  1. 那么當我實際提出請求時,低級別會發生什么? Request 生成csrf_token() ,Laravel 對 cookie 進行加密,Laravel 檢查發送的 cookie 是否與 session 中的 cookie 相同。 如果是,則表示請求有效,如果不是,則拋出TokenMissmatchException

  2. 這是否意味着 cookie 生命周期內的每個請求都將具有相同的令牌?

  3. Laravel 對請求和響應 cookie 的加密方式不同嗎? 如果我從EncryptCookies類中的 cookie 加密中排除令牌,我會得到相同的令牌,但是當我離開它時,散列是不同的。

  4. 在請求數據中提供_token與作為X-CSRF-TOKEN標頭的轉發令牌有何不同? 如果我看到它們未加密,Laravel 如何驗證它們? 請求后它們是否被加密?

  1. 它在哪里創建令牌(代碼的哪一部分觸發它)?

通過助手文件后

/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php

其中有csrf_token()輔助方法的定義,它調用令牌方法

/vendor/laravel/framework/src/Illuminate/Session/Store.php

如果沒有設置_token ,則檢查調用regenerateToken()start() ,它會使用_token的鍵將隨機 40 個字符的字符串保存到會話中

/**
 * Regenerate the CSRF token value.
 *
 * @return void
 */
public function regenerateToken()
{
    $this->put('_token', Str::random(40));
}
  1. 創建后令牌存儲在哪里,在cookie中? 在會議? 如何提取並查看已存儲的內容? 這一切實際上是由 session.php 控制的嗎?

令牌存儲在會話中,您可以使用session('_token')提取它。 會話過期時間在session.php使用

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

'expire_on_close' => false,
  1. 這是什么意思,當我重新加載頁面時,令牌是否仍然與 session.php 相同,具有 120 分鍾的默認生命周期?

如果您在/vendor/laravel/framework/src/Illuminate/Session/Store.php檢查start()

/**
 * 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;
}

如果會話沒有_token則重新生成令牌。 所以_token將是相同的,直到會話過期

在我的情況下,從 .env 中刪除 APP_URL=http://localhost 解決了 CSRF 令牌的問題。 我沒有在 APP_URL 中為本地開發配置固定值,因為我總是通過瀏覽器和端口使用不同的主機名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM