CSRF 保護
- X-XSRF-Token
- #介紹Laravel可以輕鬆使地保護你的應用程式免受cross-site request forgery (CSRF) 攻擊,跨站點請求偽造是一種惡意攻擊,它憑藉已通過身份驗證的用戶身份來運行未經過授權的命令。
無論何時,當您在應用程式中定義HTML 表單時,都應該在表單中包含一個隱藏的CSRF 標記字段,以便CSRF 保護中間件可以驗證該請求,你可以使用 @csrf
Blade 指令來產生令牌字段,如下:<form method="POST" action="/profile"> @csrf ... </form>
VerifyCsrfToken
中間件會自動驗證請求裡的令牌是否與儲存在會話中令牌匹配。 CSRF 令牌& JavaScript當建置由JavaScript 驅動的應用程式時,可以方便的讓JavaScript HTTP
函數庫發起每個請求時自動附上CSRF 令牌。預設情況下,
檔案會以 Axios HTTP 函數庫註冊的 csrf-token
meta 標籤中的值。如果你不使用這個函數庫,你需要手動為你的應用程式配置此行為。
CSRF 白名單
有時候你可能會想要設定一組不需要的 CSRF 保護的 URL 。例如,如果你正在使用 Stripe 處理付款並使用了他們的 webhook 系統,你會需要從 CSRF 的保護中排除 Stripe webhook 處理程序路由,因為 Stripe 不會為你的路由發送 CSRF 令牌。
典型做法,你可以把這類路由放routes/web.php
外,因為RouteServiceProvider
的web
中間件適用於此文件中的所有路由。不過,你也可以透過將這類URL 新增至VerifyCsrfToken
中間件的$except
屬性來排除對這類路由的CSRF 保護,如下所示:
<?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware{ /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ 'stripe/*', 'http://example.com/foo/bar', 'http://example.com/foo/*', ]; }
{tip} 當執行測試時, CSRF 中介軟體會自動停用。
X-CSRF-TOKEN
#除了檢查POST 參數中的CSRF 令牌外, VerifyCsrfToken
中間件也會檢查X-CSRF-TOKEN
# 請求頭。你應該將令牌保存在HTML meta
標籤中,如下:
<meta name="csrf-token" content="{{ csrf_token() }}">
然後,一旦你建立了meta
標籤,就可以指示像jQuery 這樣的函式庫自動將令牌新增至所有請求的頭資訊。也可以為基於 AJAX 的應用提供簡單,方便的 CSRF 保護。如下:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });
{tip} 預設情況下,
resources/js/bootstrap.js
檔案會用Axios HTTP 函數庫註冊csrf-token
meta標籤中的值。如果不使用這個函數庫,則需要為你的應用程式手動配置此行為。
X-XSRF-TOKEN
Laravel 將目前的CSRF 令牌儲存在一個XSRF-TOKEN
cookie
中,該cookie 包含在框架產生的每個回應中。你可以使用 cookie 值來設定 X-XSRF-TOKEN
請求頭。
這個cookie 主要是作為一種方便的方式發送的,因為一些 JavaScript 框架和庫,例如Angular 和Axios ,會自動將它的值放入X-XSRF-TOKEN
頭中。