## 添加令牌`Token`验证
验证规则支持对表单的令牌验证,首先需要在你的表单里面增加下面隐藏域:
```
<input type="hidden" name="__token__" value="{:token()}" />
```
也可以直接使用
~~~
{:token_field()}
~~~
默认的令牌Token名称是`__token__`,如果需要自定义名称及令牌生成规则可以使用
~~~
{:token_field('__hash__', 'md5')}
~~~
第二个参数表示token的生成规则,也可以使用闭包。
如果你没有使用默认的模板引擎,则需要自己生成表单隐藏域
~~~
namespace app\controller;
use think\Request;
use think\facade\View;
class Index
{
public function index(Request $request)
{
$token = $request->buildToken('__token__', 'sha1');
View::assign('token', $token);
return View::fetch();
}
}
~~~
然后在模板表单中使用:
~~~
<input type="hidden" name="__token__" value="{$token}" />
~~~
## AJAX提交
如果是AJAX提交的表单,可以将`token`设置在`meta`中
```
<meta name="csrf-token" content="{:token()}">
```
或者直接使用
```
{:token_meta()}
```
然后在全局Ajax中使用这种方式设置`X-CSRF-Token`请求头并提交:
~~~
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
~~~
## 路由验证
然后在路由规则定义中,使用
~~~
Route::post('blog/save','blog/save')->token();
~~~
如果自定义了`token`名称,需要改成
~~~
Route::post('blog/save','blog/save')->token('__hash__');
~~~
令牌检测如果不通过,会抛出`think\exception\ValidateException`异常。
## 控制器验证
如果没有使用路由定义,可以在控制器里面手动进行令牌验证
~~~
namespace app\controller;
use think\exception\ValidateException;
use think\Request;
class Index
{
public function index(Request $request)
{
$check = $request->checkToken('__token__');
if(false === $check) {
throw new ValidateException('invalid token');
}
// ...
}
}
~~~
提交数据默认获取`post`数据,支持指定数据进行`Token`验证。
~~~
namespace app\controller;
use think\exception\ValidateException;
use think\Request;
class Index
{
public function index(Request $request)
{
$check = $request->checkToken('__token__', $request->param());
if(false === $check) {
throw new ValidateException('invalid token');
}
// ...
}
}
~~~
## 使用验证器验证
在你的验证规则中,添加`token`验证规则即可,例如,如果使用的是验证器的话,可以改为:
~~~
protected $rule = [
'name' => 'require|max:25|token',
'email' => 'email',
];
~~~
如果你的令牌名称不是`__token__`(假设是`__hash__`),验证器中需要改为:
~~~
protected $rule = [
'name' => 'require|max:25|token:__hash__',
'email' => 'email',
];
~~~
- 序言
- 基础
- 安装
- 开发规范
- 目录结构
- 配置
- 架构
- 请求流程
- 架构总览
- 入口文件
- 多应用模式
- URL访问
- 容器和依赖注入
- 服务
- 门面
- 中间件
- 事件
- 路由
- 路由定义
- 变量规则
- 路由地址
- 路由参数
- 路由中间件
- 路由分组
- 资源路由
- 注解路由
- 路由绑定
- 域名路由
- MISS路由
- 跨域请求
- URL生成
- 控制器
- 控制器定义
- 基础控制器
- 空控制器
- 资源控制器
- 控制器中间件
- 请求
- 请求对象
- 请求信息
- 输入变量
- 请求类型
- HTTP头信息
- 伪静态
- 参数绑定
- 请求缓存
- 响应
- 响应输出
- 响应参数
- 重定向
- 文件下载
- 数据库
- 连接数据库
- 分布式数据库
- 查询构造器
- 查询数据
- 添加数据
- 更新数据
- 删除数据
- 查询表达式
- 链式操作
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- cacheAlways
- comment
- fetchSql
- force
- partition
- failException
- sequence
- replace
- extra
- duplicate
- procedure
- 聚合查询
- 分页查询
- 时间查询
- 高级查询
- 视图查询
- JSON字段
- 子查询
- 原生查询
- 获取查询参数
- 查询事件
- 获取器
- 事务操作
- 存储过程
- 数据集
- 数据库驱动
- 模型
- 定义
- 模型字段
- 新增
- 更新
- 删除
- 查询
- 查询范围
- JSON字段
- 获取器
- 修改器
- 搜索器
- 数据集
- 自动时间戳
- 只读字段
- 软删除
- 类型转换
- 模型输出
- 模型事件
- 模型关联
- 一对一关联
- 一对多关联
- 远程一对多
- 远程一对一
- 多对多关联
- 多态关联
- 关联预载入
- 关联统计
- 关联输出
- 虚拟模型
- 视图
- 模板变量
- 视图过滤
- 模板渲染
- 模板引擎
- 视图驱动
- 错误和日志
- 异常处理
- 日志处理
- 调试
- 调试模式
- Trace调试
- SQL调试
- 变量调试
- 远程调试
- 验证
- 验证器
- 验证规则
- 错误信息
- 验证场景
- 路由验证
- 内置规则
- 表单令牌
- 注解验证
- 杂项
- 缓存
- Session
- Cookie
- 多语言
- 上传
- 命令行
- 启动内置服务器
- 查看版本
- 自动生成应用目录
- 创建类库文件
- 清除缓存文件
- 生成数据表字段缓存
- 生成路由映射缓存
- 输出路由定义
- 自定义指令
- Debug输出级别
- 扩展库
- 数据库迁移工具
- Workerman
- think助手工具库
- 验证码
- Swoole
- 附录
- 助手函数
- 升级指导
- 更新日志