PHP後端之驗證碼php
前言:html
打算寫一些實際開發中遇到的東西。我這我的記性很差,以爲記下來,之後就算想找,也能找獲得。後端
PHP,可能很長一段時間都不會使用了。因此仍是留一些記錄。數組
另外還有一些服務器架設的總結,以後整理了,會發布出來。服務器
一,問題:網絡
相信你們都有如下的經歷:session
1,上學的時候,猜解家裏電腦的登錄密碼。函數
2,忘了行李箱密碼,讓後悽慘地一個個試。字體
3,大學,一個個試學校內網的密碼。網站
等等。
也許,你會以爲這樣一個個試,很麻煩。
那就編寫一個程序,來暴力猜解多好啊。
實際狀況,就是有人作這樣的事情,爲此,黑客們還作出了各類包含經常使用密碼字段的破解字典來提升破解速度。
因此,爲了防止這種破解。人們想出了一些方法,來杜絕這種狀況:
1,密碼設置得沒有規律性(就是不用姓名,生日什麼的)(具體密碼相關,之後有機會我會寫一篇專門的文章)
2,限制登錄嘗試次數(在一段時間內只容許登錄有限次數)
3,驗證碼。
其中,驗證碼通過這麼些年的變化,有了許多的分支。從簡單輸入4位數字,再到順序點擊圖片中文字(如12306,簡直折磨人),還有如今的郵件,短信,語音等驗證碼(如steam,阿里雲等)
其中這些驗證碼方式又能夠按照發送方大體分爲兩類:一類是經過本地服務器來提供服務(如4位數字等),另外一類是經過其餘服務提供商來提供服務(如短信,電話等)
固然,因爲驗證碼的流行,還有專門的服務提供商。
其實,驗證碼最初徹底是爲了杜絕機器暴力破解。而如今的驗證碼,如短信,徹底能夠確認人的身份(因此如今有的登錄徹底不須要密碼,只須要帳號和驗證碼)。其價值已經大大提升了。
今天,只作一個本地服務器製做的驗證碼。其餘的本地驗證碼徹底能夠照此類變形。
二,實現原理:
PHP支持許多的函數,其中一些函數徹底能夠將字符串,製做爲圖片。
徹底能夠將畫布背景放上一些亂碼,再挑選四個數字(你也能夠添加字母,可是那樣會比較花)。按照不一樣的角度放在畫布上。
注意返回的文件格式便可。
三,實際代碼:
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: curek 5 * Date: 2/5/2018 6 * Time: 3:57 7 */
8
9 //設置字符集
10 header("Content-Type:text/html;charset=utf-8"); 11
12 //圖寬
13 $width = 150; 14 //圖高
15 $height = 40; 16 //驗證碼的長度
17 $length = 4; 18 //字體樣式
19 $fontstyle = './font/MSYHBD.TTF'; 20 //字體大小
21 $fontsize = 20; 22
23 //1.建立畫布
24 $img = imagecreatetruecolor($width, $height); 25
26 //2.分配顏色
27 $bgcolor = imagecolorallocate($img, mt_rand(180, 240), mt_rand(180, 240), mt_rand(180, 240)); 28
29 //3.填充
30 imagefill($img, 0, 0, $bgcolor); 31
32
33 //4.畫干擾
34 $str = '~~~~~~~~~~~~~~~~~~~~!@#$%%^^&*()_+.,[]:<>'; //手寫一些奇葩符號
35 $str_len = strlen($str); 36 for ($i = 0; $i < $str_len; $i++) { 37 //分配字體顏色
38 $fontcolor = imagecolorallocate($img, mt_rand(0, 150), mt_rand(0, 150), mt_rand(0, 150)); 39 imagettftext($img, 8, mt_rand(0, 360), mt_rand(0, $width), mt_rand(0, $height), $fontcolor, $fontstyle, $str[$i]); 40 } 41
42
43 //5.生成隨機驗證碼
44 $code_small = range('a', 'z'); 45 $code_big = range('A', 'Z'); 46 $code_num = range('0', '9'); 47
48 //6.合併成一個數組
49 $list = array_merge($code_small, $code_big, $code_num); 50 //7.隨機打亂順序
51 shuffle($list); 52
53 //8.用於儲存驗證碼
54 $code = ''; 55 for ($i = 0; $i < $length; $i++) { 56 //分配字體顏色 57 //分配字體顏色
58 $fontcolor = imagecolorallocate($img, mt_rand(0, 150), mt_rand(0, 150), mt_rand(0, 150)); 59 imagettftext( 60 $img, //操做目標
61 $fontsize, //字體大小
62 mt_rand(-40, 40), //角度
63 (($i * $fontsize) + ($width - ($length + $fontsize) >> 1)), //字體橫座標X
64 (($height - $fontsize >> 1) + $fontsize), //字體縱座標Y
65 $fontcolor, //字體顏色
66 $fontstyle, //字體樣式
67 $list[$i] //字體內容
68 ); 69 $code .= $list[$i]; 70 } 71
72 //9.開啓會話
73 session_start(); 74 //10.將正確驗證碼放入session
75 $_SESSION['code'] = $code; 76
77 header('Content-Type:image/png'); 78 imagepng($img); 79 imagedestroy($img); 80 ?>
PS:須要的說明都寫在了註釋內。
PS2:部分代碼參考網絡資源,不過地址記不得了。這是好久以前的項目了。
四,完成效果:
五,總結:
其餘的諸如短信驗證等,代碼都比較簡單,並且服務提供商都有教程。因此不在此贅述。
驗證碼用到的地方仍是不少的。咱們應該學會並理解原理。
起碼看到別人家網站上的驗證碼,可以知道它的運行原理。