是不是觉得普通的验证码已经没办法满足,接下来介绍如何将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