驗證碼是網站防止機器人惡意註冊、暴力破解的第一道防線。傳統的英數驗證碼雖然常見,但中文漢字驗證碼因字符複雜度高,能有效提升辨識難度,增強安全性。本文將完整示範如何用 PHP 實作一套中文驗證碼系統,涵蓋漢字字庫管理、圖片動態生成、Session 驗證邏輯三大核心模組,程式碼結構清晰,適合直接套用至專案中。
整套系統由三個獨立檔案組成,各司其職:
為避免中文編碼問題,建議將檔案儲存為 UTF-8 格式。字庫陣列可根據業務需求擴充,建議收錄 50 個以上常用漢字以增加組合變化。
<?php
/**
* 檔案: chinesechar.php
* 用途: 中文驗證碼漢字字庫儲存
* 編碼: UTF-8 (建議)
*/
$ChineseChar = array(
"人", "出", "來", "友", "學", "孝", "仁", "義", "禮", "廉",
"忠", "國", "中", "易", "白", "者", "火", "土", "金", "木",
"雷", "風", "龍", "虎", "天", "地", "生", "暈", "菜", "鳥",
"田", "三", "百", "錢", "福", "愛", "情", "獸", "蟲", "魚",
"九", "網", "新", "度", "哎", "唉", "啊", "哦", "儀", "老",
"少", "日", "月", "星"
);
?>
此檔案採用 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);
?>
採用單檔案處理表單顯示與提交驗證,使用 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>
simkai.ttf 放置於專案目錄並使用相對路徑,避免伺服器環境差異導致字體找不到。code.php 中加入亂線、噪點生成邏輯,大幅提升機器辨識難度。iconv 轉碼,減少錯誤點。unset($_SESSION['code']),防止重複使用。若需改為英數驗證碼,只需修改 chinesechar.php 陣列內容:
$ChineseChar = array_merge(
range('A', 'Z'), // 大寫字母
range('a', 'z'), // 小寫字母
range(0, 9) // 數字
);
並移除 code.php 中的 iconv 轉碼即可直接使用。
本文提供的中文驗證碼系統結構清晰、程式碼註解完整,涵蓋字庫管理、圖片生成、前後端驗證全流程。開發者可直接複製套用,並根據專案需求擴充干擾元素、更換字體、調整圖片尺寸等。記住:驗證碼只是第一道防線,配合限制嘗試次數、IP 封鎖、行為分析等措施,才能構建完整的防護體系。