当前位置:首页 > PHP教程 > php应用 > 列表

php验证码生成器

发布:smiling 来源: PHP粉丝网  添加日期:2018-08-06 17:33:57 浏览: 评论:0 

现在很多网站都有实现用户集。然而为了防止机器人的网络攻击。限制登陆或者注册是有必要的。

在注册和登陆时强制要求输入一个机器难以识别的字符串集是一个不错的选择。虽然不能解决根本问题,但至少可以增加他们的成本。

利用PHP生成验证码需要用到GD2库。GD2库引用方法网络上有很多,不同操作系统导入方式也不同。

这段代码运行在WINDOS服务器平台。

  1. <?php 
  2. $iC=newidCode(5,60,30); 
  3. $iC->createPNG(); 
  4.    
  5. classidCode{ 
  6.   private$words=array('a','b'
  7.   'c','d','e','f','g','h','i','j','k','l'
  8.   'm','n','o','p','q','r','s','t','u','v'
  9.   'w','x','y','z','A','B','C','D','E','F'
  10.   'G','H','I','J','K','L','M','N','O','P'
  11.   'Q','R','S','T','U','V','W','X','Y','Z'
  12.   Ɔ',Ƈ'',Ɖ'',Ƌ'',ƍ'',Ə'); 
  13.   private$fonts
  14.   private$count;//验证码字符数 
  15.   private$height
  16.   private$width
  17.   private$path='..\myfolder\fonts' 
  18.   private$keys
  19.    
  20.   //构造函数 
  21.   publicfunction__construct($count,$width,$height){ 
  22.     $this->count=$count
  23.     $this->getFonts(); 
  24.     $this->height =$height
  25.     $this->width =$width
  26.   } 
  27.    
  28.   privatefunctiongetFonts(){ 
  29.     $dir= dir($this->path); 
  30.    
  31.     while(false !== ($file=$dir->read())){ 
  32.         if($file!='.'&&$file!='..'){ 
  33.           $this->fonts[count($this->fonts)] =basename($file); 
  34.         } 
  35.     } 
  36.     $dir->close(); 
  37.   } 
  38.    
  39.   privatefunctioncreateKeys(){ 
  40.     for($i= 0;$i<$this->count;$i++){<!--$this---> 
  41.       $this->keys[$i]['char'] =$this->words[rand(0,count($this->words)-1)]; 
  42.       //使用字体路径标识 
  43.       $this->keys[$i]['filename'] =$this->path.'\\'.$this->fonts[rand(0,count($this->fonts)-1)]; 
  44.     } 
  45.   } 
  46.    
  47.   publicfunctioncreatePNG(){ 
  48.     $this->createKeys(); 
  49.    
  50.     //创建画布以及颜色块儿 
  51.     $bg= imagecreatetruecolor($this->width + 10*2,$this->height + 3*2);//两边留10px空白,上下3px 
  52.     $grey= imagecolorallocate($bg,155,155,155); 
  53.     $blue= imagecolorallocate($bg,0x00,0x00,0xff); 
  54.     //填充背景 
  55.     imagefill($bg,0,0,$grey); 
  56.     //添加字符 
  57.     $pwidth=$this->width/$this->count
  58.     $x;$y
  59.     for($i= 0;$i<$this->count;$i++){<!--$this---> 
  60.       $rotation= rand(-40,40);//偏转角度±40° 
  61.       $fontsize= 33; 
  62.       $width_txt
  63.       $height_txt
  64.    
  65.       do
  66.         $fontsize--; 
  67.         $bbox= imagettfbbox($fontsize,$rotation,$this->keys[$i]['filename'],$this->keys[$i]['char']); 
  68.         $width_txt=$bbox[2] -$bbox[0];//x 0 2 4 6,y1 3 5 7;左下,右下,右上,左上 
  69.         $height_txt=$bbox[7] -$bbox[1]; 
  70.       }while($fontsize> 8 && ($height_txt>$this->height ||$width_txt>$pwidth)); 
  71.    
  72.       $fontcolor= imagecolorallocate($bg,rand(0,255),rand(0,255),rand(0,255)); 
  73.       $x= 8 +$pwidth*$i+$pwidth/2 -$width_txt/2;//x坐标基本位置 
  74.       $y=$this->height/2 -$height_txt/2; 
  75.    
  76.       imagettftext($bg,$fontsize,$rotation,$x,$y,$fontcolor,$this->keys[$i]['filename'],$this->keys[$i]['char']); 
  77.     } 
  78.     //绘制干扰线 
  79.     //根据字体酌情增加干扰线 
  80.     imageline($bg,0,15,40,10,$blue); 
  81.     //图像输出头文件 
  82.     header('Content-type:image/png'); 
  83.     //输出png图像 
  84.     imagepng($bg); 
  85.     //清除缓存资源 
  86.     imagedestroy($bg); 
  87.   } 
  88.    
  89.   publicfunctioncheckKeys($input){ 
  90.     if(count($input)!=$this->count){ 
  91.       return'ERROR:长度不正确.' 
  92.     }else
  93.       for($i=0;$i<$this->count;$i++){<!--$this---> 
  94.         //0 o O I l 1 校准,根据所选择的字体确定是否需要手动校准 
  95.         if($input[$i] !=$this->keys[$i]['char']){ 
  96.           return'SUCCESS.' 
  97.         }else//phpfensi.com 
  98.           return'ERROR:请输入正确验证码.' 
  99.         } 
  100.       } 
  101.     } 
  102.   } 
  103. ?>

Tags: php验证码 php生成器

分享到: