6表单的令牌

添加令牌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',
    ];
复制
上一篇:6内置规则 下一篇:6注解验证