PHP 用session與gd庫(kù)實(shí)現(xiàn)簡(jiǎn)單驗(yàn)證碼生成與驗(yàn)證的類(lèi)方法
驗(yàn)證碼是為了防止機(jī)器灌水給網(wǎng)站帶來(lái)污染以及增加服務(wù)器負(fù)擔(dān)而出現(xiàn)的。目前大大小小的網(wǎng)站都有驗(yàn)證碼。今天自己實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的驗(yàn)證碼類(lèi)。說(shuō)簡(jiǎn)單是因?yàn)闆](méi)有加一些干擾的弧線等等,只是將文字旋轉(zhuǎn)了一下。當(dāng)然,因?yàn)樽煮w的原因,要想一眼看出來(lái)并不容易。同時(shí),為了避免字母的大小寫(xiě)與數(shù)字混淆,又去掉了那些看起來(lái)很像的字母數(shù)字。
類(lèi):
<?php
/**
*簡(jiǎn)單生成驗(yàn)證碼類(lèi)
*/
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)建畫(huà)布,并隨機(jī)填充顏色
* @return 返回畫(huà)布句柄
*/
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);
}
/**
* 將字符寫(xiě)入圖像
* @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);
}
/**
* 判斷用戶(hù)輸入的驗(yàn)證碼是否正確
* @param type $usrInput 用戶(hù)的輸入
* @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è)類(lèi)了。
上面的字體可以隨意設(shè)置。
下面的代碼講返回一個(gè)圖像,實(shí)例化Captcha類(lèi)后動(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代碼。瀏覽器收到后就將下面的輸出解析成圖像。
然后寫(xiě)一個(gè)html靜態(tài)頁(yè)面(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è)就是用來(lái)驗(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ò)誤或已過(guò)期';
}
session_destroy();
這里還是要導(dǎo)入Captcha這個(gè)類(lèi),然后調(diào)用其靜態(tài)方法來(lái)驗(yàn)證你的輸入。最后銷(xiāo)毀整個(gè)會(huì)話。
最后看看效果吧

太好了,成功了。那再故意輸錯(cuò)試試,后退一下,然后刷新(如果不刷新瀏覽器將直接調(diào)用緩存中的驗(yàn)證碼圖片,這個(gè)時(shí)候我們的驗(yàn)證碼還沒(méi)有生成呢!所以無(wú)論怎么樣都出錯(cuò))。

當(dāng)然,真正的驗(yàn)證碼是可以單擊換一張的,這利用了ajax技術(shù)。
以上這篇PHP 用session與gd庫(kù)實(shí)現(xiàn)簡(jiǎn)單驗(yàn)證碼生成與驗(yàn)證的類(lèi)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Apache啟動(dòng)報(bào)錯(cuò)No space left on device: AH00023該怎么解決
最近有朋友說(shuō):Apache啟動(dòng)報(bào)錯(cuò)No space left on device: AH00023,是怎么回事,該怎么解決呢?經(jīng)過(guò)小編的一番折騰,問(wèn)題解決,下面把解決辦法分享給大家,需要的朋友可以參考下2015-10-10
Yii2.0框架模型多表關(guān)聯(lián)查詢(xún)示例
這篇文章主要介紹了Yii2.0框架模型多表關(guān)聯(lián)查詢(xún),結(jié)合實(shí)例形式總結(jié)分析了Yii2.0框架多表關(guān)聯(lián)查詢(xún)相關(guān)操作技巧,需要的朋友可以參考下2019-07-07
thinkPHP基于ajax實(shí)現(xiàn)的菜單與分頁(yè)示例
這篇文章主要介紹了thinkPHP基于ajax實(shí)現(xiàn)的菜單與分頁(yè),結(jié)合實(shí)例形式分析了thinkPHP基于ajax無(wú)刷新交互實(shí)現(xiàn)菜單及分頁(yè)功能的相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下2016-07-07
Laravel框架基于ajax實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)功能示例
這篇文章主要介紹了Laravel框架基于ajax實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)功能,結(jié)合實(shí)例形式分析了Laravel框架ajax數(shù)據(jù)讀取及聯(lián)動(dòng)菜單的構(gòu)造與使用技巧,需要的朋友可以參考下2019-01-01
centos7上編譯安裝php7以php-fpm方式連接apache
這篇文章主要介紹了centos7上編譯安裝php7以php-fpm方式連接apache的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11

