首頁 >後端開發 >php教程 >PHP算式驗證碼和漢字驗證碼的實作方法

PHP算式驗證碼和漢字驗證碼的實作方法

WBOY
WBOY原創
2016-07-25 08:45:15933瀏覽

在PHP網站開發中,驗證碼可以有效地保護我們的表單不被惡意提交,但是如果不使用算式驗證碼或漢字驗證碼,僅使用簡單的字母或數字驗證碼,這樣的驗證碼方案真的安全嗎?

大家知道簡單數字或字母驗證碼很容易被破解,但是算式驗證碼或是中文漢字驗證碼不容易被破解,所以建議大家在使用驗證碼的時候,盡量用算式驗證碼或中文漢字驗證碼。

以下是我寫的兩種驗證碼程式碼,有用到的朋友可以參考下:

1.算式驗證碼:

  1. session_start();
  2. header("Content-type:"Content-type: image/png");
  3. $num1 = mt_rand(0,9);//第一位數
  4. $num2 = mt_rand(1,9);//第二位數
  5. $type_str = " -*";//方法字串集合
  6. $type = substr($type_str,rand(0,2),1);//隨機方法
  7. $change = mt_rand(1,3);
  8. if($change==1){
  9. $code = "$num1$type$num2=?";
  10. $result = "$verifyCode=$num1$type$num2;";
  11. eval($result);
  12. $_SESSION['authnum_session'] = $verifyCode;
  13. }elseif($change==2){
  14. $result = "$verifyCode=$num1$type$num2; ";
  15. eval($result);
  16. $code = $num1.$type."_=".$verifyCode;
  17. $_SESSION['authnum_session'] = $num2;
  18. }elseif ($change==3){
  19. $result = "$verifyCode=$num1$type$num2;";
  20. eval($result);
  21. $code = "_".$type.$ num2."=".$verifyCode;
  22. $_SESSION['authnum_session'] = $num1;
  23. }
  24. $im = imagecreate(68,28);
  25. $black = imagecolorallocate($imagecolorallocate($imagecolorallocate($imagecolorallocate($imagecolorallocate($image)> , 0,0,0);
  26. $white = imagecolorallocate($im, 255,255,255);
  27. $gray = imagecolorallocate($im, 200,200,200);imagefill($im,0,0,$white);
  28. imagestring($im, 5, 10, 8, $code, $black);
  29. for($i=0 ;$i imagesetpixel($im, mt_rand(0, 58) , mt_rand(0, 28) , $black);
  30. imagesetpixel($im, mt_rand(0, 58) , mt_rand(0, 28) , $red);
  31. imagesetpixel($im, mt_rand(0, 58) , mt_rand(0, 28) , $gray);
  32. }
  33. imagepng($im) ;
  34. imagedestroy($im);
  35. ?>
複製程式碼

2.中文漢字驗證碼:

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


字型檔:simhei.rar點擊此處本站下載。

注意:

中文漢字驗證碼單獨執行,然後取得session會發現驗證碼和session內容不一致。但在img 標籤中src屬性中引用這個中文漢字驗證碼檔時,然後取得session,這時兩者內容時一致的。

取自:http://www.phpxs.com/post/3083

驗證碼, PHP

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn