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

PHP 實現仿 QQ 風格驗證碼完整範例

     編輯:PHP 相關知識

本文提供一個完整的 PHP 驗證碼生成類,模仿 QQ 註冊/登入時的驗證碼風格,支援 GD 庫繪圖、Session 儲存、防重複請求、多種干擾效果。

核心功能

  • 隨機生成 4 位大寫字母驗證碼
  • 使用 GD 庫繪製圖片(背景色、干擾線、隨機字體大小/顏色/位置)
  • Session 儲存驗證碼(小寫),5 秒內重複請求不更新
  • 支援輸出 PNG/JPEG 格式,自動送出防快取 Header
  • 無 GD 庫環境時回退輸出預設圖片

完整程式碼

<?php
/**
 * 仿 QQ 驗證碼
 */
// Session 存儲路徑設定
$sessSavePath = dirname(__FILE__) . "/../data/sessions/";
if (is_writeable($sessSavePath) && is_readable($sessSavePath)) {
    session_save_path($sessSavePath);
}
session_start();

// 產生隨機字串
$rndstring = '';
for ($i = 0; $i < 4; $i++) {
    $rndstring .= chr(mt_rand(65, 90));
}
$img_height = 45;
$img_width = 10;

if (function_exists("imagecreate")) {
    // 防止 Firefox 短時間多次請求導致驗證碼變更
    $ntime = time();
    if (empty($_SESSION['dd_ckstr_last']) || empty($_SESSION['dd_ckstr']) || ($ntime - $_SESSION['dd_ckstr_last'] > 5)) {
        $_SESSION['dd_ckstr'] = strtolower($rndstring);
        $_SESSION['dd_ckstr_last'] = $ntime;
    }
    $rndstring = $_SESSION['dd_ckstr'];
    $rndcodelen = strlen($rndstring);

    // 建立圖片
    $im = imagecreate(46, 20);
    ImageColorAllocate($im, 240, 243, 248); // 背景色

    // 干擾線
    $lineColor1 = ImageColorAllocate($im, mt_rand(174,218), mt_rand(190,225), mt_rand(217,237));
    for ($j = 1; $j <= 2; $j = $j + 3) {
        imageline($im, 0, $j + mt_rand(1,15), 48, $j + mt_rand(1,15), $lineColor1);
    }

    // 繪製文字
    $fontColor = ImageColorAllocate($im, mt_rand(0,150), mt_rand(0,150), mt_rand(0,150));
    for ($i = 0; $i < $rndcodelen; $i++) {
        $bc = mt_rand(0,1);
        $rndstring[$i] = strtoupper($rndstring[$i]);
        imagestring($im, mt_rand(3,5), $i * $img_height/4 + mt_rand(1,5), mt_rand(1, $img_width/2), $rndstring[$i], $fontColor);
    }

    // 防快取 Header
    header("Pragma: no-cache\r\n");
    header("Cache-Control: no-cache\r\n");
    header("Expires: 0\r\n");

    // 輸出圖片(優先 PNG)
    if (function_exists("imagepng")) {
        header("content-type: image/png\r\n");
        imagepng($im);
    } else {
        header("content-type: image/jpeg\r\n");
        imagejpeg($im);
    }
    ImageDestroy($im);
    exit();
} else {
    // 無 GD 庫:回退輸出預設圖片
    $_SESSION['dd_ckstr'] = "abcd";
    $_SESSION['dd_ckstr_last'] = '';
    header("content-type: image/png\r\n");
    header("Pragma: no-cache\r\n");
    header("Cache-Control: no-cache\r\n");
    header("Expires: 0\r\n");
    $fp = fopen("data/vdcode.jpg", "r");
    echo fread($fp, filesize("data/vdcode.jpg"));
    fclose($fp);
    exit();
}
?>

使用方式

  1. 將程式碼存為 captcha.php。
  2. 在表單中用 <img src="captcha.php"> 顯示驗證碼。
  3. 驗證時比對 $_SESSION['dd_ckstr'](已轉小寫)與用戶輸入(轉小寫)。

關鍵細節說明

  • Session 路徑自訂:避免共享主機環境下 Session 檔案衝突。
  • 5 秒緩衝:防止瀏覽器預載或重複請求導致驗證碼異步變更。
  • 隨機干擾:字體大小、顏色、位置全隨機,增加機器識別難度。
  • 優雅降級:無 GD 時輸出靜態圖片,確保功能可用。

此範例可直接整合至專案,或作為客製化驗證碼的基礎模板。

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