gpt4 book ai didi

Thinkphp3.2实用篇之计算型验证码示例

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Thinkphp3.2实用篇之计算型验证码示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

是不是觉得普通的验证码已经没办法满足,接下来介绍如何将tp现有的验证码改为计算型验证码:

首先找到:ThinkPHP\Library\Think\Verify.class.php 。

在其中加入以下代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
public function entry_add( $id = '' ) {
     $this ->length= '3' ;
     // 图片宽(px)
     $this ->imageW || $this ->imageW = $this ->length* $this ->fontSize*1.5 + $this ->length* $this ->fontSize/2;
     // 图片高(px)
     $this ->imageH || $this ->imageH = $this ->fontSize * 2.5;
     // 建立一幅 $this->imageW x $this->imageH 的图像
     $this ->_image = imagecreate( $this ->imageW, $this ->imageH);
     // 设置背景  
     imagecolorallocate( $this ->_image, $this ->bg[0], $this ->bg[1], $this ->bg[2]);
 
     // 验证码字体随机颜色
     $this ->_color = imagecolorallocate( $this ->_image, mt_rand(1,150), mt_rand(1,150), mt_rand(1,150));
     // 验证码使用随机字体
     $ttfPath = dirname( __FILE__ ) . '/Verify/' . ( $this ->useZh ? 'zhttfs' : 'ttfs' ) . '/' ;
 
     if ( empty ( $this ->fontttf)){
       $dir = dir( $ttfPath );
       $ttfs = array ();   
       while (false !== ( $file = $dir ->read())) {
         if ( $file [0] != '.' && substr ( $file , -4) == '.ttf' ) {
           $ttfs [] = $file ;
         }
       }
       $dir ->close();
       $this ->fontttf = $ttfs [ array_rand ( $ttfs )];
     }
     $this ->fontttf = $ttfPath . $this ->fontttf;
    
     if ( $this ->useImgBg) {
       $this ->_background();
     }
    
     if ( $this ->useNoise) {
       // 绘杂点
       $this ->_writeNoise();
     }
     if ( $this ->useCurve) {
       // 绘干扰线
       $this ->_writeCurve();
     }
    
     // 绘验证码
     $code = array (); // 验证码
     $symbol = array ( '+' , '-' );
     $codeNX = 0; // 验证码第N个字符的左边距
     $now_symbol = $symbol [rand(0,1)];
     for ( $i = 0; $i < $this ->length; $i ++) {
       if ( $i ==1){
         $code [ $i ] = $now_symbol ;
         $codeNX += mt_rand( $this ->fontSize*1.2, $this ->fontSize*1.6);
         imagettftext( $this ->_image, $this ->fontSize,0, $codeNX , $this ->fontSize*1.6, $this ->_color, $ttfPath . '2.ttf' , $code [ $i ]);
       }
       else {
         $code [ $i ] = $this ->codeSet[mt_rand(0, strlen ( $this ->codeSet)-1)];
         $codeNX += mt_rand( $this ->fontSize*1.2, $this ->fontSize*1.6);
         imagettftext( $this ->_image, $this ->fontSize, mt_rand(-40, 40), $codeNX , $this ->fontSize*1.6, $this ->_color, $this ->fontttf, $code [ $i ]);
       }
     }
    
     // 保存验证码
     $key    $this ->authcode( $this ->seKey);
     $str =implode( '' , $code );
     eval ( "\$re=$str;" );
     $code    $this ->authcode( $re );
     $secode   array ();
     $secode [ 'verify_code' ] = $code ; // 把校验码保存到session
     $secode [ 'verify_time' ] = NOW_TIME; // 验证码创建时间
     session( $key . $id , $secode );
            
     header( 'Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate' );
     header( 'Cache-Control: post-check=0, pre-check=0' , false);   
     header( 'Pragma: no-cache' );
     header( "content-type: image/png" );
 
     // 输出图像
     imagepng( $this ->_image);
     imagedestroy( $this ->_image);
   }
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public function check_add( $code , $id = '' ) {
     $key = $this ->authcode( $this ->seKey). $id ;
     // 验证码不能为空
     $secode = session( $key );
     if ( $code ===false || empty ( $secode )) {
       return false;
     }
     //验证码是否是数字
     if (! is_numeric ( $code )) {
       return false;
     }
     // session 过期
     if (NOW_TIME - $secode [ 'verify_time' ] > $this ->expire) {
       session( $key , null);
       return false;
     }
     if ( $this ->authcode( $code ) == $secode [ 'verify_code' ]) {
       $this ->reset && session( $key , null);
       return true;
     }
     return false;
   }

生成方法:

?
1
2
3
4
5
6
7
8
Public function verify(){
     import( 'ORG.Util.Verify' );
     $Verify = new Verify();
     $Verify ->useNoise = true;
     $Verify ->codeSet = '0123456789' ;
     $Verify ->useCurve = false;
     $Verify ->entry_add();
   }

验证方法:

?
1
2
3
4
if (!check_verify( $verify , '' , 'add' )) {
      $this ->error( '验证码错误!' );
      return ;
    }

 调用的公共方法:

?
1
2
3
4
5
6
7
8
9
10
11
// 检测输入的验证码是否正确,$code为用户输入的验证码字符串
function check_verify( $code , $id = '' , $type = '' ){
   import( 'ORG.Util.Verify' );
   $verify = new Verify();
   if ( $type = 'add' ){
     return $verify ->check_add( $code , $id );
   }
   else {
     return $verify ->check( $code , $id );
   }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:http://www.cnblogs.com/phperyin/archive/2017/02/09/6382305.html 。

最后此篇关于Thinkphp3.2实用篇之计算型验证码示例的文章就讲到这里了,如果你想了解更多关于Thinkphp3.2实用篇之计算型验证码示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com