PHP 用session與gd庫實(shí)現(xiàn)簡(jiǎn)單驗(yàn)證碼生成與驗(yàn)證的類方法
驗(yàn)證碼是為了防止機(jī)器灌水給網(wǎng)站帶來污染以及增加服務(wù)器負(fù)擔(dān)而出現(xiàn)的。目前大大小小的網(wǎng)站都有驗(yàn)證碼。今天自己實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的驗(yàn)證碼類。說簡(jiǎn)單是因?yàn)闆]有加一些干擾的弧線等等,只是將文字旋轉(zhuǎn)了一下。當(dāng)然,因?yàn)樽煮w的原因,要想一眼看出來并不容易。同時(shí),為了避免字母的大小寫與數(shù)字混淆,又去掉了那些看起來很像的字母數(shù)字。
類:
<?php /** *簡(jiǎn)單生成驗(yàn)證碼類 */ class Captcha { private $width;//驗(yàn)證碼寬度 private $height;//驗(yàn)證碼高度 private $countOfChars;//字符數(shù) //private $distrubLines;//干擾線條數(shù) private $chars;//隨機(jī)生成的字符串 public function __construct($width=100,$height=30,$countOfChars=4,$distrubLines=2) { //初始化參數(shù) $this->width=$width; $this->height=$height; $this->countOfChars=$countOfChars; session_start(); } /** * 執(zhí)行全部動(dòng)作,生成驗(yàn)證碼并直接輸出 */ public function execute(){ $imageHandle=$this->createImage(); $this->createChars(); $this->drawChars($imageHandle); $this->outImage($imageHandle); } /** * 創(chuàng)建畫布,并隨機(jī)填充顏色 * @return 返回畫布句柄 */ public function createImage(){ $imageHandle= imagecreate($this->width, $this->height); //隨機(jī)背景顏色 $randColor=imagecolorallocate($imageHandle, 50, mt_rand(0, 50), mt_rand(0, 50)); imagefill($imageHandle, 0, 0, $randColor); return $imageHandle; } /** * 生成隨機(jī)字符 */ private function createChars(){ //候選字符 $str='ABCDEFGHJKLMNPQRSTUVWXZabcdefghijkmnpqtuvwx2346789'; $chars=''; for($i=0;$i<$this->countOfChars;$i++){ $chars.=$str[mt_rand(0,strlen($str)-1)]; } $this->chars=$chars; //保存在會(huì)話中 $_SESSION['captcha']=strtolower($chars); } /** * 將字符寫入圖像 * @param type $imageHandle 圖像句柄 */ private function drawChars($imageHandle){ if($this->chars!=null){ $font='/home/WWW/YuWeiLiShuFT.ttf'; for($i=0;$i<strlen($this->chars);$i++){ $color= imagecolorallocate($imageHandle,mt_rand(50, 200),mt_rand(100, 255),255); imagefttext($imageHandle,30, 30,$i*20+10,25,$color,$font,$this->chars[$i]); } } } /** * 輸出圖像 * @param type $imageHandle 圖像句柄 */ private function outImage($imageHandle){ imagepng($imageHandle); imagedestroy($imageHandle); } /** * 判斷用戶輸入的驗(yàn)證碼是否正確 * @param type $usrInput 用戶的輸入 * @return boolean 驗(yàn)證碼是否匹配 */ public static function isRight($usrInput){ if(isset($_SESSION['captcha'])){ if(strtolower($usrInput)==$_SESSION['captcha']){ $_SESSION['captcha']=null; return true; }else{ $_SESSION['captcha']=null; return false; } } } }
把驗(yàn)證設(shè)置成了靜態(tài)方法,因?yàn)樯沈?yàn)證碼后已經(jīng)把驗(yàn)證碼存到了session中,驗(yàn)證時(shí)直接調(diào)用靜態(tài)方法,而不需要實(shí)例化這個(gè)類了。
上面的字體可以隨意設(shè)置。
下面的代碼講返回一個(gè)圖像,實(shí)例化Captcha類后動(dòng)態(tài)生成的一個(gè)圖像。(outCaptcha.php)
<?php require('Captcha.php'); $code= new Captcha(); header('Content-Type:image/png'); $code->execute();
header(‘Content-Type:image/png');
這句話的作用是告訴瀏覽器輸出的是png圖像,而不是html代碼。瀏覽器收到后就將下面的輸出解析成圖像。
然后寫一個(gè)html靜態(tài)頁面(testCaptcha.html),創(chuàng)建表單
<!DOCTYPE html> <html> <head> <title>驗(yàn)證碼測(cè)試</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <h1>請(qǐng)輸入驗(yàn)證碼:</h1> <img src="outCaptcha.php"/> <form method="POST" action="prove.php"> <input type="text" name="input_captcha"/> <button name="submit">確定</button> </form> </body> </html>
僅僅是這樣是不夠的,看到表單提交的地址了么?那個(gè)就是用來驗(yàn)證驗(yàn)證碼是否輸入正確的代碼:
session_start(); $inputCaptcha= trim($_POST['input_captcha']); require('Captcha.php'); if(Captcha::isRight($inputCaptcha)){ echo '驗(yàn)證碼正確'; }else{ echo '驗(yàn)證碼錯(cuò)誤或已過期'; } session_destroy();
這里還是要導(dǎo)入Captcha這個(gè)類,然后調(diào)用其靜態(tài)方法來驗(yàn)證你的輸入。最后銷毀整個(gè)會(huì)話。
最后看看效果吧
太好了,成功了。那再故意輸錯(cuò)試試,后退一下,然后刷新(如果不刷新瀏覽器將直接調(diào)用緩存中的驗(yàn)證碼圖片,這個(gè)時(shí)候我們的驗(yàn)證碼還沒有生成呢!所以無論怎么樣都出錯(cuò))。
當(dāng)然,真正的驗(yàn)證碼是可以單擊換一張的,這利用了ajax技術(shù)。
以上這篇PHP 用session與gd庫實(shí)現(xiàn)簡(jiǎn)單驗(yàn)證碼生成與驗(yàn)證的類方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
php項(xiàng)目中百度 UEditor 簡(jiǎn)單安裝調(diào)試和調(diào)用
這篇文章主要介紹了php項(xiàng)目中百度 UEditor 簡(jiǎn)單安裝調(diào)試和調(diào)用的相關(guān)資料,需要的朋友可以參考下2015-07-07laravel框架分組控制器和分組路由實(shí)現(xiàn)方法示例
這篇文章主要介紹了laravel框架分組控制器和分組路由實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了laravel框架分組控制器和分組路由的基本定義與使用方法,需要的朋友可以參考下2020-01-01在Ubuntu 18.04上安裝PHP 7.3 7.2和7.0的方法
這篇文章主要介紹了在Ubuntu 18.04上安裝PHP 7.3 7.2和7.0的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04Laravel 4 初級(jí)教程之Pages、表單驗(yàn)證
本篇教程是本系列的完結(jié)篇,要做的是Pages的詳細(xì)管理功能,表單驗(yàn)證以及命名空間的深度使用,和一個(gè)更好用的通知組件,并且布置一個(gè)簡(jiǎn)單的大作業(yè)。2014-10-10