用途
- 有效方式防止重复提交,
- 以及跨站伪造请求(anti csrf)
特点
- 随机性
- 不可预测
原理
原理上都是通过session token来实现的。
当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,然后将Token发给客户端(一般通过构造hidden表单)。
下次客户端提交请求时,Token会随着表单一起提交到服务器端。
然后,如果应用于“anti csrf攻击”,则服务器端会对Token值进行验证,判断是否和session中的Token值相等,若相等,则可以证明请求有效,不是伪造的。
用法
在表单中添加
<input type="hidden" name="__hash__" value="{$Request.token}" />
或者
{:token()}
在验证器中添加规则,验证是否符合
protected $rule = [
'__token__' => 'require|token',
];
protected $message = [
'__token__.require' => '非法提交',
'__token__.token' => '请不要重复提交表单'
];
因为数据表中没有__hash__
字段,要删除表单提交过来中数据中的__hash__
字段
控制器中使用自动逸令牌规则,调用Request
类
$token = $this->request->token('__token__', 'sha1');
$this->assign('token', $token);
评论