VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > PHP >
  • PHP生成图形验证码(加强干扰型)

验证码使用场景

我们在开发系统的过程中,基本所有的系统都会涉及到登录模块,其中验证码功能是这里面必不可少的一块,是防止系统被爆破的有效途径。所谓道高一尺魔高一丈,现在的验证码越来越复杂先进,常见的字母数字验证码,行为验证码。本文详细介绍简单的字母数字验证码。

代码:

  1. <?php 
  2.  
  3.  
  4.  
  5. /********************************************************************************* 
  6.  
  7.  * InitPHP 3.8.2 国产PHP开发框架   扩展类库-验证码 
  8.  
  9.  *------------------------------------------------------------------------------- 
  10.  
  11.  * 版权所有: CopyRight By initphp.com 
  12.  
  13.  * 您可以自由使用该源码,但是在使用过程中,请保留作者信息。尊重他人劳动成果就是尊重自己 
  14.  
  15.  *------------------------------------------------------------------------------- 
  16.  
  17.  * Author:zhuli Dtime:2014-11-25 
  18.  
  19.  ***********************************************************************************/ 
  20.  
  21. class Code 
  22.  
  23.  
  24.  
  25.  
  26.     private $charset = "abcdefghjklmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";   //随机因子 
  27.  
  28.     private $code;     //验证码文字 
  29.  
  30.     private $codelen = 4;    //验证码显示几个文字 
  31.  
  32.     private $width = 100;   //验证码宽度 
  33.  
  34.     private $height = 40;   //验证码高度 
  35.  
  36.     private $img;       //验证码资源句柄 
  37.  
  38.     private $font;     //指定的字体 
  39.  
  40.     private $fontsize = 20;  //指定的字体大小 
  41.  
  42.     private $fontcolor;     //字体颜色  随机 
  43.  
  44.  
  45.  
  46.     //构造类  编写字体 
  47.  
  48.     public function __construct() 
  49.  
  50.     { 
  51.  
  52.         $this->font = '/outputs/font/font.ttf'
  53.  
  54.     } 
  55.  
  56.  
  57.  
  58.     //创建4个随机码 
  59.  
  60.     private function createCode() 
  61.  
  62.     { 
  63.  
  64.         $_leng = strlen($this->charset) - 1; 
  65.  
  66.         for ($i = 1; $i <= $this->codelen; $i++) { 
  67.  
  68.             $this->code .= $this->charset[mt_rand(0, $_leng)]; 
  69.  
  70.         } 
  71.  
  72. //        session_start(); 
  73.  
  74. //        $_SESSION['VerifyCode'] = strtolower($this->code); 
  75.  
  76.         Session::set('VerifyCode'strtolower($this->code)); 
  77.  
  78.         return $this->code; 
  79.  
  80.     } 
  81.  
  82.  
  83.  
  84.     //创建背景 
  85.  
  86.     private function createBg() 
  87.  
  88.     { 
  89.  
  90.         //创建画布 给一个资源jubing 
  91.  
  92.         $this->img = imagecreatetruecolor($this->width, $this->height); 
  93.  
  94.         //背景颜色 
  95.  
  96.         $color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255)); 
  97.  
  98.         //画出一个矩形 
  99.  
  100.         imagefilledrectangle($this->img, 0, $this->height, $this->width, 0, $color); 
  101.  
  102.     } 
  103.  
  104.  
  105.  
  106.     //创建字体 
  107.  
  108.     private function createFont() 
  109.  
  110.     { 
  111.  
  112.         $_x = ($this->width / $this->codelen);   //字体长度 
  113.  
  114.         for ($i = 0; $i < $this->codelen; $i++) { 
  115.  
  116.             //文字颜色 
  117.  
  118.             $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156)); 
  119.  
  120.             //资源句柄 字体大小 倾斜度 字体长度  字体高度  字体颜色  字体  具体文本 
  121.  
  122.             imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x * $i + mt_rand(1, 5), $this->height / 1.4, $color$this->font, $this->code[$i]); 
  123.  
  124.         } 
  125.  
  126.     } 
  127.  
  128.  
  129.  
  130.     //随机线条 
  131.  
  132.     private function createLine() 
  133.  
  134.     { 
  135.  
  136.         //随机线条 
  137.  
  138.         for ($i = 0; $i < 6; $i++) { 
  139.  
  140.             $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156)); 
  141.  
  142.             imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color); 
  143.  
  144.         } 
  145.  
  146.         //随机雪花 
  147.  
  148.         for ($i = 0; $i < 45; $i++) { 
  149.  
  150.             $color = imagecolorallocate($this->img, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255)); 
  151.  
  152.             imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), '*'$color); 
  153.  
  154.         } 
  155.  
  156.     } 
  157.  
  158.  
  159.  
  160.     //输出背景 
  161.  
  162.     private function outPut() 
  163.  
  164.     { 
  165.  
  166.         //生成标头 
  167.  
  168.         header('Content-type:image/png'); 
  169.  
  170.         //输出图片 
  171.  
  172.         imagepng($this->img); 
  173.  
  174.         //销毁结果集 
  175.  
  176.         imagedestroy($this->img); 
  177.  
  178.     } 
  179.  
  180.  
  181.  
  182.     //对外输出 
  183.  
  184.     public function doimg() 
  185.  
  186.     { 
  187.  
  188.         //加载背景 
  189.  
  190.         $this->createBg(); 
  191.  
  192.         //加载文件 
  193.  
  194.         $this->createCode(); 
  195.  
  196.         //加载线条 
  197.  
  198.         $this->createLine(); 
  199.  
  200.         //加载字体 
  201.  
  202.         $this->createFont(); 
  203.  
  204.         //加载背景 
  205.  
  206.         $this->outPut(); 
  207.  
  208.     } 
  209.  
  210.  
  211.  
  212.     //获取验证码 
  213.  
  214.     public function getCode() 
  215.  
  216.     { 
  217.  
  218.         return strtolower($this->code); 
  219.  
  220.     } 
  221.  
  222.  
  223.  
  224.     //验证验证码 
  225.  
  226.     public function checkCode($code$clear = false) 
  227.  
  228.     { 
  229.  
  230. //        session_start(); 
  231.  
  232.         if (Session::get('VerifyCode') == strtolower($code)) { 
  233.  
  234.             if($clear$this->clearCode(); 
  235.  
  236.             return true; 
  237.  
  238.         } 
  239.  
  240.         if($clear$this->clearCode(); 
  241.  
  242.         return false; 
  243.  
  244.     } 
  245.  
  246.  
  247.  
  248.     //清除验证码 
  249.  
  250.     public function clearCode() 
  251.  
  252.     { 
  253.  
  254.         Session::del('VerifyCode'); 
  255.  
  256. //        session_start(); 
  257.  
  258. //        unset ($_SESSION['VerifyCode']); 
  259.  
  260.     } 
  261.  

验证:

ob_clean();

$verify = new Code();

$verify->doimg();

这样即可输出如下验证码

PHP生成图形验证码(加强干扰型)

可以调整参数控制验证码的大小,干扰项等。

拓展

接下来介绍下拓展的功能,怎么加强验证码的干扰项,怎么结合到项目丽进行登录验证。

1. 加强干扰

首先我们可以看到上面的截图中少数线条,如果外者使用分析工具来解码,那么会很简单的就解出我们的验证码,这时候就需要添加线条的数量,在代码中找到以下代码并修改

  1. //随机线条 
  2.  
  3. private function createLine() 
  4.  
  5.  
  6.     //随机线条  
  7.  
  8.     for ($i = 0; $i < 6; $i++) { 
  9.  
  10.         $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156)); 
  11.  
  12.         imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color); 
  13.  
  14.     } 
  15.  
  16.     //随机雪花 
  17.  
  18.     for ($i = 0; $i < 45; $i++) { 
  19.  
  20.         $color = imagecolorallocate($this->img, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255)); 
  21.  
  22.         imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), '*'$color); 
  23.  
  24.     } 
  25.  

上面的数字6可以慢慢调整,然后查看效果直到满意。同时可以看到验证码中有很多雪花效果,这个也是干扰项,可以修改上面的数字45来调整到自己满意的结果。

注意:代码中的$charset变量,验证码是从这边随机取字符来生存验证,由于小写的i和L展示的效果很难分辨,所以我们去除了i字符。

2. 接入项目验证

新建个文件,代码如下

  1. <?php 
  2.  
  3. ob_clean(); 
  4.  
  5. $verify = new Code(); 
  6.  
  7. $verify->doimg(); 

然后在现有的系统登录页面引入这个接口即可展示验证码,在用户填写提交之后,服务端做以下验证

  1. //验证验证码 
  2.  
  3. public function checkCode($code$clear = false) 
  4.  
  5.  
  6.     if (Session::get('VerifyCode') == strtolower($code)) { 
  7.  
  8.         if($clear$this->clearCode(); 
  9.  
  10.             return true; 
  11.  
  12.     } 
  13.  
  14.     if($clear$this->clearCode(); 
  15.  
  16.     return false; 
  17.  
  18.  
  19. //清除验证码 
  20.  
  21. public function clearCode() 
  22.  
  23.  
  24.     Session::del('VerifyCode'); 
  25.  

至此,验证码的生成以及验证流程都已完成。

 



原文链接:http://www.phpfensi.com/php/20220610/21017.html


相关教程