Laravel - CSRF 保護



CSRF 指的是針對 Web 應用的跨站請求偽造攻擊。CSRF 攻擊是系統已認證使用者執行的未授權活動。因此,許多 Web 應用容易受到此類攻擊。

Laravel 提供以下方式的 CSRF 保護:

Laravel 內建了一個 CSRF 外掛,它為每個活躍使用者會話生成令牌。這些令牌驗證操作或請求是由相關的已認證使用者傳送的。

實現

本節詳細介紹了在 Laravel 中實現 CSRF 保護的方法。在繼續進行 CSRF 保護之前,需要注意以下幾點:

  • CSRF 是在 Web 應用中宣告的 HTML 表單內實現的。您必須在表單中包含一個隱藏的已驗證 CSRF 令牌,以便 Laravel 的 CSRF 保護中介軟體可以驗證請求。語法如下:

<form method = "POST" action="/profile">
   {{ csrf_field() }}
   ...
</form>
  • 您可以方便地使用 JavaScript HTTP 庫構建基於 JavaScript 的應用程式,因為它將 CSRF 令牌包含到每個傳出的請求中。

  • 名為 **resources/assets/js/bootstrap.js** 的檔案註冊所有 Laravel 應用程式的令牌,幷包含一個儲存帶有 **Axios HTTP 庫** 的 **csrf-token** 的 **meta** 標籤。

沒有 CSRF 令牌的表單

考慮以下程式碼行。它們顯示一個表單,該表單接收兩個引數作為輸入:**email** 和 **message**。

<form>
   <label> Email </label>
      <input type = "text" name = "email"/>
      <br/>
   <label> Message </label> <input type="text" name = "message"/>
   <input type = ”submit” name = ”submitButton” value = ”submit”>
</form>

上述程式碼的結果是終端使用者可以檢視的以下表單:

Contact Form

上述表單將接受來自授權使用者的任何輸入資訊。這可能會使 Web 應用容易受到各種攻擊。

請注意,提交按鈕包含控制器部分的功能。**postContact** 函式用於關聯檢視的控制器中。如下所示:

public function postContact(Request $request) {
   return $request-> all();
}

請注意,該表單不包含任何 CSRF 令牌,因此作為輸入引數共享的敏感資訊容易受到各種攻擊。

帶有 CSRF 令牌的表單

以下程式碼行顯示了使用 CSRF 令牌重新設計的表單:

<form method = ”post” >
   {{ csrf_field() }}
   <label> Email </label>
   <input type = "text" name = "email"/>
   <br/>
   <label> Message </label>
   <input type = "text" name = "message"/>
   <input type = ”submit” name = ”submitButton” value = ”submit”>
</form>

獲得的結果將返回包含以下令牌的 JSON:

{
   "token": "ghfleifxDSUYEW9WE67877CXNVFJKL",
   "name": "TutorialsPoint",
   "email": "contact@tutorialspoint.com"
}

這是單擊提交按鈕時建立的 CSRF 令牌。

廣告