易于使用的表单令牌
最编程
2024-04-05 10:08:35
...
简单易用的表单令牌
表单令牌可以提升表单验证的易用和安全性
表单令牌可以提升表单验证的易用和安全性
添加令牌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', ]
推荐阅读
-
Microsoft 365:使用 Microsoft 表单生成调查问卷的技巧
-
web3 产品介绍:Metamask 钱包 一个更易于使用 dapp 的钱包
-
在 Django 中使用 python 的 django-mptt 库来实现无限级树结构非常直观且易于实现
-
使用 JWT、Interceptor 和 ThreadLocal 在任何位置获取令牌中的信息,并将其与自定义注解相结合,实现方法的身份验证。
-
关于使用后端实现动态表单功能的见解
-
易于使用的 Window10 k8s
-
易于使用的表单令牌
-
漂亮的福利图片 API 界面,免费且易于使用
-
用于 "GitHub 热点 "的 5 个易于使用的开源项目
-
GitHub 开源项目权限管理--账户和个人令牌访问的使用