用品

Laravel Web 安全:什麼是跨站請求偽造 (CSRF)?

在本 Laravel 教程中,我們討論了 Web 安全以及如何保護 Web 應用程序免受跨站點請求偽造或 CSRF 攻擊。

CSRF 是由攻擊者執行的惡意活動,攻擊者代表經過身份驗證的用戶執行操作,對 Web 安全有害。 幸運的是,Laravel 提供了防止此類漏洞的工具。

什麼是CSRF?

CSRF 攻擊劫持用戶會話。 他們通過在用戶不知情的情況下通過隱藏的表單標籤或惡意 URL(圖像或鏈接)誘騙用戶提交請求來做到這一點。

這種攻擊會導致用戶會話狀態發生變化、數據洩露,有時黑客還可以操縱應用程序中的最終用戶數據。

上圖說明了網絡安全遭到破壞的場景。 受害者通過單擊鏈接(已收到)發送請求,將請求發送到網站服務器,這將產生黑客所需的效果,黑客將獲得對訪問和操縱網站服務器有用的信息。

如何防止 CSRF 請求

為了提高 安全 在你的應用程序的 web 中,在每個用戶會話中,Laravel 生成安全令牌,它使用它來確保經過身份驗證的用戶是請求應用程序的用戶。

由於每次重新生成用戶會話時此令牌都會更改,因此攻擊者無法訪問它。

每當有更改服務器端(後端)用戶信息的請求時,例如 POSTPUTPATCHDELETE,您必須包含指令 @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 狀態代碼。

CSRF 驗證如何以及在何處進行

中間件 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 令牌是否匹配。

該函數做了兩件事:

  1. 得到 $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

創新通訊
不要錯過有關創新的最重要新聞。 註冊以通過電子郵件接收它們。

最近的文章

出版商與 OpenAI 簽署協議以規範人工智慧處理的資訊流

上週一,英國《金融時報》宣布與 OpenAI 達成協議。英國《金融時報》授予其世界級新聞報道許可…

30月2024

線上支付:串流服務如何讓您永遠付款

數百萬人為串流媒體服務付費,每月支付訂閱費用。人們普遍認為您...

29月2024

Veeam 為勒索軟體提供最全面的支持,從保護到回應和恢復

Veeam 的 Coveware 將繼續提供網路勒索事件回應服務。 Coveware 將提供取證和修復功能…

23月2024

綠色與數位革命:預測性維護如何改變石油和天然氣產業

預測性維護正在透過創新和主動的工廠管理方法徹底改變石油和天然氣行業。

22月2024