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

PHP 實作中文驗證碼與算術驗證碼完整指南

     編輯:PHP 相關知識

為何需要更強的驗證碼?

傳統純數字或字母驗證碼極易被 OCR 識別或暴力破解,導致表單濫發、惡意註冊等安全風險。採用算術驗證碼(如「3 + 5 = ?」)或中文漢字驗證碼,能大幅提高機器辨識難度,有效阻擋自動化腳本攻擊。

一、算術驗證碼實作

隨機產生兩個數字與運算子(+、-、*),並將答案存入 Session 驗證。為增加難度,支援三種顯示模式:完整算式、缺第一個數、缺第二個數。

<?php
session_start();
header("Content-type: image/png");

$num1 = mt_rand(0, 9);
$num2 = mt_rand(1, 9); // 避免除零
$ops = "+-*";
$op = $ops[mt_rand(0, 2)];
$mode = mt_rand(1, 3);

switch ($mode) {
    case 1: // a + b = ?
        $code = "$num1 $op $num2 = ?";
        $ans = eval("return $num1 $op $num2;");
        $_SESSION['captcha_ans'] = $ans;
        break;
    case 2: // a + ? = c
        $ans = eval("return $num1 $op $num2;");
        $code = "$num1 $op _ = $ans";
        $_SESSION['captcha_ans'] = $num2;
        break;
    case 3: // ? + b = c
        $ans = eval("return $num1 $op $num2;");
        $code = "_ $op $num2 = $ans";
        $_SESSION['captcha_ans'] = $num1;
        break;
}

// 產生圖片
$im = imagecreate(68, 28);
$bg = imagecolorallocate($im, 255, 255, 255);
$text = imagecolorallocate($im, 0, 0, 0);
$noise1 = imagecolorallocate($im, 200, 200, 200);
$noise2 = imagecolorallocate($im, 255, 0, 0);
imagefill($im, 0, 0, $bg);
imagestring($im, 5, 10, 8, $code, $text);

// 加入干擾像素
for ($i = 0; $i < 70; $i++) {
    imagesetpixel($im, mt_rand(0, 58), mt_rand(0, 28), $text);
    imagesetpixel($im, mt_rand(0, 58), mt_rand(0, 28), $noise1);
    imagesetpixel($im, mt_rand(0, 58), mt_rand(0, 28), $noise2);
}
imagepng($im);
imagedestroy($im);
?>

二、中文漢字驗證碼實作

從常用漢字庫隨機抽取 4 個字,使用 TrueType 字體繪製,並加入干擾線與噪點。

<?php
session_start();
// 常用漢字庫(約 1000 字)
$chars = "的一是在了不和有大這主中人上為們地個用工時要動國產以我到他會作來分生對於學下級就年階義發成部民可出能方進同行面說種過命度革而多子後自社加小機也經力線本電高量長黨得實家定深法表著水理化爭現所二起政三好十戰無農使性前等反體合斗路圖把結第裡正新開論之物從當兩些還天資事隊批如應形想制心樣干都向變關點育重其思與間內去因件日利相由壓員氣業代全組數果期導平各基或月毛然問比展那它最及外沒看治提五解系林者米群頭意只明四道馬認次文通但條較克又公孔領軍流入接席位情運器並飛原油放立題質指建區驗活眾很教決特此常石強極土少已根共直團統式轉別造切九你取西持總料連任志觀調七麼山程百報更見必真保熱委手改管處己將修支識病象幾先老光專什六型具示復安帶每東增則完風回南廣勞輪科北打積車計給節做務被整聯步類集號列溫裝即毫知軸研單色堅據速防史拉世設達爾場織歷花受求傳口斷況采精金界品判參層止邊清至萬確究書術狀廠須離再目海交權且兒青才證低越際八試規斯近注辦布門鐵需走議縣兵固除般引齒千勝細影濟白格效置推空配刀葉率述今選養德話查差半敵始片施響收華覺備名紅續均藥標記難存測士身緊液派准斤角降維板許破述技消底床田勢端感往神便賀村構照容非搞亞磨族火段算適講按值美態黃易彪服早班麥削信排台聲該擊素張密害侯草何樹肥繼右屬市嚴徑螺檢左頁抗蘇顯苦英快稱壞移約巴材省黑武培著河帝僅針怎植京助升王眼她抓含苗副雜普談圍食射源例致酸舊卻充足短劃劑宣環落首尺波承粉踐府魚隨考刻靠夠滿夫失包住促枝局菌桿周護巖師舉曲春元超負砂封換太模貧減陽揚江析畝木言球朝醫校古呢稻宋聽唯輸滑站另衛字鼓剛寫劉微略范供阿塊某功套友限項余倒卷創律雨讓骨遠幫初皮播優占死毒圈偉季訓控激找叫雲互跟裂糧粒母練塞鋼頂策雙留誤礎吸阻故寸盾晚絲女散焊功株親院冷徹彈錯散商視藝滅版烈零室輕血倍缺厘泵察絕富城沖噴壤簡否柱李望盤磁雄似困鞏益洲脫投送奴側潤蓋揮距觸星松送獲興獨官混紀依未突架寬冬章濕偏紋吃執閥礦寨責熟穩奪硬價努翻奇甲預職評讀背協損棉侵灰雖矛厚羅泥辟告卵箱掌氧恩愛停曾溶營終綱孟錢待盡俄縮沙退陳討奮械載胞幼哪剝迫旋征槽倒握擔仍呀鮮吧卡粗介鑽逐弱腳怕鹽末陰豐編印蜂急拿擴傷飛露核緣游振操央伍域甚迅輝異序免紙夜鄉久隸缸夾念蘭映溝乙嗎儒殺汽磷艱晶插埃燃歡鐵補咱芽永瓦傾陣碳演威附牙芽永瓦斜灌歐獻順豬洋腐請透司危括脈宜笑若尾束壯暴企菜穗楚漢愈綠拖牛份染既秋遍鍛玉夏療尖殖井費州訪吹榮銅沿替滾客召旱悟刺腦措貫藏敢令隙爐殼硫煤迎鑄粘探臨薄旬善福縱擇禮願伏殘雷延煙句純漸耕跑澤慢栽魯赤繁境潮橫掉錐希池敗船假亮謂托伙哲懷割擺貢呈勁財儀沉煉麻罪祖息車穿貨銷齊鼠抽畫飼龍庫守築房歌寒喜哥洗蝕廢納腹乎錄鏡婦惡脂莊擦險贊鐘搖典柄辯竹谷賣亂虛橋奧伯趕垂途額壁網截野遺靜謀弄掛課鎮妄盛耐援扎慮鍵歸符慶聚繞摩忙舞遇索顧膠羊湖釘仁音跡碎伸燈避泛亡答勇頻皇柳哈揭甘諾概憲濃島襲誰洪謝炮澆斑訊懂靈蛋閉孩釋乳巨徒私銀伊景坦累勻霉杜樂勒隔彎績招紹胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗鹼殊崗挖氏刃劇堆赫荷胸衡勤膜篇登駐案刊秧緩凸役剪川雪鏈漁啦臉戶洛孢勃盟買楊宗焦賽旗濾硅炭股坐蒸凝竟陷槍黎救冒暗洞犯筒您宋弧爆謬塗味津臂障褐陸啊健尊豆拔莫抵桑坡縫警挑污冰柬嘴啥飯塑寄趙喊墊康遵牧遭幅園腔訂香肉弟屋敏恢忘衣孫齡嶺騙休借丹渡耳刨虎筆稀昆浪薩茶滴淺擁穴覆倫娘噸浸袖珠雌媽紫戲塔錘震歲貌潔剖牢鋒疑霸閃埔猛訴刷狠忽災鬧喬唐漏聞沈熔氯荒莖男凡搶像漿旁玻亦忠唱蒙予紛捕鎖尤乘烏智淡允叛畜俘摸銹掃畢璃寶芯爺鑒秘淨蔣鈣肩騰枯拋軌堂拌爸循誘祝勵肯酒繩窮塘燥泡袋朗喂鋁軟渠顆慣貿糞綜牆趨彼屆墨礙啟逆卸航霧冠丙街萊貝輻腸付吉滲瑞驚頓擠秒懸姆爛森糖聖凹陶詞遲蠶億矩";

$len = mb_strlen($chars, 'utf-8');
$code = '';
for ($i = 0; $i < 4; $i++) {
    $code .= mb_substr($chars, mt_rand(0, $len - 1), 1, 'utf-8');
}
$_SESSION['captcha_ans'] = $code;

// 圖片設定
$im = imagecreate(100, 50);
$bg = imagecolorallocate($im, 255, 255, 255);
$font = 'simhei.ttf'; // 需放置於同目錄
$color = imagecolorallocate($im, 0, 0, 0);

// 干擾線
for ($i = 0; $i < 50; $i++) {
    $lineColor = imagecolorallocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
    imageline($im, mt_rand(0,100), mt_rand(0,50), mt_rand(0,100), mt_rand(0,50), $lineColor);
}

// 繪製文字
for ($i = 0; $i < 4; $i++) {
    imagettftext($im, mt_rand(18,20), mt_rand(-20,20), 
        ($i * 25) + 10, mt_rand(30, 40), $color, $font, $code[$i]);
}
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>

關鍵注意事項

  • 字體檔案:需下載 simhei.ttf(黑體)放置於腳本同目錄。
  • Session 一致性:直接瀏覽驗證碼圖片 URL 會導致 Session 不同步,必須透過 <img src="captcha.php"> 嵌入頁面才能正確驗證。
  • 安全性:避免使用 eval(),建議改用 match 或函式對應運算;生產環境請加入更強干擾(扭曲、旋轉、背景圖)。

前端驗證範例

<form action="verify.php" method="post">
    驗證碼:<input type="text" name="captcha">
    <img src="captcha_math.php" onclick="this.src='captcha_math.php?'+Math.random()">
    <button type="submit">送出</button>
</form>

驗證邏輯:if ($_POST['captcha'] === $_SESSION['captcha_ans']) 即可判斷是否通過。

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