Home  >  Article  >  Backend Development  >  An explanation of the php Captcha verification code class

An explanation of the php Captcha verification code class

jacklove
jackloveOriginal
2018-06-11 16:44:171620browse
<?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
?>

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檢查
?>

This article explains the relevant content about the php Captcha verification code class. For more related knowledge, please pay attention to the php Chinese website.

Related recommendations:

MySQL information_schema related content

View mysql database size, table size and last modification time

Detailed explanation of Sublime Text 2

The above is the detailed content of An explanation of the php Captcha verification code class. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn