ThinkPHP6项目基操(18.实战部分 表单令牌Token 防CSRF)
项目 实战 部分 表单 18 Token CSRF ThinkPHP6
2023-09-11 14:19:17 时间
0. 前言
表单令牌是为了防止表单重复提交,防止跨站请求伪造(Cross-site request forgery
),也被称为 one-click attack
或者 session riding
,通常缩写为 CSRF
或者 XSRF
。
1. TP6 令牌token使用
1.1 表单提交
如果使用了默认的模板引擎,可以直接使用下面的方式:
<input type="hidden" name="__token__" value="{:token()}" />
也可以直接使用
{:token_field()}
默认的令牌Token名称是__token__
,如果需要自定义名称及令牌生成规则可以使用
{:token_field('__hash__', 'md5')}
第二个参数表示token
的生成规则,也可以使用闭包。
1.2 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')
}
});
2. TP6 令牌token验证
2.1 路由验证
然后在路由规则定义中,使用
Route::post('blog/save','blog/save')->token();
如果自定义了token
名称,需要改成
Route::post('blog/save','blog/save')->token('__hash__');
令牌检测如果不通过,会抛出think\exception\ValidateException
异常。
2.2 控制器验证
控制器里面手动进行令牌验证
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
不存在,就会报错:
2.3 验证器验证
在你的验证规则中,添加token验证规则即可
protected $rule = [
'name' => 'require|max:25|token',
'email' => 'email',
];
如果你的令牌名称不是__token__
(假设是__hash__
),验证器中需要改为:
protected $rule = [
'name' => 'require|max:25|token:__hash__',
'email' => 'email',
];
⭐️重磅推荐:免费商用电商系统
😏想白嫖整个电商系统用来商用?
🤑想有自己的商城实现财富自由?
🤓想学习最佳实践提升自己技术?
快来进入🚀 传送门 🚀,开源免费、完整示例带你快速入门,轻松二开,走上人生巅峰!👨🎓
相关文章
- Netty 100万级到亿级流量 高并发 仿微信 IM后台 开源项目实战
- 解决IDEA部署web项目时,jar包拷贝不全的问题
- .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了 [WPF]为旧版本的应用添加触控支持 js css等静态文件版本控制,一处配置多处更新.net版【原创】 C#图片处理,缩略图制作 SqlDataReader 结果集 转成 DataTable DataTable转成List集合 如何使用linq读取DataTable集合?
- vue.js+koa2项目实战(五)axios 及 vue2.0 子组件和父组件之间的传值
- React Native商城项目实战11 - 个人中心头部内容
- React Native商城项目实战03 - 包装Navigator
- React Native商城项目实战02 - 主要框架部分(tabBar)
- react-native 项目实战 -- 新闻客户端(1) -- 初始化项目结构
- 企业级网关 Kong 部署 Spring Boot 项目实战
- STM32MP157开发板Linux+Qt项目实战:智能猫眼
- 扫盲!金融项目RAC整体迁移“避坑”实施方案
- 精通Python网络爬虫:核心技术、框架与项目实战.3.3 网页更新策略
- 推荐一个C++枚举转字符串的开源项目magic_enum
- 【Selenium项目实战】完成测试项目用例(管理员用户登录案例):实现验证码正确和错误测试
- 【接口测试】Day8-IHRM项目实战
- SAP 不支持交货单中同一个物料多个行项目HU与序列号组合发货场景
- 《Python极客项目编程 》——第一部分 热身运动 第1章 解析iTunes播放列表 1.1 iTunes播放列表文件剖析
- redux项目实战应用笔录
- ThinkPHP6项目基操(14.实战部分 中间件处理登录流程)
- 微信小程序实战–集阅读与电影于一体的小程序项目(五)
- IDEA新建MAVEN项目时速度缓慢
- 粗暴将tinymce富文本编辑器整合到vue项目
- 迪拜200MW塔式光热项目收到30份投标意向书
- C++ LinuxWebServer项目(6)压力测试与优化思考
- Django电商项目---完成注册页面和用户登录day1
- laravel实战化项目之三板斧
- STM32物联网项目-SPI通信总线
- IDEA从零到精通(18)之IDEA中用https://start.spring.io创建springboot项目
- 通过APScheduler使用定时任务对openstack的VM虚拟机和计算节点compute node 分别进行cpu、memory、traffic资源统计项目实战及实现源码(五)