### 表單令牌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`不存在,就會報錯:

## 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,各層寫的內容