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

PHP 中文驗證碼完整實作教學:從字庫建立到圖片生成與驗證

     編輯:PHP 相關知識

前言

驗證碼是網站防止機器人惡意註冊、暴力破解的第一道防線。傳統的英數驗證碼雖然常見,但中文漢字驗證碼因字符複雜度高,能有效提升辨識難度,增強安全性。本文將完整示範如何用 PHP 實作一套中文驗證碼系統,涵蓋漢字字庫管理、圖片動態生成、Session 驗證邏輯三大核心模組,程式碼結構清晰,適合直接套用至專案中。

系統架構概覽

整套系統由三個獨立檔案組成,各司其職:

  • chinesechar.php:專門存放漢字字庫陣列,集中管理可用字符,避免編碼亂碼問題。
  • code.php:驗證碼圖片生成核心,負責從字庫隨機抽取字符、繪製干擾元素、輸出 PNG 圖片並寫入 Session。
  • check.php:前端表單與後端驗證邏輯,接收使用者輸入並與 Session 比對,回傳驗證結果。

核心程式碼詳細解析

1. 漢字字庫定義 (chinesechar.php)

為避免中文編碼問題,建議將檔案儲存為 UTF-8 格式。字庫陣列可根據業務需求擴充,建議收錄 50 個以上常用漢字以增加組合變化。

<?php
/**
 * 檔案: chinesechar.php
 * 用途: 中文驗證碼漢字字庫儲存
 * 編碼: UTF-8 (建議)
 */
$ChineseChar = array(
    "人", "出", "來", "友", "學", "孝", "仁", "義", "禮", "廉",
    "忠", "國", "中", "易", "白", "者", "火", "土", "金", "木",
    "雷", "風", "龍", "虎", "天", "地", "生", "暈", "菜", "鳥",
    "田", "三", "百", "錢", "福", "愛", "情", "獸", "蟲", "魚",
    "九", "網", "新", "度", "哎", "唉", "啊", "哦", "儀", "老",
    "少", "日", "月", "星"
);
?>

2. 驗證碼圖片生成核心 (code.php)

此檔案採用 GD2 函式庫繪圖,關鍵步驟包含:建立真彩色畫布、分配顏色、隨機抽取 4 個漢字、使用 TrueType 字體繪製、輸出圖片並銷毀資源。特別注意 iconv 轉碼處理,確保漢字正確渲染。

<?php
/**
 * 檔案: code.php
 * 用途: 中文驗證碼圖片動態生成
 * 依賴: GD2 擴充套件、simkai.ttf 字體檔
 */
include_once("chinesechar.php");
session_start();

// 設定輸出為 PNG 圖片
header("Content-type: image/png");

// 建立 120x30 像素真彩色畫布
$im = imagecreatetruecolor(120, 30);

// 顏色分配:白色文字、黑色背景
$fontcolor = imagecolorallocate($im, 255, 255, 255);
$bg = imagecolorallocate($im, 0, 0, 0);
imagefill($im, 0, 0, $bg); // 填充背景

// 從字庫隨機抽取 4 個漢字組合驗證碼
$text = "";
for ($i = 0; $i < 4; $i++) {
    $text .= $ChineseChar[array_rand($ChineseChar)];
}

// 寫入 Session 供後續驗證
$_SESSION['code'] = $text;

// 設定字體路徑 (需確認伺服器實際路徑)
$font = 'simkai.ttf'; // 楷體字體檔

// 繪製文字:座標 (11,21)、字體大小 18、無旋轉
// 關鍵: iconv 將 GB2312 轉 UTF-8 避免亂碼
imagettftext($im, 18, 0, 11, 21, $fontcolor, $font, iconv("GB2312", "UTF-8", $text));

// 輸出並釋放資源
imagepng($im);
imagedestroy($im);
?>

3. 前端表單與驗證邏輯 (check.php)

採用單檔案處理表單顯示與提交驗證,使用 strcasecmp 不分大小寫比對 (中文無大小寫,但保留習慣),回傳綠色成功或紅色失敗訊息。

<?php
/**
 * 檔案: check.php
 * 用途: 驗證碼表單顯示與後端驗證
 */
session_start();
$errorMSG = '';

// 偵測表單提交
if (!is_null($_POST['check'])) {
    if (strcasecmp($_SESSION['code'], $_POST['code']) == 0) {
        $errorMSG = '<p style="font-size:12px;color:#009900">驗證成功!</p>';
    } else {
        $errorMSG = '<p style="font-size:12px;color:#FF0000">驗證失敗!</p>';
    }
}
?>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>中文驗證碼測試</title>
</head>
<body>
    <?php if ($errorMSG) echo $errorMSG; ?>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
        請輸入驗證碼:<input type="text" name="code" style="width:80px">
        <img src="code.php" alt="驗證碼" style="vertical-align:middle; cursor:pointer;" onclick="this.src='code.php?'+Math.random()" title="點擊更換">
        <br><br>
        <input type="submit" name="check" value="提交驗證">
    </form>
</body>
</html>

進階優化建議

  1. 字體部署:將 simkai.ttf 放置於專案目錄並使用相對路徑,避免伺服器環境差異導致字體找不到。
  2. 干擾元素:在 code.php 中加入亂線、噪點生成邏輯,大幅提升機器辨識難度。
  3. 編碼統一:全專案統一使用 UTF-8,移除 iconv 轉碼,減少錯誤點。
  4. Session 安全:驗證成功後立即 unset($_SESSION['code']),防止重複使用。
  5. 無障礙支援:提供音頻驗證碼替代方案,照顧視障使用者。

快速切換至英數驗證碼

若需改為英數驗證碼,只需修改 chinesechar.php 陣列內容:

$ChineseChar = array_merge(
    range('A', 'Z'), // 大寫字母
    range('a', 'z'), // 小寫字母
    range(0, 9)      // 數字
);

並移除 code.php 中的 iconv 轉碼即可直接使用。

總結

本文提供的中文驗證碼系統結構清晰、程式碼註解完整,涵蓋字庫管理、圖片生成、前後端驗證全流程。開發者可直接複製套用,並根據專案需求擴充干擾元素、更換字體、調整圖片尺寸等。記住:驗證碼只是第一道防線,配合限制嘗試次數、IP 封鎖、行為分析等措施,才能構建完整的防護體系。

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