[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