Welcome 微信登录

首页 / 网页编程 / PHP / php Captcha验证码类

php Captcha验证码类2014-08-29
<?php/** Captcha 驗證碼類 * Date: 2011-02-19 * Author: fdipzone */class Captcha{//class startprivate $sname = "";public function __construct($sname=""){ // $sname captcha session name$this->sname = $sname==""? "m_captcha" : $sname;}/** 生成验证码图片 * @paramint $length 驗證碼長度 * @paramArray $param參數 * @return IMG */public function create($length=4,$param=array()){Header("Content-type: image/PNG");$authnum = $this->random($length); //生成验证码字符.$width= isset($param["width"])? $param["width"] : 13; //文字宽度$height = isset($param["height"])? $param["height"] : 18; //文字高度$pnum = isset($param["pnum"])? $param["pnum"] : 100;//干扰象素个数$lnum = isset($param["lnum"])? $param["lnum"] : 2;//干扰线条数$this->captcha_session($this->sname,$authnum);//將隨機數寫入session$pw = $width*$length+10;$ph = $height+6;$im = imagecreate($pw,$ph); //imagecreate() 新建图像,大小为 x_size 和 y_size 的空白图像。$black = ImageColorAllocate($im, 238,238,238);//设置背景颜色$values = array(mt_rand(0,$pw),mt_rand(0,$ph),mt_rand(0,$pw),mt_rand(0,$ph),mt_rand(0,$pw),mt_rand(0,$ph),mt_rand(0,$pw),mt_rand(0,$ph),mt_rand(0,$pw),mt_rand(0,$ph),mt_rand(0,$pw),mt_rand(0,$ph));imagefilledpolygon($im, $values, 6, ImageColorAllocate($im, mt_rand(170,255),mt_rand(200,255),mt_rand(210,255))); //設置干擾多邊形底圖/* 文字 */for ($i = 0; $i < strlen($authnum); $i++){$font = ImageColorAllocate($im, mt_rand(0,50),mt_rand(0,150),mt_rand(0,200));//设置文字颜色$x= $i/$length * $pw + rand(1, 6);//设置随机X坐标$y= rand(1, $ph/3); //设置随机Y坐标imagestring($im, mt_rand(4,6), $x, $y, substr($authnum,$i,1), $font); }/* 加入干扰象素 */for($i=0; $i<$pnum; $i++){$dist = ImageColorAllocate($im, mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); //设置杂点颜色imagesetpixel($im, mt_rand(0,$pw) , mt_rand(0,$ph) , $dist); } /* 加入干擾線 */for($i=0; $i<$lnum; $i++){$dist = ImageColorAllocate($im, mt_rand(50,255),mt_rand(150,255),mt_rand(200,255)); //設置線顏色imageline($im,mt_rand(0,$pw),mt_rand(0,$ph),mt_rand(0,$pw),mt_rand(0,$ph),$dist);}ImagePNG($im);//以 PNG 格式将图像输出到浏览器或文件ImageDestroy($im);//销毁一图像}/** 檢查驗證碼 * @param String $captcha驗證碼** @param int$flag 驗證成功后 0:不清除session 1:清除session * @return boolean */public function check($captcha,$flag=1){if(empty($captcha)){return false;}else{if(strtoupper($captcha)==$this->captcha_session($this->sname)){ //檢測驗證碼if($flag==1){$this->captcha_session($this->sname,"");}return true;}else{return false;}}}/* 产生随机数函数 * @paramint $length 需要隨機生成的字符串數 * @return String */private function random($length){$hash = "";$chars = "ABCDEFGHIJKLMNPQRSTUVWXYZ23456789";$max = strlen($chars) - 1;for($i = 0; $i < $length; $i++) {$hash .= $chars[mt_rand(0, $max)];}return $hash;}/** 驗證碼session處理方法 * @paramString$name captcha session name * @paramString$value * @return String */private function captcha_session($name,$value=null){if(isset($value)){if($value!==""){$_SESSION[$name] = $value;}else{unset($_SESSION[$name]);}}else{return isset($_SESSION[$name])? $_SESSION[$name] : "";}}} // class end?>
demo

<?session_start();require_once("Captcha.class.php");$obj = new Captcha($sname); # 創建Captcha類對象# $sname為保存captcha的session name,可留空,留空則為"m_captcha"$obj->create($length,$param);# 創建Captcha并輸出圖片# $length為Captcha長度,可留空,默認為4/* $param = array( "width" => 13captcha 字符寬度 "height" => 18 captcha 字符高度 "pnum" => 100干擾點個數 "lnum" => 2干擾線條數 ) 可留空 */$obj->check($captcha,$flag); # 檢查用戶輸入的驗證碼是否正確,true or false# $captcha為用戶輸入的驗證碼,必填# $flag 可留空,默認為1 # 1:當驗證成功后自動清除captcha session# 0:當驗證成功后不清除captcha session,用於ajax檢查?>
作者:csdn博客 傲雪星枫