什么是表单令牌验证
表单令牌验证是一种防止站点受到跨站点攻击(CSRF)的技术。CSRF攻击是一种利用已登录用户的身份来提交非法请求的攻击方式。攻击者构造出跨站请求伪造的页面引诱用户打开,并利用脚本自动提交表单等方式,以用户的名义完成非法操作。
可以理解为,表单令牌验证是一种验证机制,能够辨别请求的来源是否是正常用户,如果验证出请求来源异常,请求将会被拒绝。
ThinkPHP6中如何使用表单令牌验证
创建表单
1.首先,在表单中添加一个隐藏的标签,并将它的value值设置为表单令牌:
<form action="submit.php" method="POST">
<input type="hidden" name="__token__" value="__token__" />
<input type="text" name="username" />
<input type="submit" value="提交" />
</form>
2. 接下来,在提交表单的控制器中添加如下代码:
public function submit()
{
// 验证表单令牌
$this->validateToken();
// 其他操作
}
生成表单令牌
在ThinkPHP6中,生成表单令牌非常简单,只需要调用框架提供的方法即可。
use think\facade\Session;
// 生成表单令牌
$token = Session::token();
// 在视图中输出表单令牌
echo '<input type="hidden" name="__token__" value="' . $token . '" />';
验证表单令牌
验证表单令牌也非常简单,只需要在控制器中调用validateToken()方法即可:
use think\facade\Session;
use think\exception\HttpException;
protected function validateToken()
{
if (!Session::has('token') || empty($this->request->post('__token__')) || Session::pull('token') !== $this->request->post('__token__')) {
throw new HttpException(403, 'Invalid token');
}
}
总结
通过文章的学习,我们知道了什么是表单令牌验证,以及在ThinkPHP6中如何使用它。表单令牌验证可以有效预防站点受到CSRF等攻击,保障站点的安全性。