zoukankan      html  css  js  c++  java
  • php Captcha 驗證碼類

    <?php
    /** Captcha 驗證碼類
    *	Date: 	2011-02-19
    *	Author:	fdipzone
    */
    
    class Captcha{	//class start
    
    	private $sname = '';
    
    	public function __construct($sname=''){	// $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!==''){
    				$_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' => 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檢查
    ?>



  • 相关阅读:
    Vue Cli3.0 使用jquery
    使用js加载器动态加载外部js、css文件
    通过js获取本机的IP地址
    $.ajax 中的contentType类型
    vue中 :style 与 :class 三元运算符使用
    bootstrap table checkbox获得选中得数据
    vscode自动生成文件头部注释和函数注释
    axios二次封装的几种方法
    vue组件库element-ui 的Table内容显示不更新
    Linux中iptables设置详细
  • 原文地址:https://www.cnblogs.com/fdipzone/p/3715169.html
Copyright © 2011-2022 走看看