账户中心 退出系统
开发文档 资讯·分享 技术交流 会员登录
phpGrace GSCMS 公众号系统
session令牌

session 令牌以 session 为基础创建令牌,通过令牌机制可以有效防止重复提交,并对机器人有一定的拦截作用。
工具类 : grace\tool\token

1. 自己编写验证过程

1.1 在表单中使用隐藏域设置令牌(AJAX 提交同理)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
    <link rel="stylesheet" type="text/css" href="/static/main.css" />
    <script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/3.1.0/jquery-3.1.0.min.js"></script>
</head>
<body>
<div style="padding:100px;">
    <form action="" method="post">
        <input type="text" name="name" />
        <input type="text" name="age" />
        <input type="hidden" name="__token__" value="<?php echo $this->token->makeASessionToken();?>" />
        <input type="submit" value="提交"/>
    </form>
</div>
</body>
</html>

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

<?php
namespace grace\controller;
use grace\grace;
use grace\tool\token;
use grace\tool\validate;

class index extends grace{

    public function index(){
        // 实例化 token 操作对象
        // 通过 $this-> 方式共享给视图
        $this->token = new token();
        // 判断 post 提交
        if(!empty($_POST)) {
            // 比对 token
            if(empty($_POST['__token__'])){
                exit('令牌数据错误');
            }
            $res = $this->token->checkSessionToken($_POST['__token__']);
            if($res){
                echo '令牌数据验证成功';
            }else{
                echo '令牌数据验证失败';
            }
            exit;
        }
    }

}

2 自动验证 token

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

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
    <link rel="stylesheet" type="text/css" href="/static/main.css" />
    <script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/3.1.0/jquery-3.1.0.min.js"></script>
</head>
<body>
<div style="padding:100px;">
    <form action="" method="post">
        <input type="text" name="name" />
        <input type="text" name="age" />
        <input type="hidden" name="__token__" value="<?php echo $this->token->makeASessionToken();?>" />
        <input type="submit" value="提交"/>
    </form>
</div>
</body>
</html>

2.2 在进行数据验证时自动验证 token

<?php
namespace grace\controller;
use grace\grace;
use grace\tool\token;
use grace\tool\validate;

class index extends grace{

    // 依赖注入 token 操作对象
    public function index(token $token){

    }

    // 使用资源方法处理 POST
    public function __indexPOST(){
        // 利用数据验证类自动验证 token
        $rule = array(
            'name' => array('string', '1,100', '请填写姓名')
        );
        $validate = new validate($_POST, $rule, true);
        $res = $validate->check();
        if($res){
            echo '验证成功';
        }else{
            echo $validate->error;
        }
    }

}

token 获取说明

使用 checkSessionToken() 验证后,工具类会自动注销 session 中记录的 token,所以某个具体的 token 只能验证一次!