### 表单令牌Token
* 0\. 前言
* 1\. TP6 令牌token使用
* * 1.1 表单提交
* 1.2 AJAX提交
* 2\. TP6 令牌token验证
* * 2.1 路由验证
* 2.2 控制器验证
* 2.3 验证器验证
# 0\. 前言
表单令牌是为了防止表单重复提交,防止跨站请求伪造(`Cross-site request forgery`),也被称为`one-click attack`或者`session riding`,通常缩写为`CSRF`或者`XSRF`。
# 1\. TP6 令牌token使用
## 1.1 表单提交
如果使用了默认的模板引擎,可以直接使用下面的方式:
~~~html
<input type="hidden" name="__token__" value="{:token()}" />
~~~
也可以直接使用
~~~html
{:token_field()}
~~~
默认的令牌Token名称是`__token__`,如果需要自定义名称及令牌生成规则可以使用
~~~html
{:token_field('__hash__', 'md5')}
~~~
第二个参数表示`token`的生成规则,也可以使用闭包。
## 1.2 AJAX提交
如果是AJAX提交的表单,可以将`token`设置在meta中:
~~~html
<meta name="csrf-token" content="{:token()}">
~~~
或者直接使用:
~~~html
{:token_meta()}
~~~
然后在全局`Ajax`中使用这种方式设置`X-CSRF-Token`请求头并提交:
~~~javascript
$.ajaxSetup({headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')}
});
~~~
# 2\. TP6 令牌token验证
## 2.1 路由验证
然后在路由规则定义中,使用
~~~php
Route::post('blog/save','blog/save')->token();
~~~
如果自定义了`token`名称,需要改成
~~~php
Route::post('blog/save','blog/save')->token('__hash__');
~~~
令牌检测如果不通过,会抛出`think\exception\ValidateException`异常。
## 2.2 控制器验证
控制器里面手动进行令牌验证
~~~php
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');}// ...}
}
~~~
如果修改了`token`或`token`不存在,就会报错:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210102164102672.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3p5MTI4MTUzOTYyNg==,size_16,color_FFFFFF,t_70)
## 2.3 验证器验证
在你的验证规则中,添加token验证规则即可
~~~php
protected $rule = ['name' => 'require|max:25|token','email' => 'email',
];
~~~
如果你的令牌名称不是`__token__`(假设是`__hash__`),验证器中需要改为:
~~~php
protected $rule = ['name' => 'require|max:25|token:__hash__','email' => 'email',
];
~~~
https://blog.csdn.net/zy1281539626/article/details/112081702
- 空白目录
- 使用thinkphp6搭建后端api接口流程
- tp6 uniapp vue 前后端跨域解决方案
- 操作记录
- api00
- 你看看有没有用
- 6666
- Docker安装LNMP环境的详细过程(可部署TP项目)
- LNMP部署thinkphp
- 玩客云Armbian 安装LNMP环境 Docker
- ThinkPHP6项目基操(16.实战部分 redis+token登录)
- ThinkPHP6项目基操(11.实战部分 部署后台静态页面模板及后台登录页面)
- ThinkPHP6项目基操(13.实战部分 项目中的自定义异常处理总结 错误页面API错误)
- ThinkPHP6项目基操(14.实战部分 中间件处理登录流程)
- ThinkPHP6项目基操(12.实战部分 验证码)
- ThinkPHP6项目基操(18.实战部分 表单令牌Token 防CSRF)
- ThinkPHP6项目基操(19.实战部分 Mysql模型事务操作)
- ThinkPHP6项目基操(20.实战部分 数据库操作返回值总结)
- 浏览器端判断当前设备的运行环境
- api
- api异常捕捉
- 写一个中间件
- 统一的参数返回形式
- ThinkPHP6调用模型的方法
- thinkphp6控制器、验证器、模型、service,各层写的内容