博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP验证码的制作教程
阅读量:5230 次
发布时间:2019-06-14

本文共 5180 字,大约阅读时间需要 17 分钟。

自己过去自学了PHP绘画验证码的教程,现在就把这一部分笔记跟大家分享,希望可以帮到大家。

顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百度云下载,这样以后你们开发就可以直接翻笔记不用百度搜那么麻烦了。

 笔记链接: 密码:pvj2

 

下面主要从理论+实践代码进行讲解,后面有代码实例。

 

一、验证码的介绍

验证码是为全自动区分计算机和人类的图灵测试的缩写。是一种区分用户是计算机和人的公共全自动程序。

二、验证码应用场景?

(都是为了区分人还是机器,屏蔽机器请求)
a)登录、注册确定提交前,做人/机器校验;
b)发布、回复信息前,做人/机器校验;
c)疑似机器请求时,做人/机器校验;
………………

 

三、验证码服务的核心技术分析

实现步骤:
  1.生成底图;
  2.生成验证内容;
  3.生成验证码图片;
  4.校验验证内容;

技术点:

  a)底图的实现,并且添加干扰元素;
    依赖PHP图片处理库GD
    http://php.net/gd
  b)生成验证内容
    简单的随机数生成,使用PHP函数mt_rand();
    随机数字+字母生成,需要ASCII码理论基础;
    随机中文生成,需要UTF-8编码理论基础;
  c)验证内容保存在服务端;
    需要PHP操作SESSION基础
  d)验证内容的校验
    需要前端Ajax基础;

注意事项:

  a)依赖GD扩展
  b)输出图片前,必须提前输出图片header信息;
  c)该方法默认输出为黑色背景

 

从理论部分,然后按步骤进行一步一步的写下面的代码:

验证码的实例:(基本的验证码

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
<?php
    
session_start();
    
// 先制作底图
    
$image 
= imagecreatetruecolor(100, 30);
    
$bgcolor 
= imagecolorallocate(
$image
, 255, 255, 255);
//生成底片颜色,默认为黑色
    
imagefill(
$image
, 0, 0, 
$bgcolor
);
//x,y轴上的位置
/*// 在地图上显示随机数字
    
for($i=0;$i<4;$i++){
        
$fontsize=6;
        
$fontcolor = imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120));
        
$fontcontent=rand(0,9);//数字0~9
        
// 关键的部分 (注意事项:控制好字体大小与分布,避免字体重叠或显示不全)
        
$x=($i*100/4)+rand(5,10); //写在的坐标上
        
$y=rand(5,10);
        
imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);
    
}
*/
/*  //数字和字母验证码
    
for($i=0;$i<4;$i++){
        
$fontsize=6;
        
$fontcolor=imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120));
        
$data ='abcdefghigkmnpqrstuvwxy3456789';
        
$fontcontent=substr($data, rand(0,strlen($data)),1);
        
$x=($i*100/4+rand(5,10));
        
$y=rand(5,10);
        
imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);
    
}*/
     
    
$captch_code
=
""
;
    
//字母验证码
    
for
(
$i
=0;
$i
<4;
$i
++){
        
$fontsize
=6;
        
$fontcolor
=imagecolorallocate(
$image
, rand(0,120),rand(0,120), rand(0,120));
        
$data 
=
'abcdefghigkmnpqrstuvwxy'
;
        
$fontcontent
=
substr
(
$data
, rand(0,
strlen
(
$data
)),1);
        
$captch_code
.=
$fontcontent
;
        
$x
=(
$i
*100/4+rand(5,10));
        
$y
=rand(5,10);
        
imagestring(
$image
$fontsize
$x
$y
$fontcontent
$fontcolor
);
    
}
    
$_SESSION
[
'authcode'
]=
$captch_code
;
    
// 添加点的干扰素
    
for
(
$i
=0;
$i
<200;
$i
++){
        
$pointcolor 
= imagecolorallocate(
$image
, rand(50,200), rand(50,200), rand(50,200));
        
imagesetpixel(
$image
, rand(1,99), rand(1,29), 
$pointcolor
);
    
}  
// 添加线干扰
    
for
(
$i
=0;
$i
<3;
$i
++){
        
$linecolor
=imagecolorallocate(
$image
, rand(80,220), rand(80,220),rand(80,220));
        
imageline(
$image
, rand(1,99),rand(1,29), rand(1,99),rand(1,29),
$linecolor
);
    
}
    
header(
'content-type:image/png'
);
//输出png的图片
    
imagepng(
$image
);
//生成图片
    
// 销毁图片
    
imagedestroy(
$image
);
?>

  

关于PHP的验证代码部分后,就是配上前端的显示页面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!
DOCTYPE 
html>
<
html 
lang="en">
<
head
>
    
<
meta 
charset="UTF-8">
    
<
title
>登录</
title
>
</
head
>
<
body
>
    
<
form 
action="reg.php" method="post">
    
<
img 
id="captcha_img" src="verify.php?r=<?php echo rand();?>">
    
<
a 
href="javascript:void(0);" onclick="document.getElementById('captcha_img').src='verify.php?+Math.random()';" title="换一个?">看不清?</
a
><
br
>
        
验证码:<
input 
type="text" name="authcode">
        
<
input 
type="submit" >
    
</
form
>
</
body
>
</
html
>

 上面是数字的验证码,下面的这部分PHP是图片验证码的页面图片验证码的显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
    
session_start();
     
// 图片的验证码
    
$table
=
array
(
        
"pic0"
=>
'狗'
,
        
"pic1"
=>
'猫'
,
        
"pic2"
=>
'鱼'
,
        
"pic3"
=>
'鸟'
        
);
    
$index
=rand(0,3);
    
$value
=
$table
[
'pic'
.
$index
];
    
$_SESSION
[
'authcode'
]=
$value
;
    
$filename
=dirname(
__FILE__
).
'\\pic'
.
$index
.
'.jpg'
;
//需要自己准备好图片!!
1 $contents=file_get_contents($filename); header('content-type:image/jpg'); echo $contents; ?>

 

下面这个是汉字的显示代码:

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
汉字的验证码:
<?php
    
session_start();
    
// 先制作底图
    
$image 
= imagecreatetruecolor(200, 60);
    
$bgcolor 
= imagecolorallocate(
$image
, 255, 255, 255);
//生成底片颜色,默认为黑色
    
imagefill(
$image
, 0, 0, 
$bgcolor
);
//x,y轴上的位置
    
$fontface
=
'msyh.ttf'
;
    
$str
=
"刘恒春美女帅哥看这里来好样的我知道了是"
;
    
$strdb
=
str_split
(
$str
,3);
//每三个长算一个汉字
    
header(
"content-type:text/html;charset='utf8'"
);
    
$captch_code
=
""
;
    
//中文验证码
    
for
(
$i
=0;
$i
<4;
$i
++){
        
$fontcolor
=imagecolorallocate(
$image
, rand(0,120),rand(0,120), rand(0,120));
        
$index
=rand(0,
count
(
$strdb
));
        
$cn
=
$strdb
[
$index
];
        
$captch_code
.=
$cn
;
        
imagettftext(
$image
, mt_rand(20,24), mt_rand(-60,60), (40*
$i
+20), mt_rand(30,35),
$fontcolor
,
$fontface
,
$cn
);
    
}
    
$_SESSION
[
'authcode'
]=
$captch_code
;
    
// 添加点的干扰素
    
for
(
$i
=0;
$i
<200;
$i
++){
        
$pointcolor 
= imagecolorallocate(
$image
, rand(50,200), rand(50,200), rand(50,200));
        
imagesetpixel(
$image
, rand(1,199), rand(1,59), 
$pointcolor
);
    
}  
// 添加线干扰
    
for
(
$i
=0;
$i
<3;
$i
++){
        
$linecolor
=imagecolorallocate(
$image
, rand(80,220), rand(80,220),rand(80,220));
        
imageline(
$image
, rand(1,199),rand(1,59), rand(1,199),rand(1,59),
$linecolor
);
    
}
    
header(
'content-type:image/png'
);
//输出png的图片
    
imagepng(
$image
);
//生成图片
    
// 销毁图片
    
imagedestroy(
$image
);
     
?>

  

综上的全部就是验证码代码的总结了,如果有需要可以到我下面的百度云里面下载对应的笔记。

笔记链接: 密码:pvj2

 

转载于:https://www.cnblogs.com/xieyulin/p/7056119.html

你可能感兴趣的文章
log4net学习
查看>>
在Eclipse中配置Maven
查看>>
线段树的坑
查看>>
图片乱换
查看>>
C#调用ADOX创建ACCESS数据文件后关闭连接
查看>>
VUE常见的语法
查看>>
navicat premium各个版本及激活
查看>>
Array.Sort 谷歌内核 数组大小超过10 排序字段都一致 返回的数组非原数组
查看>>
实例六分页处理
查看>>
转载 失踪
查看>>
P1113 杂务
查看>>
RQNOJ:PID30 / [stupid]愚蠢的矿工☆(树形背包)
查看>>
Sharepoint学习笔记—习题系列--70-576习题解析 -(Q141-Q143)
查看>>
Effective C++ 37绝不重新定义继承而来的缺省参数值
查看>>
翻译 - 【Dojo Tutorials】Fundamentals 1 Classy JavaScript with dojo/_base/declare
查看>>
EasyDarwin做转发延时太大?
查看>>
浅谈ldap以及jndi
查看>>
Python – locals和globals
查看>>
angular 1.6路由
查看>>
[原创]java WEB学习笔记28: 会话与状态管理Cookie 机制
查看>>