Eine Erklärung der PHP-Captcha-Verifizierungscode-Klasse

jacklove
Freigeben: 2023-03-31 15:52:01
Original
1661 Leute haben es durchsucht
<?php
/** Captcha 驗證碼類
*	Date: 	2011-02-19
*	Author:	fdipzone
*/
class Captcha{	//class start
	private $sname = &#39;&#39;;
	public function __construct($sname=&#39;&#39;){	// $sname captcha session name
		$this->sname = $sname==''? 'm_captcha' : $sname;
	}
	/** 生成验证码图片
	* @param  int	$length 驗證碼長度
	* @param  Array	$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;
			}
		}
	}
	
	/* 产生随机数函数
	* @param	int		$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處理方法
	* @param	String	$name	captcha session name
	* @param	String	$value
	* @return	String
	*/
	private function captcha_session($name,$value=null){
		if(isset($value)){
			if($value!==&#39;&#39;){
				$_SESSION[$name] = $value;
			}else{
				unset($_SESSION[$name]);
			}
		}else{
			return isset($_SESSION[$name])? $_SESSION[$name] : &#39;&#39;;
		}
	}
}	// class end
?>
Nach dem Login kopieren

Demo

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

In diesem Artikel werden die relevanten Inhalte zur PHP-Captcha-Verifizierungscode-Klasse erläutert. Weitere Informationen zu diesem Thema finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

MySQL-Informationsschema-bezogener Inhalt

MySQL-Datenbankgröße, Tabellengröße und letzte Änderungszeit anzeigen

Detaillierte Erklärung von Sublime Text 2

Das obige ist der detaillierte Inhalt vonEine Erklärung der PHP-Captcha-Verifizierungscode-Klasse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage