溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP制作圖形驗(yàn)證碼

發(fā)布時(shí)間:2020-05-20 15:18:30 來(lái)源:億速云 閱讀:251 作者:鴿子 欄目:編程語(yǔ)言

驗(yàn)證碼使用場(chǎng)景

我們?cè)陂_(kāi)發(fā)系統(tǒng)的過(guò)程中,基本所有的系統(tǒng)都會(huì)涉及到登錄模塊,其中驗(yàn)證碼功能是這里面必不可少的一塊,是防止系統(tǒng)被爆破的有效途徑。所謂道高一尺魔高一丈,現(xiàn)在的驗(yàn)證碼越來(lái)越復(fù)雜先進(jìn),常見(jiàn)的字母數(shù)字驗(yàn)證碼,行為驗(yàn)證碼。本文詳細(xì)介紹簡(jiǎn)單的字母數(shù)字驗(yàn)證碼。

代碼

<?php

/*********************************************************************************
 * InitPHP 3.8.2 國(guó)產(chǎn)PHP開(kāi)發(fā)框架   擴(kuò)展類庫(kù)-驗(yàn)證碼
 *-------------------------------------------------------------------------------
 * 版權(quán)所有: CopyRight By initphp.com
 * 您可以自由使用該源碼,但是在使用過(guò)程中,請(qǐng)保留作者信息。尊重他人勞動(dòng)成果就是尊重自己
 *-------------------------------------------------------------------------------
 * Author:zhuli Dtime:2014-11-25
 ***********************************************************************************/
class Code
{

    private $charset = "abcdefghjklmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";   //隨機(jī)因子
    private $code;     //驗(yàn)證碼文字
    private $codelen = 4;    //驗(yàn)證碼顯示幾個(gè)文字
    private $width = 100;   //驗(yàn)證碼寬度
    private $height = 40;   //驗(yàn)證碼高度
    private $img;       //驗(yàn)證碼資源句柄
    private $font;     //指定的字體
    private $fontsize = 20;  //指定的字體大小
    private $fontcolor;     //字體顏色  隨機(jī)

    //構(gòu)造類  編寫(xiě)字體
    public function __construct()
    {
        $this->font = '/outputs/font/font.ttf';
    }

    //創(chuàng)建4個(gè)隨機(jī)碼
    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['VerifyCode'] = strtolower($this->code);
        Session::set('VerifyCode', strtolower($this->code));
        return $this->code;
    }

    //創(chuàng)建背景
    private function createBg()
    {
        //創(chuàng)建畫(huà)布 給一個(gè)資源jubing
        $this->img = imagecreatetruecolor($this->width, $this->height);
        //背景顏色
        $color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
        //畫(huà)出一個(gè)矩形
        imagefilledrectangle($this->img, 0, $this->height, $this->width, 0, $color);
    }

    //創(chuàng)建字體
    private function createFont()
    {
        $_x = ($this->width / $this->codelen);   //字體長(zhǎng)度
        for ($i = 0; $i < $this->codelen; $i++) {
            //文字顏色
            $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
            //資源句柄 字體大小 傾斜度 字體長(zhǎng)度  字體高度  字體顏色  字體  具體文本
            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]);
        }
    }

    //隨機(jī)線條
    private function createLine()
    {
        //隨機(jī)線條
        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);
        }
        //隨機(jī)雪花
        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), '*', $color);
        }
    }

    //輸出背景
    private function outPut()
    {
        //生成標(biāo)頭
        header('Content-type:image/png');
        //輸出圖片
        imagepng($this->img);
        //銷毀結(jié)果集
        imagedestroy($this->img);
    }

    //對(duì)外輸出
    public function doimg()
    {
        //加載背景
        $this->createBg();
        //加載文件
        $this->createCode();
        //加載線條
        $this->createLine();
        //加載字體
        $this->createFont();
        //加載背景
        $this->outPut();
    }

    //獲取驗(yàn)證碼
    public function getCode()
    {
        return strtolower($this->code);
    }

    //驗(yàn)證驗(yàn)證碼
    public function checkCode($code, $clear = false)
    {
//        session_start();
        if (Session::get('VerifyCode') == strtolower($code)) {
            if($clear) $this->clearCode();
            return true;
        }
        if($clear) $this->clearCode();
        return false;
    }

    //清除驗(yàn)證碼
    public function clearCode()
    {
        Session::del('VerifyCode');
//        session_start();
//        unset ($_SESSION['VerifyCode']);
    }
}

驗(yàn)證

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

這樣即可輸出如下驗(yàn)證碼

PHP制作圖形驗(yàn)證碼

可以調(diào)整參數(shù)控制驗(yàn)證碼的大小,干擾項(xiàng)等。

拓展

接下來(lái)介紹下拓展的功能,怎么加強(qiáng)驗(yàn)證碼的干擾項(xiàng),怎么結(jié)合到項(xiàng)目麗進(jìn)行登錄驗(yàn)證。

1. 加強(qiáng)干擾

首先我們可以看到上面的截圖中少數(shù)線條,如果外者使用分析工具來(lái)解碼,那么會(huì)很簡(jiǎn)單的就解出我們的驗(yàn)證碼,這時(shí)候就需要添加線條的數(shù)量,在代碼中找到以下代碼并修改

//隨機(jī)線條
private function createLine()
{
    //隨機(jī)線條 
    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);
    }
    //隨機(jī)雪花
    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), '*', $color);
    }
}

上面的數(shù)字6可以慢慢調(diào)整,然后查看效果直到滿意。同時(shí)可以看到驗(yàn)證碼中有很多雪花效果,這個(gè)也是干擾項(xiàng),可以修改上面的數(shù)字45來(lái)調(diào)整到自己滿意的結(jié)果。

注意:代碼中的$charset變量,驗(yàn)證碼是從這邊隨機(jī)取字符來(lái)生存驗(yàn)證,由于小寫(xiě)的i和L展示的效果很難分辨,所以我們?nèi)コ薸字符。

2. 接入項(xiàng)目驗(yàn)證

新建個(gè)文件,代碼如下

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

然后在現(xiàn)有的系統(tǒng)登錄頁(yè)面引入這個(gè)接口即可展示驗(yàn)證碼,在用戶填寫(xiě)提交之后,服務(wù)端做以下驗(yàn)證

//驗(yàn)證驗(yàn)證碼
public function checkCode($code, $clear = false)
{
    if (Session::get('VerifyCode') == strtolower($code)) {
        if($clear) $this->clearCode();
            return true;
    }
    if($clear) $this->clearCode();
    return false;
}
//清除驗(yàn)證碼
public function clearCode()
{
    Session::del('VerifyCode');
}

以上就是PHP生成圖形驗(yàn)證碼(加強(qiáng)干擾型)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注億速云其它相關(guān)文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI