HTTP層 —— CSRF保護

 

簡介

跨站請求僞造是一種經過假裝受權用戶的請求來利用授信網站的惡意漏洞。Laravel 使得防止應用遭到跨站請求僞造攻擊變得簡單。php

Laravel 自動爲每個被應用管理的有效用戶會話生成一個 CSRF 「令牌」,該令牌用於驗證受權用戶和發起請求者是不是同一我的。laravel

任什麼時候候在 Laravel 應用中定義HTML表單,都須要在表單中引入CSRF令牌字段,這樣CSRF保護中間件纔可以正常驗證請求。想要生成包含 CSRF 令牌的隱藏輸入字段,可使用輔助函數 csrf_field 來實現:web

<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

中間件組 web 中的中間件VerifyCsrfToken 會自動爲咱們驗證請求輸入的 token 值和 Session 中存儲的 token 是否一致。ajax

從 CSRF 保護中排除指定 URL

有時候咱們須要從 CSRF 保護中排除一些 URL,例如,若是你使用了 Stripe 來處理支付並用到他們的 webhook 系統,這時候就須要從 Laravel 的 CSRF 保護中排除  webhook 處理器路由,由於Stripe並不知道要傳什麼token值給咱們定義的路由。數組

一般咱們須要將這種類型的路由放到文件 routes/web.php 裏,中間件組 web 以外。此外,你也能夠在 VerifyCsrfToken 中間件中將要排除的 URL 添加到 $except 屬性數組:框架

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
    /**
     *從CSRF驗證中排除的URL
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
    ];
}
X-CSRF-Token

除了將 CSRF 令牌做爲 POST 參數進行驗證外,還能夠經過設置 X-CSRF-Token 請求頭來實現驗證,VerifyCsrfToken 中間件會檢查 X-CSRF-TOKEN 請求頭,首先建立一個 meta 標籤並將令牌保存到該 meta 標籤:函數

<meta name="csrf-token" content="{{ csrf_token() }}">

而後在 js 庫(如 jQuery)中添加該令牌到全部請求頭,這爲基於 AJAX 的應用提供了簡單、方便的方式來避免 CSRF 攻擊:網站

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
X-XSRF-Token

Laravel 還會將 CSRF 令牌保存到名爲 XSRF-TOKEN 的 Cookie 中,你可使用該 Cookie 值來設置 X-XSRF-TOKEN請求頭。一些 JavaScript 框架,好比  Angular,會爲你自動進行設置,基本上你不太須要手動設置這個值。spa

相關文章
相關標籤/搜索