首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 實作驗證碼類別:含干擾像素、自適應尺寸與 Session 整合

     編輯:PHP 綜合知識

驗證碼是表單防刷、防機器人提交的基礎防線。本文提供一個完整的 CCheckCodeFile 類別,封裝了驗證碼生成、圖片繪製、干擾點繪製、字元渲染與輸出流程,支援自訂圖片寬高、驗證碼位數,適合直接整合至專案中。

類別核心功能架構

  • OutFileHeader():發送 Content-type: image/png 標頭。
  • CreateCheckCode():以 md5(rand()) 取前 N 碼大寫字元作為驗證碼。
  • CreateImage():建立 GD 圖片資源,填充淺灰背景。
  • SetDisturbColor():繪製 128 個隨機顏色、隨機位置的干擾像素。
  • WriteCheckCodeToImage():逐字元以隨機顏色、隨機 Y 軸位置繪製至圖片。
  • OutCheckImage():串聯上述流程,輸出 PNG 並銷毀資源。
class CCheckCodeFile {
    private $mCheckCodeNum = 4;
    private $mCheckCode = '';
    private $mCheckImage = '';
    private $mDisturbColor = '';
    private $mCheckImageWidth = 80;
    private $mCheckImageHeight = 20;

    private function OutFileHeader() { header("Content-type: image/png"); }

    private function CreateCheckCode() {
        $this->mCheckCode = strtoupper(substr(md5(rand()), 0, $this->mCheckCodeNum));
        return $this->mCheckCode;
    }

    private function CreateImage() {
        $this->mCheckImage = @imagecreate($this->mCheckImageWidth, $this->mCheckImageHeight);
        imagecolorallocate($this->mCheckImage, 200, 200, 200);
        return $this->mCheckImage;
    }

    private function SetDisturbColor() {
        for ($i = 0; $i <= 128; $i++) {
            $this->mDisturbColor = imagecolorallocate($this->mCheckImage, rand(0,255), rand(0,255), rand(0,255));
            imagesetpixel($this->mCheckImage, rand(2,128), rand(2,38), $this->mDisturbColor);
        }
    }

    private function WriteCheckCodeToImage() {
        for ($i = 0; $i < $this->mCheckCodeNum; $i++) {
            $bg_color = imagecolorallocate($this->mCheckImage, rand(0,255), rand(0,128), rand(0,255));
            $x = floor($this->mCheckImageWidth / $this->mCheckCodeNum) * $i;
            $y = rand(0, $this->mCheckImageHeight - 15);
            imagechar($this->mCheckImage, 5, $x, $y, $this->mCheckCode[$i], $bg_color);
        }
    }

    public function SetCheckImageWH($width, $height) {
        if ($width === '' || $height === '') return false;
        $this->mCheckImageWidth = $width;
        $this->mCheckImageHeight = $height;
        return true;
    }

    public function OutCheckImage() {
        $this->OutFileHeader();
        $this->CreateCheckCode();
        $this->CreateImage();
        $this->SetDisturbColor();
        $this->WriteCheckCodeToImage();
        imagepng($this->mCheckImage);
        imagedestroy($this->mCheckImage);
    }
}

// 使用方式
$captcha = new CCheckCodeFile();
// $captcha->SetCheckImageWH(100, 50); // 可選:自訂尺寸
$captcha->OutCheckImage();
// 前端驗證時,需將生成的 $captcha->mCheckCode 存入 Session 比對

安全性與優化建議

💡 改進方向:
  • 字型升級:使用 imagettftext() 載入 TTF 字型,支援中文、斜體、扭曲效果,大幅提升辨識難度。
  • 干擾線/曲線:加入 imageline()、imagebezier() 繪製干擾線條。
  • Session 整合:實際部署時,需在 CreateCheckCode() 後將驗證碼寫入 $_SESSION['captcha'],驗證時比對並銷毀。
  • 資源檢查:確認伺服器已安裝 php-gd 擴展並支援 PNG。

此類別提供了驗證碼生成的完整骨架,開發者可依專案安全需求逐步強化圖形複雜度與驗證邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved