表单令牌

功能介绍

表单令牌可以有效防止重复提交,并对机器人有一定的拦截作用,在 phpGrace 的支持下( 利用 cookie ),实现这样的功能是非常简单的。

1. setToken() 设置token

在表单中使用隐藏域设置令牌,如:

<form action="" method="post">
    <input type="text" name="name" />
    <input type="text" name="age" />
    <input type="hidden" name="__token__" value="<?php echo \setToken();?>" />
    <input type="submit" value="提交"/>
</form>

2. getToken() 获取令牌的值

在控制器内获取表单提交信息,并校验令牌,如:

<?php
class indexController extends grace {
    public function index(){
        if(PG_POST){
            if(empty($_POST['__token__'])){exit('错误 : 表单令牌为空');}
            $token = \getToken();
            echo "系统记录的 token:{$token}<br />";
            echo "POST数据中的 token:{$_POST['__token__']}<br />";

            if($token == $_POST['__token__']){
                echo 'ok';
            }else{
                echo 'token 错误';
            }
            p($_POST);
        }
    }
}

token 获取说明

getToken() 获取token 后会注销 cookie 中记录的 token,所以某个具体的 token 只能获取一次!

在数据验证过程中自动验证 token

3.1 遵循规则:表单内隐藏域的名称为 : __token__

<form action="" method="post">
    <input type="text" name="name" />
    <input type="text" name="age" />
    <input type="hidden" name="__token__" value="<?php echo \setToken();?>" />
    <input type="submit" value="提交"/>
</form>

3.2 在进行数据验证是设置验证token,如 :

<?php
class indexController extends grace {
    public function index(){
        if(PG_POST){
            $checkRules = array(
                'name'  => array('string', '2,10', '姓名应为 2 - 10 字符')
            );
            //第三个参数为可选参数,设置为true时自动检查 Token
            $checker = new \phpGrace\tools\dataChecker($_POST, $checkRules, true);
            $res = $checker->check();
            if($res){
                echo '验证通过';
                p($_POST);
            }else{
                echo $checker->error;
            }
        }
    }
}