PHP-解析驗證碼類--學習筆記

来源:http://www.cnblogs.com/wghao/archive/2016/12/27/6213147.html
-Advertisement-
Play Games

在 網上看到使用PHP寫的ValidateCode生成驗證碼碼類,感覺不錯,特拿來分析學習一下 ...


1.開始

在 網上看到使用PHP寫的ValidateCode生成驗證碼碼類,感覺不錯,特拿來分析學習一下。

 

2.類圖

 

3.驗證碼類部分代碼

3.1  定義變數

    //隨機因數
    private $charset = 'abcdefghjkmnprstuvwxyzABCDEFGJKMNPRSTUVWXYZ23456789';
    private $code;
    private $codeLen = 4;

    private $width = 130;
    private $heigh = 50;
    private $img;//圖像

    private $font;//字體
    private $fontsize = 20;

$charset 是隨機因數,這裡是去掉了幾個不容易區分的字元,如字母"i,l,o,q",數字"0,1"。有必要可以加入一些中文或其他字元或算式等。

$codeLen表示驗證碼長度,常見4位。

3.2構造函數,設置驗證碼字體,生成一個真彩色圖像img

public function __construct()
    {
        $this->font = ROOT_PATH.'/font/Chowderhead.ttf';
        $this->img = imagecreatetruecolor($this->width, $this->heigh);
    }

 

 3.3從隨機因數中隨機抽取4個字元,作為$code驗證碼.

//生成隨機碼
    private function createCode()
    {
        $_len = strlen($this->charset) - 1;
        for ($i = 0; $i < $this->codeLen; $i++) {
            $this->code .= $this->charset[mt_rand(0, $_len)];
        }
    }

3.4生成驗證碼背景色.

//生成背景
    private function createBg()
    {
$color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
        imagefilledrectangle($this->img, 0, $this->heigh, $this->width, 0, $color);

    }

其中mt_rand(157, 255),目的是隨機取比較淺的顏色。

3.5在圖像上生成文字.

//生成文字
    private function createFont()
    {
        $_x = $this->width / $this->codeLen;
        $_y = $this->heigh / 2;
        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(3, 5), $_y + mt_rand(2, 4), $color, $this->font, $this->code[$i]);
        }
    }

在圖像上生成驗證碼文字,主要考慮文字在圖像上的位置和每一個文字顏色。

控制第n個文字的x軸位置 =  (圖像寬度 / 驗證碼長度) * (n-1)  +  隨機的偏移數;  其中n = {d1....n}

控制第n個文字的y軸位置 =  圖像高度 / 2 +  隨機的偏移數;

mt_rand(0, 156) 隨機取文字顏色,0-156目的是取比較深的顏色。

mt_rand(-30, 30) 隨機的文字旋轉。


3.6在圖像上生成線條和雪花

//生成線條,雪花
    private function createLine()
    {
        for ($i = 0; $i < 15; $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->heigh), mt_rand(0, $this->width), mt_rand(0, $this->heigh), $color);
        }
        for ($i = 0; $i < 150; $i++) {
            $color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
            imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->heigh), '#', $color);
        }
    }

畫線條的時候,取比較深的顏色值,而畫雪花的時候取比較淡的顏色值,目的是儘可能的不影響人眼識別驗證碼,又能幹擾自動識別驗證碼機制。

3.7對外生成驗證碼圖像,供外部調用。

//對外生成
    public function doImg()
    {

        $this->createBg();      //1.創建驗證碼背景
        $this->createCode();    //2.生成隨機碼
        $this->createLine();    //3.生成線條和雪花
        $this->createFont();    //4.生成文字
        $this->outPut();        //5.輸出驗證碼圖像
    }

 

3.8完整代碼:

<?php

/**
 * Created by PhpStorm.
 * User: andy
 * Date: 16-12-22
 * Time: 下午1:20
 */
class ValidateCode
{
    //隨機因數
    private $charset = 'abcdefghjkmnprstuvwxyzABCDEFGJKMNPRSTUVWXYZ23456789';
    private $code;
    private $codeLen = 4;

    private $width = 130;
    private $heigh = 50;
    private $img;//圖像

    private $font;//字體
    private $fontsize = 20;


    public function __construct()
    {
        $this->font = ROOT_PATH.'/font/Chowderhead.ttf';
        $this->img = imagecreatetruecolor($this->width, $this->heigh);
    }

    //生成隨機碼
    private function createCode()
    {
        $_len = strlen($this->charset) - 1;
        for ($i = 0; $i < $this->codeLen; $i++) {
            $this->code .= $this->charset[mt_rand(0, $_len)];
        }
    }

    //生成背景
    private function createBg()
    {

        $color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
        imagefilledrectangle($this->img, 0, $this->heigh, $this->width, 0, $color);

    }

    //生成文字
    private function createFont()
    {
        $_x = $this->width / $this->codeLen;
        $_y = $this->heigh / 2;
        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(3, 5), $_y + mt_rand(2, 4), $color, $this->font, $this->code[$i]);
        }
    }

    //生成線條,雪花
    private function createLine()
    {
        for ($i = 0; $i < 15; $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->heigh), mt_rand(0, $this->width), mt_rand(0, $this->heigh), $color);
        }
        for ($i = 0; $i < 150; $i++) {
            $color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
            imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->heigh), '#', $color);
        }
    }

    //輸出圖像
    private function outPut()
    {
        header('Content-Type: image/png');
        imagepng($this->img);
        imagedestroy($this->img);
    }

    //對外生成
    public function doImg()
    {

        $this->createBg();      //1.創建驗證碼背景
        $this->createCode();    //2.生成隨機碼
        $this->createLine();    //3.生成線條和雪花
        $this->createFont();    //4.生成文字
        $this->outPut();        //5.輸出驗證碼圖像
    }

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

}
class code:ValidateCode

 

 

 

4.測試

  測試代碼:

<?php
/**
 * Created by PhpStorm.
 * User: andy
 * Date: 16-12-22
 * Time: 下午1:20
 */

define('ROOT_PATH', dirname(__FILE__));
require_once ROOT_PATH.'/includes/ValidateCode.class.php';

$_vc=new ValidateCode();
echo $_vc->doImg();

生成驗證碼:

5.應用

 

 

<label>
            <img src="../config/code.php" onclick="javascript:this.src='../config/code.php?tm='+Math.random();" />
        </label>

上面onclick代碼是點擊驗證碼圖片,能自動刷新驗證碼。

code.php:

<?php
/**
 * Created by PhpStorm.
 * User: andy
 * Date: 16-12-22
 * Time: 下午3:43
 */
require substr(dirname(__FILE__),0,-7).'/init.inc.php';

$_vc=new ValidateCode();
echo $_vc->doImg();
$_SESSION['ValidateCode']=$_vc->getCode();
View Code

 

有關應用的完整代碼可以從https://git.oschina.net/andywww/myTest 的CMS1.0 文件里下載。

6.小結

    在獨立測試過程,沒發現什麼問題;但應用到項目的時候,剛開始發現無法生成驗證碼圖片,網上找了一下,有的說是在outPut()函數中,

在   header('Content-Type: image/png'); 這行代碼前面增加了一行ob_clean()代碼,可以解決驗證碼這塊問題。雖然此方法簡單,但這可能會引起其他緩衝數據問題,因為db_clean()功能就是丟棄輸出緩衝區中的內容。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...