您的位置:阿里西西 > 编程技术 > PHP教程 > php验证码类,简单安全的php验证码

php验证码类,简单安全的php验证码

  本站整理   互联网   2016-11-09   点击:   我要评论

  一,验证码示例

  

\

  二,php验证码类,secoder.class.php

  1. <?php 
  2. /** 
  3.  * 安全验证码 
  4.  *  
  5.  * 安全的验证码要:验证码文字扭曲、旋转,使用不同字体,添加干扰码 
  6.  * 
  7.  * @author 流水孟春 <cmpan(at)qq.com> 
  8.  * @link http://labs.yulans.cn/YL_Security_Secoder 
  9.  * @link http://wiki.yulans.cn/docs/yl/security/secoder 
  10.  */ 
  11. class YL_Security_Secoder { 
  12.     /** 
  13.      * 验证码的session的下标 
  14.      *  
  15.      * @var string 
  16.      */ 
  17.     //public static $seKey = 'sid.sek ey.ylans.cn'; 
  18.     public static $seKey = 'sid'
  19.     public static $expire = 3000;     // 验证码过期时间(s) 
  20.     /** 
  21.      * 验证码中使用的字符,01IO容易混淆,建议不用 
  22.      * 
  23.      * @var string 
  24.      */ 
  25.     public static $codeSet = '346789ABCDEFGHJKLMNPQRTUVWXY'
  26.     public static $fontSize = 25;     // 验证码字体大小(px) 
  27.     public static $useCurve = true;   // 是否画混淆曲线 
  28.     public static $useNoise = true;   // 是否添加杂点  
  29.     public static $imageH = 0;        // 验证码图片宽 
  30.     public static $imageL = 0;        // 验证码图片长 
  31.     public static $length = 4;        // 验证码位数 
  32.     public static $bg = array(243, 251, 254);  // 背景 
  33.      
  34.     protected static $_image = null;     // 验证码图片实例 
  35.     protected static $_color = null;     // 验证码字体颜色 
  36.      
  37.     /** 
  38.      * 输出验证码并把验证码的值保存的session中 
  39.      * 验证码保存到session的格式为: $_SESSION[self::$seKey] = array('code' => '验证码值', 'time' => '验证码创建时间'); 
  40.      */ 
  41.     public static function entry() { 
  42.         // 图片宽(px) 
  43.         self::$imageL  self::$imageL = self::$length * self::$fontSize * 1.5 + self::$fontSize*1.5;  
  44.         // 图片高(px) 
  45.         self::$imageH  self::$imageH = self::$fontSize * 2; 
  46.         // 建立一幅 self::$imageL x self::$imageH 的图像 
  47.         self::$_image = imagecreate(self::$imageL, self::$imageH);  
  48.         // 设置背景       
  49.         imagecolorallocate(self::$_image, self::$bg[0], self::$bg[1], self::$bg[2]);  
  50.         // 验证码字体随机颜色 
  51.         self::$_color = imagecolorallocate(self::$_image, mt_rand(1,120), mt_rand(1,120), mt_rand(1,120)); 
  52.         // 验证码使用随机字体  
  53.         //$ttf = dirname(__FILE__) . '/ttfs/' . mt_rand(1, 20) . '.ttf';  4 
  54.         $ttf = dirname(__FILE__) . '/ttfs/4.ttf';   
  55.          
  56.         if (self::$useNoise) { 
  57.             // 绘杂点 
  58.             self::_writeNoise(); 
  59.         }  
  60.         if (self::$useCurve) { 
  61.             // 绘干扰线 
  62.             self::_writeCurve(); 
  63.         } 
  64.          
  65.         // 绘验证码 
  66.         $code = array(); // 验证码 
  67.         $codeNX = 0; // 验证码第N个字符的左边距 
  68.         for ($i = 0; $i<self::$length$i++) { 
  69.             $code[$i] = self::$codeSet[mt_rand(0, 27)]; 
  70.             $codeNX += mt_rand(self::$fontSize*1.2, self::$fontSize*1.6); 
  71.             // 写一个验证码字符 
  72.             imagettftext(self::$_image, self::$fontSize, mt_rand(-40, 70), $codeNX, self::$fontSize*1.5, self::$_color$ttf$code[$i]); 
  73.         } 
  74.          
  75.         // 保存验证码 
  76.         isset($_SESSION)  session_start(); 
  77.         $_SESSION[self::$seKey]['code'] = join(''$code); // 把校验码保存到session 
  78.         $_SESSION[self::$seKey]['time'] = time();  // 验证码创建时间 
  79.                  
  80.         header('Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate'); 
  81.         header('Cache-Control: post-check=0, pre-check=0', false);       
  82.         header('Pragma: no-cache');      
  83.         header("content-type: image/png"); 
  84.      
  85.         // 输出图像 
  86.         imagepng(self::$_image);  
  87.         imagedestroy(self::$_image); 
  88.     } 
  89.      
  90.     /**  
  91.      * 画一条由两条连在一起构成的随机正弦函数曲线作干扰线(你可以改成更帅的曲线函数)  
  92.      *       
  93.      *      高中的数学公式咋都忘了涅,写出来 
  94.      *      正弦型函数解析式:y=Asin(ωx+φ)+b 
  95.      *      各常数值对函数图像的影响: 
  96.      *        A:决定峰值(即纵向拉伸压缩的倍数) 
  97.      *        b:表示波形在Y轴的位置关系或纵向移动距离(上加下减) 
  98.      *        φ:决定波形与X轴位置关系或横向移动距离(左加右减) 
  99.      *        ω:决定周期(最小正周期T=2π/∣ω∣) 
  100.      * 
  101.      */ 
  102.     protected static function _writeCurve() { 
  103.         $A = mt_rand(1, self::$imageH/2);                  // 振幅 
  104.         $b = mt_rand(-self::$imageH/4, self::$imageH/4);   // Y轴方向偏移量 
  105.         $f = mt_rand(-self::$imageH/4, self::$imageH/4);   // X轴方向偏移量 
  106.         $T = mt_rand(self::$imageH*1.5, self::$imageL*2);  // 周期 
  107.         $w = (2* M_PI)/$T
  108.                          
  109.         $px1 = 0;  // 曲线横坐标起始位置 
  110.         $px2 = mt_rand(self::$imageL/2, self::$imageL * 0.667);  // 曲线横坐标结束位置            
  111.         for ($px=$px1$px<=$px2$px=$px+ 0.9) { 
  112.             if ($w!=0) { 
  113.                 $py = $A * sin($w*$px + $f)+ $b + self::$imageH/2;  // y = Asin(ωx+φ) + b 
  114.                 $i = (int) ((self::$fontSize - 6)/4); 
  115.                 while ($i > 0) {     
  116.                     imagesetpixel(self::$_image$px + $i$py + $i, self::$_color);  // 这里画像素点比imagettftext和imagestring性能要好很多                   
  117.                     $i--; 
  118.                 } 
  119.             } 
  120.         } 
  121.          
  122.         $A = mt_rand(1, self::$imageH/2);                  // 振幅         
  123.         $f = mt_rand(-self::$imageH/4, self::$imageH/4);   // X轴方向偏移量 
  124.         $T = mt_rand(self::$imageH*1.5, self::$imageL*2);  // 周期 
  125.         $w = (2* M_PI)/$T;       
  126.         $b = $py - $A * sin($w*$px + $f) - self::$imageH/2; 
  127.         $px1 = $px2
  128.         $px2 = self::$imageL
  129.         for ($px=$px1$px<=$px2$px=$px+ 0.9) { 
  130.             if ($w!=0) { 
  131.                 $py = $A * sin($w*$px + $f)+ $b + self::$imageH/2;  // y = Asin(ωx+φ) + b 
  132.                 $i = (int) ((self::$fontSize - 8)/4); 
  133.                 while ($i > 0) {             
  134.                     imagesetpixel(self::$_image$px + $i$py + $i, self::$_color);  // 这里(while)循环画像素点比imagettftext和imagestring用字体大小一次画出(不用这while循环)性能要好很多     
  135.                     $i--; 
  136.                 } 
  137.             } 
  138.         } 
  139.     } 
  140.      
  141.     /** 
  142.      * 画杂点 
  143.      * 往图片上写不同颜色的字母或数字 
  144.      */ 
  145.     protected static function _writeNoise() { 
  146.         for($i = 0; $i < 10; $i++){ 
  147.             //杂点颜色 
  148.             $noiseColor = imagecolorallocate( 
  149.                               self::$_image,  
  150.                               mt_rand(150,225),  
  151.                               mt_rand(150,225),  
  152.                               mt_rand(150,225) 
  153.                           ); 
  154.             for($j = 0; $j < 5; $j++) { 
  155.                 // 绘杂点 
  156.                 imagestring( 
  157.                     self::$_image
  158.                     5,  
  159.                     mt_rand(-10, self::$imageL),  
  160.                     mt_rand(-10, self::$imageH),  
  161.                     self::$codeSet[mt_rand(0, 27)], // 杂点文本为随机的字母或数字 
  162.                     $noiseColor 
  163.                 ); 
  164.             } 
  165.         } 
  166.     } 
  167.      
  168.     /** 
  169.      * 验证验证码是否正确 
  170.      * 
  171.      * @param string $code 用户验证码 
  172.      * @param bool 用户验证码是否正确 
  173.      */ 
  174.     public static function check($code) { 
  175.         isset($_SESSION)  session_start(); 
  176.         // 验证码不能为空 
  177.         if(emptyempty($code)  emptyempty($_SESSION[self::$seKey])) { 
  178.             //echo $_SESSION[self::$seKey]['code'].'1'; 
  179.             return false; 
  180.                      
  181.         } 
  182.         // session 过期 
  183.         if(time() - $_SESSION[self::$seKey]['time'] > self::$expire) { 
  184.             unset($_SESSION[self::$seKey]); 
  185.             //echo $_SESSION[self::$seKey]['code'].'2'; 
  186.             return false; 
  187.             //return 0; 
  188.         } 
  189.  
  190. //      if($code == $_SESSION[self::$seKey]['code']) { 
  191.         if(strtoupper($code) == $_SESSION[self::$seKey]['code']) { //不区分大小写比较 
  192.             //echo $_SESSION[self::$seKey]['code'].'3'; 
  193.             return true;         
  194.         } 
  195.         //echo $_SESSION[self::$seKey]['code'].'4'; 
  196.         return false; 
  197.                  
  198.     } 
  199.  
  200.  
  201. // useage 
  202. /* 
  203. YL_Security_Secoder::$useNoise = false;  // 要更安全的话改成true 
  204. YL_Security_Secoder::$useCurve = true; 
  205. YL_Security_Secoder::entry(); 
  206. */ 
  207.  
  208. /* 
  209. // 验证验证码 
  210. if (!YL_Security_Secoder::check(@$_POST['secode'])) { 
  211.     print 'error secode'; 
  212. } 
  213. */ 

  三,调用方法

  1,显示验证码页面code.php

  1. <?php   
  2.     session_start(); 
  3.     require 'secoder.class.php';  //先把类包含进来,实际路径根据实际情况进行修改。   
  4.     $vcode = new YL_Security_Secoder();      //实例化一个对象   
  5.     $vcode->entry();   
  6. ?>  

  2,检查验证码是否正确

  1. <?php   
  2.     session_start(); 
  3.     require 'secoder.class.php';  //先把类包含进来,实际路径根据实际情况进行修改。   
  4.     $vcode = new YL_Security_Secoder();      //实例化一个对象   
  5.     //$vcode->entry();   
  6.     $code = $_GET['code'];  
  7.     echo $vcode->check($code);         
  8.     //$_SESSION['code'] = $vc->getCode();//验证码保存到SESSION中 
  9. ?>  

  3,验证码输入框调用页面

  1. <img id="messageImg" src='images/tishis2.gif' width='16' height='16'> 单击图片重新获取验证码<br> 
  2. <a href="#"><img src="code.php" onclick="javascript:this.src='code.php?tm='+Math.random();" /> 
http://www.aseoe.com/ true php验证码类,简单安全的php验证码 http://www.aseoe.com/show-21-891-1.html report 23304.5   一,验证码示例    二,php验证码类,secoder class php<?php ***安全验证码**安全的验证码要:验证码文字扭曲、旋转,使用不同字体,添加干扰码**@author流水孟春<cmpan(at)qq com>*@linkhttp: labs y



更多关于 的文章
相关阅读
会员评论所有会员评论

  

相关排行总榜

ASP教程

PHP教程

.NET教程