Maison >développement back-end >tutoriel php >PHP génère un code de vérification graphique (type d'interférence amélioré)

PHP génère un code de vérification graphique (type d'interférence amélioré)

安安杰尼
安安杰尼original
2020-04-30 16:05:58195801parcourir

Scénarios d'utilisation du code de vérification

Dans le processus de développement du système, pratiquement tous les systèmes impliqueront le module de connexion, dont la fonction de code de vérification est un élément indispensable pour empêcher l'explosion efficace du système. . Comme le dit le proverbe, le diable est aussi haut que la route. De nos jours, les codes de vérification sont de plus en plus complexes et avancés. Les codes de vérification alphanumériques courants et les codes de vérification comportementale sont courants. Cet article détaille les codes de vérification alphanumériques simples.

Code

<?php

/*********************************************************************************
 * InitPHP 3.8.2 国产PHP开发框架   扩展类库-验证码
 *-------------------------------------------------------------------------------
 * 版权所有: CopyRight By initphp.com
 * 您可以自由使用该源码,但是在使用过程中,请保留作者信息。尊重他人劳动成果就是尊重自己
 *-------------------------------------------------------------------------------
 * Author:zhuli Dtime:2014-11-25
 ***********************************************************************************/
class Code
{

    private $charset = "abcdefghjklmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";   //随机因子
    private $code;     //验证码文字
    private $codelen = 4;    //验证码显示几个文字
    private $width = 100;   //验证码宽度
    private $height = 40;   //验证码高度
    private $img;       //验证码资源句柄
    private $font;     //指定的字体
    private $fontsize = 20;  //指定的字体大小
    private $fontcolor;     //字体颜色  随机

    //构造类  编写字体
    public function __construct()
    {
        $this->font = &#39;/outputs/font/font.ttf&#39;;
    }

    //创建4个随机码
    private function createCode()
    {
        $_leng = strlen($this->charset) - 1;
        for ($i = 1; $i <= $this->codelen; $i++) {
            $this->code .= $this->charset[mt_rand(0, $_leng)];
        }
//        session_start();
//        $_SESSION[&#39;VerifyCode&#39;] = strtolower($this->code);
        Session::set(&#39;VerifyCode&#39;, strtolower($this->code));
        return $this->code;
    }

    //创建背景
    private function createBg()
    {
        //创建画布 给一个资源jubing
        $this->img = imagecreatetruecolor($this->width, $this->height);
        //背景颜色
        $color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
        //画出一个矩形
        imagefilledrectangle($this->img, 0, $this->height, $this->width, 0, $color);
    }

    //创建字体
    private function createFont()
    {
        $_x = ($this->width / $this->codelen);   //字体长度
        for ($i = 0; $i < $this->codelen; $i++) {
            //文字颜色
            $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
            //资源句柄 字体大小 倾斜度 字体长度  字体高度  字体颜色  字体  具体文本
            imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x * $i + mt_rand(1, 5), $this->height / 1.4, $color, $this->font, $this->code[$i]);
        }
    }

    //随机线条
    private function createLine()
    {
        //随机线条
        for ($i = 0; $i < 6; $i++) {
            $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
            imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color);
        }
        //随机雪花
        for ($i = 0; $i < 45; $i++) {
            $color = imagecolorallocate($this->img, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255));
            imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), &#39;*&#39;, $color);
        }
    }

    //输出背景
    private function outPut()
    {
        //生成标头
        header(&#39;Content-type:image/png&#39;);
        //输出图片
        imagepng($this->img);
        //销毁结果集
        imagedestroy($this->img);
    }

    //对外输出
    public function doimg()
    {
        //加载背景
        $this->createBg();
        //加载文件
        $this->createCode();
        //加载线条
        $this->createLine();
        //加载字体
        $this->createFont();
        //加载背景
        $this->outPut();
    }

    //获取验证码
    public function getCode()
    {
        return strtolower($this->code);
    }

    //验证验证码
    public function checkCode($code, $clear = false)
    {
//        session_start();
        if (Session::get(&#39;VerifyCode&#39;) == strtolower($code)) {
            if($clear) $this->clearCode();
            return true;
        }
        if($clear) $this->clearCode();
        return false;
    }

    //清除验证码
    public function clearCode()
    {
        Session::del(&#39;VerifyCode&#39;);
//        session_start();
//        unset ($_SESSION[&#39;VerifyCode&#39;]);
    }
}

Vérification

ob_clean();
$verify = new Code();
$verify->doimg();

De cette façon, vous pouvez afficher le code de vérification suivant

PHP génère un code de vérification graphique (type dinterférence amélioré)

Les paramètres peuvent être ajustés pour contrôler la taille du code de vérification, les éléments d'interférence, etc.

Extension

Ensuite, nous présenterons la fonction d'expansion, comment renforcer les éléments d'interférence du code de vérification et comment l'intégrer dans le projet pour la vérification de connexion.

1. Renforcer les interférences

Tout d'abord, nous pouvons voir quelques lignes dans la capture d'écran ci-dessus. Si des étrangers utilisent des outils d'analyse pour décoder, il sera facile de décoder. résoudre. Pour générer notre code de vérification, vous devez ajouter le nombre de lignes à ce moment. Recherchez le code suivant dans le code et modifiez le numéro 6 ci-dessus

//随机线条
private function createLine()
{
    //随机线条 
    for ($i = 0; $i < 6; $i++) {
        $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
        imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color);
    }
    //随机雪花
    for ($i = 0; $i < 45; $i++) {
        $color = imagecolorallocate($this->img, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255));
        imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), &#39;*&#39;, $color);
    }
}

Vous pouvez l'ajuster lentement, puis vérifier. L'effet jusqu'à ce que vous soyez satisfait. En même temps, vous pouvez voir qu'il existe de nombreux effets de flocon de neige dans le code de vérification. Il s'agit également d'un élément d'interférence. Vous pouvez modifier le numéro 45 ci-dessus pour obtenir un résultat satisfaisant.

Remarque : La variable $charset dans le code, le code de vérification sélectionne au hasard les caractères d'ici pour survivre à la vérification, car l'effet d'affichage i et L minuscules est difficile à distinguer, Nous avons donc supprimé le caractère i.

2. Accédez à la vérification du projet

Créez un nouveau fichier avec le code suivant

Ensuite, introduisez-le dans la page de connexion du système existant. L'interface peut afficher le code de vérification. Une fois que l'utilisateur a rempli et soumis, le serveur effectue la vérification suivante

//验证验证码
public function checkCode($code, $clear = false)
{
    if (Session::get(&#39;VerifyCode&#39;) == strtolower($code)) {
        if($clear) $this->clearCode();
            return true;
    }
    if($clear) $this->clearCode();
    return false;
}
//清除验证码
public function clearCode()
{
    Session::del(&#39;VerifyCode&#39;);
}

À ce stade, la génération du code de vérification et le processus de vérification sont terminés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn