CSRF 是由攻擊者執行的惡意活動,攻擊者代表經過身份驗證的用戶執行操作,對 Web 安全有害。 幸運的是,Laravel 提供了防止此類漏洞的工具。
CSRF 攻擊劫持用戶會話。 他們通過在用戶不知情的情況下通過隱藏的表單標籤或惡意 URL(圖像或鏈接)誘騙用戶提交請求來做到這一點。
這種攻擊會導致用戶會話狀態發生變化、數據洩露,有時黑客還可以操縱應用程序中的最終用戶數據。
上圖說明了網絡安全遭到破壞的場景。 受害者通過單擊鏈接(已收到)發送請求,將請求發送到網站服務器,這將產生黑客所需的效果,黑客將獲得對訪問和操縱網站服務器有用的信息。
為了提高 安全 在你的應用程序的 web 中,在每個用戶會話中,Laravel 生成安全令牌,它使用它來確保經過身份驗證的用戶是請求應用程序的用戶。
由於每次重新生成用戶會話時此令牌都會更改,因此攻擊者無法訪問它。
每當有更改服務器端(後端)用戶信息的請求時,例如 POST
, PUT
, PATCH
e DELETE
,您必須包含指令 @csrf
在申請表中 blade
HTML。 這 @csrf
因此它是一個指令 Blade
用於生成由應用程序驗證的隱藏令牌。
該指令 Blade
是 Laravel 模板引擎中使用的語法,稱為 刀片 . 創建文件 blade
你必須給它一個名字——在我們的案例中——然後是刀片的擴展。 這意味著該文件將具有名稱 form.blade.php
.
該文件被使用 blade
在網頁上為用戶呈現視圖。有幾個預先指令defi您可以使用 nite 或 Blade 速記語法。 例如, @if
檢查條件是否滿足, @empty
檢查記錄是否不為空, @auth
檢查用戶是否通過身份驗證等。
但是讓我們回到指令 @csrf
. 以下是您如何使用它:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
以前版本的 Laravel 有不同的設置:它們都工作並且做同樣的事情。
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
當正在提交的表單請求中缺少 CSRF 令牌或者它看起來無效時,Laravel 會拋出一個“頁面已過期”錯誤消息和 419 狀態代碼。
中間件 VerifyCsrfToken
在 Laravel 應用程序中處理 CSRF 驗證。 這 middleware
註冊於 Kernel.php
並且位於目錄中 app/Http/Middleware
. 這意味著 middleware
它是為網絡中的請求觸發的,與 API 無關。
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
VerifyCsrfToken 中間件擴展類 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
,即 CSRF 驗證是 defi晚上在班級裡。
讓我們更深入地了解 Laravel 如何處理 CSRF 驗證。
在類裡面,我們有函數 tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
在代碼中確定會話和輸入的 CSRF 令牌是否匹配。
該函數做了兩件事:
$this->getTokenFromRequest
來自通過隱藏字段或請求標頭附加的傳入請求的令牌。 令牌被解密,然後返回到令牌變量。protected function getTokenFromRequest($request)
{
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
try {
$token = CookieValuePrefix::remove($this->encrypter->decrypt($header, static::serialized()));
} catch (DecryptException $e) {
$token = '';
}
}
return $token;
}
在代碼中,它從標頭獲取令牌
2.將請求令牌和會話都轉換為字符串,然後使用 hash_equals
內置 PHP 以比較兩個字符串是否相等。 這個操作的結果總是 布爾(真)或(假) .
Ercole Palmeri
Reply 宣布推出 MLFRAME Reply,這是一個針對異質知識庫的新型生成人工智慧框架。 設計…
全球顧問和系統整合商兼 Oracle 雲端託管服務供應商 Reply 宣布已收到…
MasterZ 區塊鏈增加了歐洲最大的 WEB 3.0 卓越碩士的價值。 全義大利隊...
從 33 個國家的 5.213 份申請中選出 163 名決賽入圍者 決賽入圍者倡導有影響力的氣候行動並支持獲得清潔能源……
使用 Spectronaut ® 18 進行無庫、機器學習驅動的數據分析可提供行業領先的蛋白質定量和通量……