[英]Laravel CSRF protection
我知道 CSRF 攻擊是什么,我已經閱讀了有關它的文檔,但是我無法深入理解 CSRF 保護的工作原理,並且有一些我找不到的一般問題。
在文檔中它說 Laravel 自動生成一個令牌
...由應用程序管理的每個活動用戶會話。
session.php
控制的嗎?session.php
相同,具有 120 分鍾的默認生命周期?domain
屬性設置為"." . env('APP_URL')
,當我導航到由同一應用程序處理的子域時,該 cookie 會發生什么情況"." . env('APP_URL')
"." . env('APP_URL')
"." . env('APP_URL')
? 因此,一旦令牌被創建並存儲在某處,在發出請求時,我必須向csrf_token()
提供csrf_token()
隱藏屬性,或者將其生成為元字段並重定向到我的 JS 文件(如果我正在執行 AJAX)請求。
那么當我實際提出請求時,低級別會發生什么? Request 生成csrf_token()
,Laravel 對 cookie 進行加密,Laravel 檢查發送的 cookie 是否與 session 中的 cookie 相同。 如果是,則表示請求有效,如果不是,則拋出TokenMissmatchException
?
這是否意味着 cookie 生命周期內的每個請求都將具有相同的令牌?
Laravel 對請求和響應 cookie 的加密方式不同嗎? 如果我從EncryptCookies
類中的 cookie 加密中排除令牌,我會得到相同的令牌,但是當我離開它時,散列是不同的。
在請求數據中提供_token
與作為X-CSRF-TOKEN
標頭的轉發令牌有何不同? 如果我看到它們未加密,Laravel 如何驗證它們? 請求后它們是否被加密?
- 它在哪里創建令牌(代碼的哪一部分觸發它)?
通過助手文件后
/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));
}
- 創建后令牌存儲在哪里,在cookie中? 在會議? 如何提取並查看已存儲的內容? 這一切實際上是由 session.php 控制的嗎?
令牌存儲在會話中,您可以使用session('_token')
提取它。 會話過期時間在session.php
使用
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => false,
- 這是什么意思,當我重新加載頁面時,令牌是否仍然與 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.