PHP後端之驗證碼 前言: 打算寫一些實際開發中遇到的東西。我這個人記性不好,覺得記下來,以後就算想找,也能找得到。 PHP,可能很長一段時間都不會使用了。所以還是留一些記錄。 另外還有一些伺服器架設的總結,之後整理了,會發佈出來。 一,問題: 相信大家都有以下的經歷: 1,上學的時候,猜解家裡電腦 ...
PHP後端之驗證碼
前言:
打算寫一些實際開發中遇到的東西。我這個人記性不好,覺得記下來,以後就算想找,也能找得到。
PHP,可能很長一段時間都不會使用了。所以還是留一些記錄。
另外還有一些伺服器架設的總結,之後整理了,會發佈出來。
一,問題:
相信大家都有以下的經歷:
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:部分代碼參考網路資源,不過地址記不得了。這是很久之前的項目了。
四,完成效果:
五,總結:
其他的諸如簡訊驗證等,代碼都比較簡單,而且服務提供商都有教程。所以不在此贅述。
驗證碼用到的地方還是很多的。我們應該學會並理解原理。
起碼看到別人家網站上的驗證碼,能夠知道它的運行原理。