程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 談談那些年PHP中屌屌的驗證碼,PHP屌屌驗證碼

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

編輯:關於PHP編程

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


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

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

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

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

  當然,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中屌屌的驗證碼也就這樣實現了,當然,前面也說過了,這是最基礎的代碼,可以通過你的想法將其改變為實現算術的驗證碼,中文的驗證碼,或其它一些有趣的驗證碼,以減少其枯燥性又實現安全性。

 

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

 


對於PHP中驗證碼的問題

那是因為,php.ini 中的register_global = off;
修改成on就可以了,不過在php5後默認是將其設置為off,
因為直接獲值並不安全,想想如果用戶知道你的session的名字
那他是不是可以通過get,或post方法修改你的session呢?
因為獲值是只要名字就行了!
php5一般使用超全局變量!
$_GET
$_POST
$_COOKIE
$_SESSION

另樓主的書好像有點老了,session_register在php5中已經不推薦使用了,現在可以直接賦值了$_SESSION['yzm'] = 100;

注:聽說php6已出來了!
 

php中生成圖片驗證碼問題

找到原因了:$rand變量沒有初始化,直接輸出時會有警告。解決辦法是在for語句之前加上$rand='';這樣就沒問題了。
session_start();
$rand='';
for($i=0;$i<4;$i++){
$rand.=dechex(rand(0,15));
}
$_SISSION['rand']=$rand;

$bg=imagecreatetruecolor(100,30);
$im=imagecolorallocate($bg,0,0,0);
$color=imagecolorallocate($bg,255,255,255);
imagestring($bg,5,0,0,$rand,$color);

header("Content-type: image/jpeg");
imagejpeg($bg);
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved