[TOC]
# CSRF 保護
## 介紹
web 中間件組的`VerifyCsrfToken`中間件自動驗證請求里的令牌是否與存儲在會話中令牌匹配。
```
// 使用`@csrf`Blade 指令來生成令牌字段
<form method="POST" action="/profile">
@method('PUT')
@csrf
</form>
<form method="POST" action="/profile">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
```
## CSRF 白名單
可以把路由放`routes/web.php`外,或者可以通過將 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/*',
];
}
>[success] 當運行測試時, 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')
}
});
```
>[danger] 默認`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`頭中。
- 入門指南
- 安裝
- 部署
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- URL
- Session
- 表單驗證
- 錯誤
- 日志
- 前端開發
- Blade 模板
- 本地化
- 腳手架
- 編譯資源 Mix
- 安全相關
- 用戶認證
- API 認證
- 綜合話題
- 命令行
- 廣播
- 緩存
- 集合
- 事件
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 速查表
- Artisan
- Auth
- Blade
- Cache
- Collection
- Composer
- Config
- Container
- Cookie
- DB
- Environment
- Event
- File
- Helper
- Input
- Lang
- Log
- Model
- Pagination
- Queue
- Redirect
- Request
- Response
- Route
- SSH
- Schema
- Security
- Session
- Storage
- String
- URL
- UnitTest
- Validation
- View