* * * * *
[TOC]
## 簡介
Laravel 提供了簡單的方法使你的應用免受?[跨站請求偽造](https://en.wikipedia.org/wiki/Cross-site_request_forgery)?(CSRF) 的襲擊。跨站請求偽造是一種惡意的攻擊,它憑借已通過身份驗證的用戶身份來運行未經過授權的命令。
Laravel 為每個活躍用戶的 Session 自動生成一個 CSRF 令牌。該令牌用來核實應用接收到的請求是通過身份驗證的用戶出于本意發送的。
任何情況下在你的應用程序中定義 HTML 表單時都應該包含 CSRF 令牌隱藏域,這樣 CSRF 保護中間件才可以驗證請求。輔助函數?`csrf_field`?可以用來生成令牌字段:
~~~
<form method="POST" action="/profile">
{{ csrf_field() }}
...
</form>
~~~
包含在?`web`?中間件組里的?`VerifyCsrfToken`?[中間件](中間件.md)會自動驗證請求里的令牌?`token`?與 Session 中存儲的令牌?`token`?是否匹配。
## CSRF 令牌和 Vue
如果你使用?[Vue.js](https://vuejs.org/)?框架,沒有?`make:auth`?命令提供的身份驗證過渡,那么你需要在你應用的主要布局中手動定義一個?`Laravel`?Javascript對象。這個對象會指定 Vue 在做請求時需要的 CSRF 令牌:
~~~
<script>
window.Laravel = {!! json_encode([
'csrfToken' => csrf_token(),
]) !!};
</script>
~~~
## CSRF 白名單
有時候你可能希望設置一組并不需要 CSRF 保護的 URI。例如,如果你正在使用?[Stripe](https://stripe.com/)?處理付款并使用了他們的 webhook 系統,你會需要將 Stripe webhook 處理的路由排除在 CSRF 保護外,因為 Stripe 并不知道發送給你路由的 CSRF 令牌是什么。
一般地,你可以把這類路由放到?`web`?中間件外,因為?`RouteServiceProvider`?適用于?`routes/web.php`?中的所有路由。不過如果一定要這么做,你也可以將這類 URI 添加到?`VerifyCsrfToken`?中間件中的?`$except`?屬性來排除對這類路由的 CSRF 保護:
~~~
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
/**
* 這些 URI 會被免除 CSRF 驗證
*
* @var array
*/
protected $except = [
'stripe/*',
];
}
~~~
## X-CSRF-TOKEN
除了檢查 POST 參數中的 CSRF token 外,`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')
}
});
~~~
## X-XSRF-TOKEN
Laravel 將當前的 CSRF 令牌存儲在由框架生成的每個響應中包含的一個`XSRF-TOKEN`?cookie 中。你可以使用該令牌的值來設置 X-XSRF-TOKEN 請求頭信息。
這個 cookie 作為頭信息發送主要是為了方便,因為一些 JavaScript 框架,如 Angular,會自動將其值添加到?`X-XSRF-TOKEN`?頭中.
- 前言
- 翻譯說明
- 發行說明
- 升級說明
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 請求周期
- 開發環境部署
- Homestead
- Valet
- 核心概念
- 服務容器
- 服務提供者
- Facades
- Contracts
- HTTP層
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- Session
- 表單驗證
- 前端
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- 用戶認證
- Passport OAuth 認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 錯誤與日志
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- 序列化
- 測試
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Scout 全文搜索
- Socialite 社會化登錄