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

PHP 實作中文驗證碼與算式驗證碼(GD 庫繪製干擾線/點)

     編輯:PHP 相關知識

PHP 實作中文驗證碼與算式驗證碼(GD 庫繪製干擾線/點)

簡單數字/字母驗證碼易被識別,採用算式或中文漢字可大幅提高辨識難度。本文提供兩種完整 GD 繪圖實作。

1. 算式驗證碼

隨機產生 數字 運算元 數字 = ? 或 數字 運算元 _ = 結果 等三種模式,儲存正確答案至 Session。

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

$num1 = mt_rand(0, 9);
$num2 = mt_rand(1, 9);
$type_str = "+-*";
$type = substr($type_str, rand(0, 2), 1);
$change = mt_rand(1, 3);

if ($change == 1) {
    $code = "$num1$type$num2=?";
    eval("\$verifyCode=$num1$type$num2;");
    $_SESSION['authnum_session'] = $verifyCode;
} elseif ($change == 2) {
    eval("\$verifyCode=$num1$type$num2;");
    $code = "$num1$type\_=$verifyCode";
    $_SESSION['authnum_session'] = $num2;
} else {
    eval("\$verifyCode=$num1$type$num2;");
    $code = "_$type$num2=$verifyCode";
    $_SESSION['authnum_session'] = $num1;
}

$im = imagecreate(68, 28);
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);
$gray = imagecolorallocate($im, 200, 200, 200);
$red = imagecolorallocate($im, 255, 0, 0);
imagefill($im, 0, 0, $white);
imagestring($im, 5, 10, 8, $code, $black);

// 干擾點
for ($i = 0; $i < 70; $i++) {
    imagesetpixel($im, mt_rand(0, 58), mt_rand(0, 28), $black);
    imagesetpixel($im, mt_rand(0, 58), mt_rand(0, 28), $red);
    imagesetpixel($im, mt_rand(0, 58), mt_rand(0, 28), $gray);
}
imagepng($im);
imagedestroy($im);
?>

2. 中文漢字驗證碼

從超大字串池隨機抽取 4 個漢字,使用 TrueType 字體(simhei.ttf)繪製,並加入干擾線與弧線。

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

header("Content-type: image/PNG");
$image_x = 100; $image_y = 50;
$im = imagecreate($image_x, $image_y);
$bkg = imagecolorallocate($im, 255, 255, 255);
$fnt = "simhei.ttf"; // 需放置於同目錄
$white = imagecolorallocate($im, 234, 185, 95);
$rectangle_color = imagecolorallocate($im, 0xAA, 0xAA, 0xAA);
$noise_color = imagecolorallocate($im, 0x00, 0x00, 0x00);
$font_color = imagecolorallocate($im, 0x00, 0x00, 0x00);

// 干擾弧線與線條
imagearc($im, 150, 8, 20, 20, 75, 170, $white);
imagearc($im, 180, 7, 50, 30, 75, 175, $white);
imageline($im, 20, 20, 180, 30, $white);
imageline($im, 20, 18, 170, 50, $white);
imageline($im, 25, 50, 80, 50, $white);

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

// 繪製 4 個漢字
for ($i = 0; $i < 4; $i++) {
    imagettftext($im, rand(18,20), rand(0,20),
        rand(($image_x/4)*$i + $image_x/100, ($image_x/4)*$i + $image_x/8),
        rand($image_y/2 + $image_y/10, $image_y/2 + $image_y/5),
        $font_color, $fnt, $str[$i]);
}
imagepng($im);
imagedestroy($im);
?>

重要提醒

  • 需下載 simhei.ttf(黑體)置於腳本同目錄。
  • 單獨執行驗證碼腳本再取 Session 會發現不一致;必須透過 <img src="captcha.php"> 載入後再取 Session 才一致(Session ID 傳遞機制)。
  • 建議加入字體大小、旋轉角度、顏色更隨機化,進一步提高強度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved