談談那些年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);
http://www.bkjia.com/PHPjc/905903.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/905903.htmlTechArticle談談那些年PHP中屌屌的驗證碼,PHP屌屌驗證碼 驗證碼已經是現在網站中非常基礎的知識點了,驗證碼的存在可以防止惡意破解密碼、刷票、...