用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > php教程

php网页生成验证码实现程序

时间:2015-01-23  来源:西部数据  作者:西部数据

首先在表单页面展现之前,生成一副图片,并添加上一些干扰像素或线段,防止OCR程序自动识别,再由PHP程序自动生成随机的待验证的一串数字和字母组合的字符,调用imagettftext()函数画到图片中,并把这串字符保存到Session级变量中.

完整实例:自动检测背景和字体,并随机选取背景图片中的一块范围,随机使用字体,显示验证字符串时随机显示字体大小,字符间距,字符颜色等,代码如下:

  1. <?php 
  2. /** 
  3. * Class for Validate image 
  4. * @author  zcs 
  5. * @version 1.0-20090828 
  6. */ 
  7.  
  8. session_start(); 
  9. class validimg 
  10. //背景图片目录 
  11. var $backgroundpath = ‘validbg’; 
  12. //生成验证码宽度 
  13. var $width =’80′; 
  14. //生成验证码高度 
  15. var $height =’25′; 
  16. //背景 
  17. var $background
  18. //验证文本 
  19. var $text=’abcd’; 
  20. //字体目录 
  21. var $fontpath = ‘validbg’; 
  22. //字体 
  23. var $font=’simhei.ttf’; 
  24. //字体宽度 
  25. var $font_width = ’20′; 
  26.  
  27. function validimg($text
  28. $this->text = $text
  29. //随机选取一个背景文件 
  30. $bgdir =  @dir($this->backgroundpath); 
  31. while(false !== ($image = $bgdir ->read())) 
  32. if($image != ‘.’ && $image != ‘..’ && $this->checktype($image) != false) 
  33. $backgroundarr[] = $image
  34.  
  35. $bgdir->close(); 
  36. //随机选取一个字体文件 
  37. $fonts =  @dir($this->fontpath); 
  38. while(false !== ($font = $fonts ->read())) 
  39. if($font != ‘.’ && $font != ‘..’ && $this->checktype($font,’FONT’) != false) 
  40. $fontsarr[] = $font
  41. $fonts->close(); 
  42. $this->font = $fontsarr[array_rand($fontsarr,1)]; 
  43. $this->background = $backgroundarr[array_rand($backgroundarr,1)]; 
  44.  
  45. $this->output(); 
  46.  
  47. //创建背景图像handdle 
  48. function createbackground() 
  49. switch ($this->checktype($this->background)) 
  50. case ‘jpg’: 
  51. $bghanddle = @imagecreatefromjpeg( $this->backgroundpath.’/’.$this->background); 
  52. break
  53. case ‘gif’: 
  54. $bghanddle = @imagecreatefromgif( $this->backgroundpath.’/’.$this->background); 
  55. break
  56. case ‘png’: 
  57. $bghanddle = @imagecreatefrompng( $this->backgroundpath.’/’.$this->background); 
  58. break
  59. default
  60. return $bghanddle
  61. //检查文件类型 
  62. function checktype( $image,$type = ‘IMAGE’) 
  63. $ext = substr$imagestrrpos($image,’.')+1); 
  64. if($type == ‘IMAGE’) 
  65. if ($ext == ‘jpg’ || $ext ==’gif’ || $ext ==’png’) 
  66. return $ext
  67. else return false; 
  68. }else if($type == ‘FONT’) 
  69. if ($ext == ‘ttf’) 
  70. return $ext
  71. else return false; 
  72. //输出 
  73. function output() 
  74. header(“content-type:image/png;”); 
  75. //生成图像 
  76. $img = @imagecreatetruecolor( $this->width,$this->height); 
  77. $bghanddle = $this->createbackground(); 
  78. //从背景图像随机位置载入一块作为背景 
  79. if($bghanddle
  80. $randx=rand(0,(imagesx($bghanddle) – $this->width)); 
  81. $randy=rand(0,(imagesy($bghanddle) – $this->height)); 
  82. imagecopy($img,$bghanddle,0,0,$randx,$randy,$this->width,$this->height); 
  83. //随机选择角度 字体大小 坐标输出文字 
  84. for($i=0;$i<strlen($this->text);$i++) 
  85. $angle = rand(-30,30); 
  86. $fontsize = rand(15,20); 
  87. $x = rand($this->font_width*$i,$this->font_width*$i+10); 
  88. $color = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255)); 
  89. imagettftext($img,$fontsize,$angle,$x,20,$color,$this->fontpath.’/’.$this->font,substr($this->text,$i,1)); 
  90. imagepng($img); 
  91. //释放资源 
  92. imagedestroy($img); 
  93. imagedestroy($bghanddle); 
  94. new validimg($_SESSION['valid']); 
  95. ?> 

测试文件validtest.php,代码如下:

  1. <?php 
  2. /** 
  3. * 验证码测试 
  4. * @author  zcs 
  5. */ 
  6. session_start(); 
  7. $_SESSION['valid']= randstr(); 
  8. echo $_SESSION['valid']; 
  9.  
  10. //随机生成字符串 
  11.  
  12. function randstr($num=4) 
  13. $chars = ‘ABDEFGHJKLMNPQRSTVWXYabdefghijkmnpqrstvwxy23456789′; 
  14. $randstr=”; 
  15. for($i=0;$i<$num;$i++) 
  16. $randstr.=substr($chars,rand(0,strlen($chars)),1); 
  17. return $randstr
  18. ?> 
  19. <img src=”validimg.php” />  
  20. 生成gif动态验证码,PHP生成GIF动画来实现动态图片验证码,以下是实现过程,ImageCode函数通过GIFEncoder类实现的GIF动画  
  21. /**    
  22.  * ImageCode 生成GIF图片验证    
  23.  * @param $string 字符串    
  24.  * @param $width 宽度    
  25.  * @param $height 高度    
  26.  * */   
  27. function ImageCode($string = ''$width = 75, $height = 25)    
  28. {    
  29.     $authstr = $string ? $string : ((time() % 2 == 0) ? mt_rand(1000, 9999) : mt_rand(10000, 99999));     
  30.         
  31.     $board_width = $width;    
  32.     $board_height = $height;    
  33.     // 生成一个32帧的GIF动画    
  34.     for($i = 0; $i < 32; $i++)    
  35.     {    
  36.         ob_start();    
  37.         $image = imagecreate($board_width$board_height);    
  38.         imagecolorallocate($image, 0,0,0);    
  39.         // 设定文字颜色数组     
  40.         $colorList[] = ImageColorAllocate($image, 15,73,210);    
  41.         $colorList[] = ImageColorAllocate($image, 0,64,0);    
  42.         $colorList[] = ImageColorAllocate($image, 0,0,64);    
  43.         $colorList[] = ImageColorAllocate($image, 0,128,128);    
  44.         $colorList[] = ImageColorAllocate($image, 27,52,47);    
  45.         $colorList[] = ImageColorAllocate($image, 51,0,102);    
  46.         $colorList[] = ImageColorAllocate($image, 0,0,145);    
  47.         $colorList[] = ImageColorAllocate($image, 0,0,113);    
  48.         $colorList[] = ImageColorAllocate($image, 0,51,51);    
  49.         $colorList[] = ImageColorAllocate($image, 158,180,35);    
  50.         $colorList[] = ImageColorAllocate($image, 59,59,59);    
  51.         $colorList[] = ImageColorAllocate($image, 0,0,0);    
  52.         $colorList[] = ImageColorAllocate($image, 1,128,180);    
  53.         $colorList[] = ImageColorAllocate($image, 0,153,51);    
  54.         $colorList[] = ImageColorAllocate($image, 60,131,1);    
  55.         $colorList[] = ImageColorAllocate($image, 0,0,0);    
  56.         $fontcolor = ImageColorAllocate($image, 0,0,0);    
  57.         $gray = ImageColorAllocate($image, 245,245,245);     
  58.             
  59.         $color = imagecolorallocate($image, 255,255,255);    
  60.         $color2 = imagecolorallocate($image, 255,0,0);    
  61.             
  62.         imagefill($image, 0, 0, $gray);    
  63.             
  64.         $space = 15;        // 字符间距    
  65.         if($i > 0)          // 屏蔽第一帧    
  66.         {    
  67.             for ($k = 0; $k < strlen($authstr); $k++)     
  68.             {     
  69.                 $colorRandom = mt_rand(0,sizeof($colorList)-1);     
  70.                 $float_top = rand(0,4);    
  71.                 $float_left = rand(0,3);    
  72.                 imagestring($image, 6, $space * $k$top + $float_topsubstr($authstr$k, 1), $colorList[$colorRandom]);    
  73.             }    
  74.         }    
  75.             
  76.         for ($k = 0; $k < 20; $k++)     
  77.         {     
  78.             $colorRandom = mt_rand(0,sizeof($colorList)-1);     
  79.             imagesetpixel($image, rand()%70 , rand()%15 , $colorList[$colorRandom]);     
  80.         
  81.         }    
  82.         // 添加干扰线    
  83.         for($k = 0; $k < 3; $k++)    
  84.         {    
  85.             $colorRandom = mt_rand(0, sizeof($colorList)-1);     
  86.             // $todrawline = rand(0,1);    
  87.             $todrawline = 1;    
  88.             if($todrawline)    
  89.             {    
  90.                 imageline($image, mt_rand(0, $board_width), mt_rand(0,$board_height), mt_rand(0,$board_width), mt_rand(0,$board_height), $colorList[$colorRandom]);    
  91.             }    
  92.             else     
  93.             {    
  94.                 $w = mt_rand(0,$board_width);    
  95.                 $h = mt_rand(0,$board_width);    
  96.                 imagearc($image$board_width - floor($w / 2) , floor($h / 2), $w$h,  rand(90,180), rand(180,270), $colorList[$colorRandom]);    
  97.             }    
  98.         }    
  99.         imagegif($image);    
  100.         imagedestroy($image);    
  101.         $imagedata[] = ob_get_contents();    
  102.         ob_clean();      
  103.         ++$i;      
  104.     }    
  105.         
  106.     $gif = new GIFEncoder($imagedata);      
  107.     Header ('Content-type:image/gif');      
  108.     echo $gif->GetAnimation();      
  109. }  
  110.  
  111. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  112. <html xmlns="http://www.w3.org/1999/xhtml">  
  113. <head>  
  114. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  115. <title>无标题文档</title>  
  116. <script language="javascript">  
  117.  function refresh_code()  
  118.  {  
  119.   form1.imgcode.src="verifycode.php?a="+Math.random();  
  120.  }  
  121. </script>  
  122. </head>  
  123. <body>  
  124. <form id="form1" name="form1" method="post" action="checkcode.php">  
  125.   <label for="code">验证码:</label>  
  126.   <input type="text" name="code" id="textfield" />  
  127.   <img id="imgcode" src="VerifyCode.php" alt="验证码" />  
  128.   <a href="javascript:refresh_code()">看不清?换一个</a>  
  129.   <input type="submit" name="button" id="button" value="提交" />  
  130. </form>  
  131. </body>  
  132. </html> 

checkcode.php文件如下:

  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  2. <?php  
  3. ini_set('display_errors''Off');  
  4. session_start();  
  5.   if((strtoupper($_POST["code"])) == strtoupper(($_SESSION["VerifyCode"]))){  
  6.  print("验证码正确,");  
  7.   }else{  
  8.     print("验证码错误,");  
  9.   }  
  10.   echo "提交的验证码:".strtoupper($_POST["code"]).",正确的验证码:".strtoupper($_SESSION["VerifyCode"]);  
  11. ?> 
来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
栏目更新
栏目热门