php算式驗證碼和漢字驗證碼的實現方法

來源:互聯網
上載者:User
在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,這時兩者內容時一致的。

感興趣的朋友可以對此進一步加以完善。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.