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

PHP168 CMS 驗證碼機制分析與改良:支援字母數字混合

     編輯:PHP 綜合知識

原始碼分析

原版 yzImg() 使用 GD 繪製 4 字元驗證碼,背景為 26 條直線干擾。關鍵問題:字元來源僅為數字 mt_rand(1,9),定義的字母陣列 $Str[0..2] 從未使用。

核心流程

  1. 生成 4 位隨機字串 yzImgNumRand(4)。
  2. 建立 50x20 真彩色畫布,白底、灰邊框、隨機直線干擾。
  3. 逐字繪製:隨機顏色、隨機位置(x 遞增、y 抖動)、imagechar() 固定字體大小。
  4. 輸出 PNG,銷毀資源。
  5. 不支援 GD 時回退 BMP 位圖硬編碼(極罕見)。

改良:字母數字混合隨機字串

function yzImgNumRand($length = 4) {
    mt_srand((double)microtime() * 1000000); // PHP 4.2+ 可省略
    $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $rand = '';
    for ($i = 0; $i < $length; $i++) {
        $rand .= $chars[mt_rand(0, strlen($chars) - 1)];
    }
    return $rand;
}

進一步強化建議

  • 使用 imagettftext() + TTF 字體,支援抗鋸齒、旋轉、變形,大幅提升機器識別難度。
  • 加入貝茲曲線、噪點、扭曲變形(參考 扭曲旋轉驗證碼)。
  • Session 儲存驗證碼時統一轉大寫或小寫,驗證時同樣處理,避免大小寫困擾使用者。
  • 加入 header('Cache-Control: no-store, must-revalidate'); 防止瀏覽器快取舊圖。

結語

PHP168 原版驗證碼邏輯清晰但強度不足,稍加修改即可支援字母數字混合,結合 TTF 字體與幾何變形可滿足多數中小型專案安全需求。

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