同福

做个web框架(18)——验证码工具对象TFSafeCode的实现【20201205】

介绍

介绍

福哥今天要带着大家给我们的TFPHP框架添加一个工具对象TFSafeCode,这个工具对象是用来生成验证码和校验验证码的。验证码大家都很熟悉了,就是在诸如:注册、登录等等重要的操作时候除了表单自有的项目之外还会有一个验证码项目,这个验证码五花八门什么样式的都有,其目的就是防止黑客使用机器人模拟用户来操作这个表单。

今天福哥要在TFPHP框架里面添加一个TFSafeCode工具对象,在TFSafeCode对象里面实现随机码型验证码的功能,我们这个TFSafeCode对象只实现逻辑部分,显示验证码图片功能需要交给工程师自己去实现。

TFSafeCode

这个验证码工具对象TFSafeCode存放在TFPHP\Text\Code\TFSafeCode.inc.php里面,对象构造器函数需要传入TFPHP实例。

代码

createLengthCode

private function a(int $a=4,int $b=TFSafeCode::T_LC_TYPE_NUM):string{
    if($a<=0){
        $a=4;
    }
    $c="abcdefghijklmnopqrstuvwxyz";
    $d="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $e="1234567890";
    switch($b){
        case TFSafeCode::T_LC_TYPE_NUM:$f=$e;
        break;
        case TFSafeCode::T_LC_TYPE_ALPHA:$f=$d;
        break;
        case TFSafeCode::T_LC_TYPE_COMPLEX:$f=$e.$d;
        break;
        case TFSafeCode::T_LC_TYPE_COMPLEX_CASE:$f=$e.$c.$d;
        break;
        default:$f=$e;
    }
    $g=strlen($f);
    $h="";
    for($i=0;
    $i<$a;
    $i++){
        $h.=$f[rand(0,$g-1)];
    }
    return $h;
}

createSN

private function b(string $a,string $b):string{
    $c=date("YmdHi00",strtotime($b));
    $d=md5($a.$c.$this->b);
    return substr($d,8,16);
}

create

public function create(array $a=null){
    if($a==null){
        $a=array();
    }
    $b=intval($a['length']);
    $c=intval($a['type']);
    $this->c=$this->a($b,$c);
    $this->d=$this->b($this->c,date("Y-m-d H:i:s"));
}

verify

public function verify(string $a,string $b):bool{
    if($this->b($b,date("Y-m-d H:i:s"))==$a||$this->b($b,date("Y-m-d H:i:s",strtotime("-1 min")))==$a){
        return true;
    }
    return false;
}

讲解

TFSafeCode

createLengthCode

这里比较复杂,福哥一点一点解锁,童鞋们仔细听了。

首先建立了三组备用码库,包括小写字母、大写字母、数字。

然后根据验证码类型分为了四种组合方式。

最后使用rand函数取得一个介于0到最大码库长度的随机数字,使用这个数字作为码库下标获取对应的码,将每次随机到的码拼接到一起就是验证码了。

createSN

我们不可能把原始验证码放到页面上和用户天下的验证码一起回传回来,那样用户查看网页源代码就什么都知道了。

所以福哥建立一个SN编码,使用了私钥和时间码一起拼凑成一个字符串,再取它的MD5哈希码,最后从中间截取一部分作为SN码。

create

这个方法就是会调用createLengthCode和createSN两个方法,创建验证码和SN码。

verfiy

这个方法就是会使用SN码和用户提交的验证码进行匹配,如果匹配成功了就表示验证通过了。

因为我们的SN码的最小单位是分,所以超过2分钟的码是无法通过验证的。

使用

福哥在index.inc.php里面使用了一下这个验证码对象TFSafeCode,可以看到分配的code和sn在一定时间内可以通过验证,超过2分钟后就无法通过验证了。

8511a1a2aba06af2.jpg392827baf830a790.jpg

总结

今天福哥带着童鞋们给TFPHP框架添加了一个工具对象TFSafeCode,使用TFSafeCode可以实现验证的生产和验证码的校验操作。不过,我们在使用它的时候还需要自己实现将文字验证码通过图片显示出来的功能,因为TFSafeCode没有实现这一部分功能。

下一课,我们将在TFUMS系统的注册页面里面使用验证码对象TFSafeCode,给我们的TFUMS系统的注册功能增加图片验证码。

P.S.

今天开始福哥在教程里面给出代码会使用代码混淆技术进行混淆,混淆后的代码中的大部分变量会变成类似a、b、c、d、e、f这样的无意义字母,其目的就是要防止源代码被剽窃。

福哥不希望我们辛辛苦苦地开发出来的项目被其他人拿去当成他自己的东西,甚至还有可能说是我们盗用他的代码。

代码虽然被混淆了,但是福哥会一一讲解给童鞋们听,所以希望童鞋们可以理解!