談談那些年PHP中屌屌的驗證碼


  驗證碼已經是現在網站中非常基礎的知識點了,驗證碼的存在可以防止惡意破解密碼、刷票、灌水,可以有效的防止暴力破解特定用戶。

  現在就來了解了解那些年PHP中屌屌的驗證碼吧。

  首先,以四位驗證碼為例(多位驗證碼一樣的道理)。

  目前網站大多仍然采用靜態圖片驗證碼,因為這樣實現起來簡單又方便,不需要過硬的功底,當然這也是基礎。而其原理也就是通過PHP的畫圖功能將文字畫成圖片返回到頁面。因此,我們解決的問題也就只有三步而已:

  1. 隨機生成驗證碼的內容
  2. 將驗證碼轉換成圖片,即繪圖
  3. 將所繪出的圖返回到頁面中

  當然,PHP默認是沒有開啟繪圖功能的,因此,在php.ini的配置文件中先開啟繪圖功能吧:搜到  ;extension=php_gd2.dll  將前面的分號去掉即可。(記得保存喔!)

  那根據第一點,大家首先應該會想到數字的驗證碼,因為這容易,隨機生成個幾個數字,然后拼起來也就行了,像醬紫!

1 $validateCode = '';
2 for ($i = 0; $i < 4; $i ++) {
3     $validateCode .= rand(0, 9);
4 }
5 echo $validateCode;
View Code

  然后仔細想想,現在的網站驗證碼都有字母,可這玩意兒都沒字母,怎么呢?然后又想到,直接把上面那玩意兒搞成十六進制就好了。

1 $validateCode = '';
2 for ($i = 0; $i < 4; $i ++) {
3     $validateCode .= dechex(rand(0, 16));
4 }  
5 echo $validateCode;
View Code

  好像有點自作聰明的趕腳呀,不過想想,也算是有幾個字母了,可卻只有a,b,c,d,e,f,那要是需要所有字母咋辦呢?哈哈,在想想也就想到把所有的字母和數字等在一個字符串中列出來,然后通過隨機下標的形式去
隨機獲取對應的值,也就成了這樣:

1 $validateCode = '';
2 $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
3 for ($i = 0; $i < 4; $i ++) {
4     $validateCode .= $str[rand(0, strlen($str))];
5 }  
6 echo $validateCode;
View Code

  哈哈,終於像驗證碼里的隨機數了,不過看到下面的方法,有總瞬間被秒的趕腳呀:

echo substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4);

  str_shuffle方法將字符串內容打亂,substr($str, 0, 4)取到了前四個數。這樣是完全沒有問題的!不過細心的看的出來,這樣的驗證碼里的內容是不會重復的。

 

  以上驗證碼也就產生了,接下來也就要將驗證碼用PHP畫出來了。

 1 $validateCode = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4);
 2 
 3 // 創建一張寬為110px,高為25px的圖片
 4 $img = imagecreatetruecolor(110, 25);
 5 // 將圖片的背景顏色設置成黑色,顏色值分別對應RGB
 6 $bgcolor = imagecolorallocate($img, 0, 0, 0);
 7 
 8 // 創建白色
 9 $white = imagecolorallocate($img, 255, 255, 255);
10 
11 // 添加文字在圖片中,第二個參數為文字的大小,只能在1~5,第三個參數為x坐標,第4個參數為y坐標,第5個參數為文字的內容,第6個參數為文字的顏色
12 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white);
13 
14 // 添加文字在圖片中,第二個參數為文字的大小,只能在1~5,第三個參數為x坐標,第4個參數為y坐標,第5個參數為文字的內容,第6個參數為文字的顏色
15 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white);
View Code

  

  當然,這樣的話驗證碼就太好識別了,就只是單純的黑底白字,為了增加點難度,我們就多加幾條線疊加在驗證碼的上面。

 1 $validateCode = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4);
 2 
 3 // 創建一張寬為110px,高為25px的圖片
 4 $img = imagecreatetruecolor(110, 25);
 5 // 將圖片的背景顏色設置成黑色,顏色值分別對應RGB
 6 $bgcolor = imagecolorallocate($img, 0, 0, 0);
 7 // imagefill($img, 10, 10, $bgcolor);
 8 
 9 // 創建白色
10 $white = imagecolorallocate($img, 255, 255, 255);
11 
12 for ($i = 0; $i < 30; $i ++) {
13     // 在圖片上畫線,其中第2個參數表示線的x起始坐標,第3個參數表示線的y起始坐標,第4個參數表示x的終止坐標,第5個參數表示y的終止坐標,第6個參數表示顏色,此處生成一個隨機顏色
14     imageline($img, rand(0, 110), rand(0, 50), rand(0, 110), rand(0, 50), imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255)));
15 }
16 
17 // 添加文字在圖片中,第二個參數為文字的大小,只能在1~5,第三個參數為x坐標,第4個參數為y坐標,第5個參數為文字的內容,第6個參數為文字的顏色
18 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white);
19 
20 // 返回成圖片
21 header('Content-type: image/png');
22 imagepng($img);
View Code

  結果也就成了這樣,當然,要想實現驗證碼,這樣還是不夠滴,需要通過將驗證碼生成的隨機數存到服務器的session中,$_SESSION['validate'] = $validateCode;然后在通過客戶端輸入的驗證碼與之對比即可。PHP中屌屌的驗證碼也就這樣實現了,當然,前面也說過了,這是最基礎的代碼,可以通過你的想法將其改變為實現算術的驗證碼,中文的驗證碼,或其它一些有趣的驗證碼,以減少其枯燥性又實現安全性。

 

  大家有沒有什么其它屌屌的驗證碼分享與我呢?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM