`
alfred_long
  • 浏览: 561846 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP验证码

 
阅读更多

这是个验证码类,我现在设置的大小是90*30的,大家可以根据需要具体修改,不过,修改了图片大小以后,需要根据情况具体修改些。代码说明

// 绘验证码
$code = array(); // 验证码
$codeNX =-20; // 验证码第N个字符的左边距,如果图片大小变化,需要修改
for ($i = 0; $i<self::$length; $i++) {
    $code[$i] = self::$codeSet[mt_rand(0, 27)];
    $codeNX += mt_rand(self::$fontSize, self::$fontSize);
    // 写一个验证码字符,具体修改看这个函数的功能
    imagettftext(self::$_image, self::$fontSize*0.65, mt_rand(-40, 40), $codeNX, self::$fontSize, self::Getcolor(), $ttf, $code[$i]);
              //imagettftext()中self::$fontSize大小修改,改变字母上下的幅度,具体可以这样self::$fontSize*0.9, 
}
 <?php
/**
 * 安全验证码
 * 
 * 安全的验证码要:验证码文字扭曲、旋转,使用不同字体,添加干扰码
 *
 */
class Authcode {
	/**
	 * 验证码的session的下标
	 * 
	 * @var string
	 */
	public static $seKey = 'authcode';
	public static $expire = 3000;     // 验证码过期时间(s)
	/**
	 * 验证码中使用的字符,01IO容易混淆,建议不用
	 *
	 * @var string
	 */
	public static $codeSet = '346789ABCDEFGHJKLMNPQRTUVWXY';
	public static $fontSize = 20;     // 验证码字体大小(px)
	public static $useCurve = true;   // 是否画混淆曲线
	public static $useNoise = true;   // 是否添加杂点	
	public static $imageH = 25;        // 验证码图片宽
	public static $imageW = 75;        // 验证码图片长
	public static $length = 4;        // 验证码位数
                    public static $font = 1;          //选择字体
	
	protected static $_image = null;     // 验证码图片实例
	protected static $_color = null;     // 验证码字体颜色

	/**
	 * 验证码字体颜色,可以设定为固定,也可以随机,可以所有为一个颜色也可以每个字符为一个颜色
	 * 
	 */        
        public static function Getcolor(){
            
            $fontcolor = imagecolorallocate(self::$_image, mt_rand(1,120), mt_rand(1,120), mt_rand(1,120));
            return $fontcolor;
            
        }
        /*
         * 可以根据自己需要来添加或者减少,也可以指定单一的背景颜色
         */
        public static function Background(){
            $color = array(
                array(240,255,255),
                array(245,245,245),
                array(255,248,220),
                array(252,230,201),
                array(240,255,240),
                array(250,255,240),
                array(250,240,230),
                array(255,245,238),
                array(255,250,250)
            );
            $m = rand(0,5);
            imagecolorallocate(self::$_image, $color[$m][0], $color[$m][1], $color[$m][2]);
        }
	/**
	 * 输出验证码并把验证码的值保存的session中
	 * 验证码保存到session的格式为: $_SESSION[self::$seKey] = array('code' => '验证码值', 'time' => '验证码创建时间');
	 */
	public static function Build() {
		// 图片宽(px)
		self::$imageW || self::$imageW = self::$length * self::$fontSize  + self::$fontSize; 
		// 图片高(px)
		self::$imageH || self::$imageH = self::$fontSize * 3;
		// 建立一幅 self::$imageW x self::$imageH 的图像
		self::$_image = imagecreate(self::$imageW, self::$imageH); 
                
		// 设置背景      
                                        self::Background();
                
		// 验证码使用字体 
		$ttf = 'style/images/' . self::$font . '.ttf'; 
		if (self::$useNoise) {
			// 绘杂点
			self::writeNoise();
		}                

		// 绘验证码
		$code = array(); // 验证码
		$codeNX =-20; // 验证码第N个字符的左边距
		for ($i = 0; $i<self::$length; $i++) {
			$code[$i] = self::$codeSet[mt_rand(0, 27)];
			$codeNX += mt_rand(self::$fontSize, self::$fontSize);
			// 写一个验证码字符,具体修改看这个函数的功能
			imagettftext(self::$_image, self::$fontSize*0.6, mt_rand(-40, 40), $codeNX, self::$fontSize*0.9, self::Getcolor(), $ttf, $code[$i]);
		}
		
		// 保存验证码
//		isset($_SESSION) || session_start();
		$_SESSION[self::$seKey] = join('', $code); // 把校验码保存到session
		$_SESSION['out_time'] = time();  // 验证码创建时间
				
		header('Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate');
		header('Cache-Control: post-check=0, pre-check=0', false);		
		header('Pragma: no-cache');		
		header("content-type: image/png");
	
		// 输出图像
		imagepng(self::$_image); 
		imagedestroy(self::$_image);
	}
	/**
	 * 画杂点
	 * 往图片上写不同颜色的字母或数字
	 */
	protected static function writeNoise() {
		for($i = 0; $i < 5; $i++){
			//杂点颜色
                    $noiseColor = imagecolorallocate(
                                      self::$_image, 
                                      mt_rand(100,200), 
                                      mt_rand(100,200), 
                                      mt_rand(100,200)
                                  ); 
			for($j = 0; $j < 3; $j++) {
				// 绘杂点($j<? 来调整杂点个数)
			    imagestring(
			        self::$_image,
			        3, //背景字体的大小
			        mt_rand(-5, self::$imageW), 
			        mt_rand(-5, self::$imageH), 
			        self::$codeSet[mt_rand(1, 27)], // 杂点文本为随机的字母或数字
			        $noiseColor
			    );
			}
		}
	}	
	/**
	 * 验证验证码是否正确
	 *
	 * @param string $code 用户验证码
	 * @param bool 用户验证码是否正确
	 */
	public static function check($code) {
                                        $code = strtoupper($code);
		// 验证码不能为空
		if(empty($code) || empty($_SESSION[self::$seKey])) {
			return false;
		}
		// session 过期
		if(time() - $_SESSION['out_time'] > self::$expire) {
			unset($_SESSION[self::$seKey]);
			return false;
		}
		if($code == $_SESSION[self::$seKey]) {
			return true;
		}

		return false;
	}
}
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics