在PHP網站開發中,驗證碼可以有效地保護我們的表單不被惡意提交,但是如果不使用算式驗證碼或者漢字驗證碼,僅僅使用簡單的字母或者數字驗證碼,這樣的驗證碼方案真的安全嗎?
大家知道簡單數字或者字母驗證碼很容易被破解,但是算式驗證碼或者中文漢字驗證碼不容易被破解,所以建議大家在使用驗證碼的時候,盡量用算式驗證碼或者中文漢字驗證碼。
下面是兩種驗證碼代碼,有用到的朋友可以參考下:
1.算式驗證碼:
<?phpsession_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=?"; $result = "\$verifyCode=$num1$type$num2;"; eval($result); $_SESSION['authnum_session'] = $verifyCode; }elseif($change==2){ $result = "\$verifyCode=$num1$type$num2;"; eval($result); $code = $num1.$type."_=".$verifyCode; $_SESSION['authnum_session'] = $num2; }elseif($change==3){ $result = "\$verifyCode=$num1$type$num2;"; eval($result); $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.中文漢字驗證碼:
<?phpsession_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");}$authnum_session = implode("",$str);$_SESSION['authnum_session'] = $authnum_session; //記錄到sessionHeader("Content-type: image/PNG");//圖片的長和高$image_x=100;$image_y=50;$im = imagecreate($image_x,$image_y);//這裡取圖片底色為白色$bkg = ImageColorAllocate($im,255,255,255);//顯示的字型樣式,這個要把檔案放到對應的目錄中,如果你沒有檔案就去window的字型檔中找一個吧。$fnt = "simhei.ttf";//為映像分配一些顏色$white=ImageColorAllocate($im,234,185,95);//在圖片上畫橢圓弧,指定下座標點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);//亂點的數量$noise_num=3000;$line_num=50;//各種混亂字元的顏色$rectangle_color=imagecolorallocate($im,0xAA,0xAA,0xAA);$noise_color=imagecolorallocate($im,0x00,0x00,0x00);$font_color=imagecolorallocate($im,0x00,0x00,0x00);for($i=0;$i<$noise_num;$i++){ //在一個座標點上畫一個單一像素,這個點上面定義了,是黑色的。 //imagesetpixel($im,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color);}for($i=0;$i<$line_num;$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); }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);?>
注意:
中文漢字驗證碼單獨執行,然後擷取session會發現驗證碼和session內容不一致。但是在img 標籤中src屬性中引用這個中文漢字驗證碼檔案時,然後擷取session,這時兩者內容時一致的。
感興趣的朋友可以對此進一步加以完善。