文档章节

php生成动态验证码

MaoKe
 MaoKe
发布于 2015/11/30 16:53
字数 1004
阅读 111
收藏 5

预览效果:

<?php
/**
*ImageCode 生成包含验证码的GIF图片的函数
*@param $string 字符串
*@param $width 宽度
*@param $height 高度
**/
function ImageCode($string='',$width=75,$height=25){
	$authstr=$string?$string:((time()%2==0)?mt_rand(1000,9999):mt_rand(10000,99999));
	$board_width=$width;
	$board_height=$height;
	// 生成一个32帧的GIF动画
	for($i=0;$i<32;$i++){
		ob_start();
	    $image=imagecreate($board_width,$board_height);
	    imagecolorallocate($image,0,0,0);
	    // 设定文字颜色数组 
	 	$colorList[]=ImageColorAllocate($image,15,73,210);
	 	$colorList[]=ImageColorAllocate($image,0,64,0);
	 	$colorList[]=ImageColorAllocate($image,0,0,64);
	 	$colorList[]=ImageColorAllocate($image,0,128,128);
	 	$colorList[]=ImageColorAllocate($image,27,52,47);
	 	$colorList[]=ImageColorAllocate($image,51,0,102);
	 	$colorList[]=ImageColorAllocate($image,0,0,145);
	 	$colorList[]=ImageColorAllocate($image,0,0,113);
	 	$colorList[]=ImageColorAllocate($image,0,51,51);
	 	$colorList[]=ImageColorAllocate($image,158,180,35);
	 	$colorList[]=ImageColorAllocate($image,59,59,59);
	 	$colorList[]=ImageColorAllocate($image,0,0,0);
	 	$colorList[]=ImageColorAllocate($image,1,128,180);
	 	$colorList[]=ImageColorAllocate($image,0,153,51);
	 	$colorList[]=ImageColorAllocate($image,60,131,1);
	 	$colorList[]=ImageColorAllocate($image,0,0,0);
	 	$fontcolor=ImageColorAllocate($image,0,0,0);
	 	$gray=ImageColorAllocate($image,245,245,245);
	    $color=imagecolorallocate($image,255,255,255);
	    $color2=imagecolorallocate($image,255,0,0);
	    imagefill($image,0,0,$gray);
	    $space=15;// 字符间距
	    if($i>0){// 屏蔽第一帧
			$top=0;
		    for($k=0;$k<strlen($authstr);$k++){ 
				$colorRandom=mt_rand(0,sizeof($colorList)-1);
				$float_top=rand(0,4);
				$float_left=rand(0,3);
				imagestring($image,6,$space*$k,$top+$float_top,substr($authstr,$k,1),$colorList[$colorRandom]);
			}
	   }
		for($k=0;$k<20;$k++){ 
			$colorRandom=mt_rand(0,sizeof($colorList)-1);
	 		imagesetpixel($image,rand()%70,rand()%15,$colorList[$colorRandom]);
	
		}
		// 添加干扰线
		for($k=0;$k<3;$k++){
			$colorRandom=mt_rand(0,sizeof($colorList)-1);
			$todrawline=1;
			if($todrawline){
				imageline($image,mt_rand(0,$board_width),mt_rand(0,$board_height),mt_rand(0,$board_width),mt_rand(0,$board_height),$colorList[$colorRandom]);
			}else{
				$w=mt_rand(0,$board_width);
				$h=mt_rand(0,$board_width);
				imagearc($image,$board_width-floor($w / 2),floor($h / 2),$w,$h, rand(90,180),rand(180,270),$colorList[$colorRandom]);
			}
		}
	    imagegif($image);
	    imagedestroy($image);
	    $imagedata[]=ob_get_contents();
	    ob_clean();
	    ++$i;
	}
	$gif=new GIFEncoder($imagedata);
	Header('Content-type:image/gif');
	echo $gif->GetAnimation();
}


/**
*GIFEncoder类
**/
Class GIFEncoder{
    var $GIF="GIF89a";              /* GIF header 6 bytes       */  
    var $VER="GIFEncoder V2.06";      /* Encoder version            */  
    var $BUF=Array();
    var $LOP=0;
    var $DIS=2;
    var $COL=-1;
    var $IMG=-1;
    var $ERR=Array(
        'ERR00'=>"Does not supported function for only one image!", 
        'ERR01'=>"Source is not a GIF image!", 
        'ERR02'=>"Unintelligible flag ", 
        'ERR03'=>"Could not make animation from animated GIF source", 
   );
    function GIFEncoder($GIF_src,$GIF_dly=100,$GIF_lop=0,$GIF_dis=0, $GIF_red=0,$GIF_grn=0,$GIF_blu=0,$GIF_mod='bin'){
        if(!is_array($GIF_src)&&!is_array($GIF_tim)){
            printf("%s: %s",$this->VER,$this->ERR['ERR00']);
            exit(0);
        }  
        $this->LOP=($GIF_lop>-1)?$GIF_lop:0;
        $this->DIS=($GIF_dis>-1)?(($GIF_dis<3)?$GIF_dis:3):2;
        $this->COL=($GIF_red>-1&&$GIF_grn>-1&&$GIF_blu>-1)?($GIF_red |($GIF_grn<<8)|($GIF_blu<<16)):-1;

        for($i=0,$src_count=count($GIF_src);$i<$src_count;$i++){
            if(strToLower($GIF_mod)=="url"){
            	$this->BUF[]=fread(fopen($GIF_src [$i],"rb"),filesize($GIF_src [$i]));
           }elseif(strToLower($GIF_mod)=="bin"){
                $this->BUF [ ]=$GIF_src [ $i ];
           }else{
                printf("%s: %s(%s)!",$this->VER,$this->ERR [ 'ERR02' ],$GIF_mod);
                exit(0);
           }  
            if(substr($this->BUF[$i],0,6)!="GIF87a"&&substr($this->BUF [$i],0,6)!="GIF89a"){
                printf("%s: %d %s",$this->VER,$i,$this->ERR ['ERR01']);
                exit(0);
           }  
            for($j=(13+3*(2<<(ord($this->BUF[$i]{10})&0x07))),$k=TRUE;$k;$j++){
                switch($this->BUF [$i]{$j}){
                    case "!":  
                        if((substr($this->BUF[$i],($j+3),8))=="NETSCAPE"){
                                printf("%s: %s(%s source)!",$this->VER,$this->ERR ['ERR03'],($i+1));
                                exit(0);
                       }  
                        break;
                    case ";":  
                        $k=FALSE;
                    break;
               }  
           }  
        }  
        GIFEncoder::GIFAddHeader();
        for($i=0,$count_buf=count($this->BUF);$i<$count_buf;$i++){
        	GIFEncoder::GIFAddFrames($i,$GIF_dly[$i]);
       }  
        GIFEncoder::GIFAddFooter();
    }  
    function GIFAddHeader(){
		$cmap=0;
		if(ord($this->BUF[0]{10})&0x80){
			$cmap=3*(2<<(ord($this->BUF [0]{10})&0x07));
			$this->GIF.=substr($this->BUF [0],6,7);
			$this->GIF.=substr($this->BUF [0],13,$cmap);
			$this->GIF.="!\377\13NETSCAPE2.0\3\1".GIFEncoder::GIFWord($this->LOP)."\0";
		}  
    }  
    function GIFAddFrames($i,$d){
        $Locals_str=13+3*(2 <<(ord($this->BUF[$i]{10})&0x07));
        $Locals_end=strlen($this->BUF[$i])-$Locals_str-1;
        $Locals_tmp=substr($this->BUF[$i],$Locals_str,$Locals_end);
        $Global_len=2<<(ord($this->BUF [0]{10})&0x07);
        $Locals_len=2<<(ord($this->BUF[$i]{10})&0x07);
        $Global_rgb=substr($this->BUF[0],13,3*(2<<(ord($this->BUF[0]{10})&0x07)));
        $Locals_rgb=substr($this->BUF[$i],13,3*(2<<(ord($this->BUF[$i]{10})&0x07)));
        $Locals_ext="!\xF9\x04".chr(($this->DIS<<2)+0).chr(($d>>0)&0xFF).chr(($d>>8)&0xFF)."\x0\x0";
        if($this->COL>-1&&ord($this->BUF[$i]{10})&0x80){
            for($j=0;$j<(2<<(ord($this->BUF[$i]{10})&0x07));$j++){
                if(ord($Locals_rgb{3*$j+0})==($this->COL>> 0)&0xFF&&ord($Locals_rgb{3*$j+1})==($this->COL>> 8)&0xFF&&ord($Locals_rgb{3*$j+2})==($this->COL>>16)&0xFF){
                    $Locals_ext="!\xF9\x04".chr(($this->DIS<<2)+1).chr(($d>>0)&0xFF).chr(($d>>8)&0xFF).chr($j)."\x0";
                    break;
               }  
           }  
        }  
        switch($Locals_tmp{0}){
            case "!":  
                $Locals_img=substr($Locals_tmp,8,10);
                $Locals_tmp=substr($Locals_tmp,18,strlen($Locals_tmp)-18);
                break;
            case ",":  
                $Locals_img=substr($Locals_tmp,0,10);
                $Locals_tmp=substr($Locals_tmp,10,strlen($Locals_tmp)-10);
                break;
        }  
        if(ord($this->BUF[$i]{10})&0x80&&$this->IMG>-1){
            if($Global_len==$Locals_len){
				if(GIFEncoder::GIFBlockCompare($Global_rgb,$Locals_rgb,$Global_len)){
					$this->GIF.=($Locals_ext.$Locals_img.$Locals_tmp);
				}else{
					$byte=ord($Locals_img{9});
					$byte|=0x80;
					$byte&=0xF8;
					$byte|=(ord($this->BUF [0]{10})&0x07);
					$Locals_img{9}=chr($byte);
					$this->GIF.=($Locals_ext.$Locals_img.$Locals_rgb.$Locals_tmp);
				}  
            }else{
                $byte=ord($Locals_img{9});
                $byte|=0x80;
                $byte&=0xF8;
                $byte|=(ord($this->BUF[$i]{10})&0x07);
                $Locals_img {9}=chr($byte);
                $this->GIF.=($Locals_ext.$Locals_img.$Locals_rgb.$Locals_tmp);
            }  
        }else{
            $this->GIF.=($Locals_ext.$Locals_img.$Locals_tmp);
        }  
        $this->IMG=1;
    }  
    function GIFAddFooter(){
        $this->GIF.=";";
    }  
    function GIFBlockCompare($GlobalBlock,$LocalBlock,$Len){
        for($i=0;$i<$Len;$i++){
            if($GlobalBlock{3*$i+0}!=$LocalBlock{3*$i+0}||$GlobalBlock{3*$i+1}!=$LocalBlock{3*$i+1}||$GlobalBlock{3*$i+2}!=$LocalBlock{3*$i+2}){
                return(0);
           }  
       }  
        return(1);
    }  
    function GIFWord($int){
       return(chr($int&0xFF).chr(($int>>8)&0xFF));
    }  
    function GetAnimation(){
        return($this->GIF);
    }  
}
/*调用示例*/
session_start();
$checkCode='';
$chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPRSTUVWXYZ23456789';
for($i=0;$i<4;$i++){
	$checkCode.=substr($chars,mt_rand(0,strlen($chars)-1),1);
}
$_SESSION['code']=strtoupper($checkCode);// 记录session
ImageCode($checkCode,60);// 显示GIF动画

本文转载自:http://www.phpernote.com/php-function/415.html

MaoKe
粉丝 0
博文 40
码字总数 13572
作品 0
昌平
程序员
私信 提问
[php validate| 随机生成验证码并验证]

php实现动态随机验证码机制 | PHP生成各种验证码和Ajax验证 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类...

phala
2015/10/20
256
0
python3,Django验证码生成方法

python3,Django验证码生成方法 一号门-程序员的工作,程序员的生活(java,python,delphi实战)2017-09-0331 阅读 生成方法验证码python3Django 记得很久以前有尝试过python2.7, Django生成验证码...

一号门-程序员的工作,程序员的生活(java,python,delphi实战)
2017/09/03
0
0
Minho/php-captcha

php-captcha 简单的php验证码库。 PHP生成验证码图片 PHP生成验证码的原理:使用PHP的GD库,生成一张带验证码的图片,并将验证码保存在Session中。PHP生成验证码的大致流程有: 1、产生一张p...

Minho
2017/01/15
0
0
【代码实现】PHP生成各种随机验证码

文章来源:PHP开发学习门户 (自行开发的个人网站) 验证码在WEB应用中非常重要,通常用来防止用户恶意提交表单,如恶意注册和登录、论坛恶意灌水等。本文将通过实例讲解使用PHP生成各种常见...

PHP开发学习门户
2014/10/07
816
0
PHP制作数字、字母型验证码及其工作原理剖析

准备: 使用PHP生成验证码图片,需要PHP的GD模块,GD扩展库用于处理图像。所以先去检查你的服务器使用的PHP版本是否开启GD模块,你可以使用PHP内置函数phpinfo()去检查,至于如何去做就不在这...

小飞侠_Kobe
2016/09/29
93
0

没有更多内容

加载失败,请刷新页面

加载更多

【运维】记一次上线前的紧急定位与修复-献上九条小经验

1 简介 本文介绍了作者所在团队在某次上线前测试发现问题、定位问题并修复上线的过程,最后给出几点经验总结,希望对大家有用。 2 过程 (1)今天需要上线,但昨晚才合并了所有分支,时间很紧...

南瓜慢说
38分钟前
4
0
Elasticsearch系列---初识Elasticsearch

Elasticsearch是什么? Elasticsearch简称ES,是一个基于Lucene构建的开源、分布式、Restful接口的全文搜索引擎,还是一个分布式文档数据库。天生就是分布式、高可用、可扩展的,可以在很短的...

清茶豆奶
50分钟前
3
0
服务安全之:JWT

JWT是JSON Web Tokens的缩写。既然叫JSON Web Tokens,所以JWT Tokens中真正包含的是多个JSON对象。为什么是多个JSON对象呢?因为SWT Token实际上是由三部分组成,其中有两部分是JSON格式。这...

popgis
今天
5
0
C++ Primer 笔记整理(一)基本语法介绍

C++被称为“完美的程序设计语言”,在chromium内核中应用非常广泛,之前没有系统学习过C++相关的知识,通过看书来学习相关的知识,现在将《C++ Primer》基本知识提取出来,供大家学习。 1.输...

天王盖地虎626
今天
2
0
你知道多少this,new,bind,call,apply?那我告诉你

那么什么是this,new,bind,call,apply呢?这些你都用过吗?掌握这些内容都是基础中的基础了。如果你不了解,那还不赶快去复习复习,上网查阅资料啥的! 通过call,apply,bind可以改变thi...

达达前端小酒馆
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部