CSRF 保護


CSRF - 白名單

##X-CSRF-Token
  • X-XSRF-Token
  • #介紹Laravel可以輕鬆使地保護你的應用程式免受cross-site request forgery (CSRF) 攻擊,跨站點請求偽造是一種惡意攻擊,它憑藉已通過身份驗證的用戶身份來運行未經過授權的命令。
Laravel 會自動為每個活躍的使用者的會話產生 CSRF「令牌」。此令牌用於驗證經過身份驗證的使用者是否是向應用程式發出請求的使用者。

無論何時,當您在應用程式中定義HTML 表單時,都應該在表單中包含一個隱藏的CSRF 標記字段,以便CSRF 保護中間件可以驗證該請求,你可以使用 @csrf

Blade 指令來產生令牌字段,如下:
<form method="POST" action="/profile">
    @csrf  
     ...
  </form>
包含在web 中間件群組裡 

VerifyCsrfToken

 中間件會自動驗證請求裡的令牌是否與儲存在會話中令牌匹配。

CSRF 令牌& JavaScript

當建置由JavaScript 驅動的應用程式時,可以方便的讓JavaScript HTTP函數庫發起每個請求時自動附上CSRF 令牌。預設情況下,

resources/js/bootstrap.js

檔案會以 Axios HTTP 函數庫註冊的  csrf-token  meta 標籤中的值。如果你不使用這個函數庫,你需要手動為你的應用程式配置此行為。


CSRF 白名單

有時候你可能會想要設定一組不需要的 CSRF 保護的 URL 。例如,如果你正在使用  Stripe 處理付款並使用了他們的 webhook 系統,你會需要從 CSRF 的保護中排除 Stripe webhook 處理程序路由,因為 Stripe 不會為你的路由發送 CSRF 令牌。

典型做法,你可以把這類路由放routes/web.php 外,因為RouteServiceProviderweb 中間件適用於此文件中的所有路由。不過,你也可以透過將這類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頭中。

本篇首刊在 LearnKu.com 網站上。