PHP实现验证码

 1 <?php
 2     /*********************************
 3     ***作用:实现验证码的后台PHP程序**
 4     ***时间:2015年05月14日***********
 5     *********************************/
 6     
 7     //session_start()必须处于脚本最顶部,多服务器情况,需要集中管理session信息
 8     session_start();
 9 
10 
11     $image = imagecreatetruecolor(100,30);//创建一个真彩色的图像,默认为黑色
12     $bgcolor = imagecolorallocate($image,255,255,255);//为一副图像分配颜色,返回一个颜色
13     imagefill($image,0,0,$bgcolor);//在坐标x、y处执行用颜色区域填充
14     
15     //注释内容为仅仅显示数字的验证码。控制好字体大小与分布,避免字体重叠或显示不全
16     /* for($i = 0;$i < 4;$i ++){
17         $fontsize = 6;
18         $fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
19         $fontcontent = rand(0,9);
20         
21         $x = ($i * 100/4) + rand(5,10);
22         $y = rand(5,10);
23         
24         imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
25     } */
26     
27     $captcha_code = '';//用来放验证码内数字的变量
28     for($i =0;$i < 4;$i ++){
29         $fontsize = 6;
30         $fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
31         
32         $data = 'abcdefghijkmnpqrstuvwxy3456789';
33         //从一个字符串中选出以start开始的长度为length的字符串
34         $fontcontent = substr($data,rand(0,strlen($data)),1);
35         
36         //让字符出现的地方为中间随机的位置
37         $x = ($i * 100/4) + rand(5,10);
38         $y = rand(5,10);
39         
40         //在图像image上以fontsize的大小在x、y的位置画颜色为fontcolor的字符
41         $captcha_code = imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
42     }
43     $_SESSION['authcode'] = $captcha_code;//将验证信息保存到超变量数组中
44     
45     //增加干扰点
46     for($i = 0;$i <200;$i ++){
47         $pointcolor = imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200));
48         
49         //在图像image中在x、y的位置中画一个颜色为color一像素的点
50         imagesetpixel($image,rand(1,99),rand(1,29),$pointcolor);
51     }
52     
53     //增加用来干扰的线条
54     //干扰信息一定要控制好颜色,避免“喧宾夺主”
55     for($i =0;$i < 3;$i ++){
56         $linecolor = imagecolorallocate($image,rand(80,220),rand(80,220),rand(80,220));
57         
58         //在图像中添加一个两点之间颜色为color的线条
59         imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
60     }
61     
62     //输入图片前,必须提前输出图片header的信息
63     //默认的是黑色的背景颜色
64     header('content-type:image/png');
65     
66     
67     //imagepng函数将图像以png的格式输入到浏览器或文件中
68     imagepng($image);
69     
70     
71     
72     // end结束时销毁图像
73     imagedestroy($image);

 

 

 1 <?php
 2     /*********************************
 3     ***作用:实现验证码的前台表单样式*
 4     ***时间:2015年05月14日***********
 5     *********************************/
 6     
 7     //如果存在$_REQUEST['authcode']变量,即用户输入验证码了
 8     if(isset($_REQUEST['authcode'])){
 9         session_start();
10         
11         //strtolower函数使得不分大小写
12         if(strtolower($_REQUEST['authcode']) == $_SESSION['authcode']){
13             echo '<font color = "#0000CC">输入正确</font>';
14         }else{
15             echo '<font color = "#0000CC"><b>输入错误</b></font>';
16         }
17         exit();
18     }
19 ?>
20 
21 <!DOCTYPE html>
22 <html>
23     
24     <head>
25         <meta charset = "utf-8"/>
26         <title>确认验证码</title>
27     </head>
28     <body>
29         <!-- 通过post方法将用户输入的信息传递给自己 -->
30         <form method = "post" action = "./form.php">
31             <p>验证码图片:
32                 <img id = "captcha_img" border = "1" src = "./captcha.php?r=<?php echo rand();?>" width == ""/>
33                 <!-- 实现动态验证:用JS选取器验证码图片、用JS修改验证码图片地址(改src) -->
34                 <a href = "javascript:void(0)" onclick = "document.getElementById('captcha_img').src = './captcha.php?r='+ Math.random()">换一个?</a>
35             </p>
36             <p>
37                 请输入验证码的内容:
38                 <input type = "text" name = "authcode" value = ""/>
39             </p>
40             <p>
41                 <input type = "submit" value = "提交" style = "padding:6px 20px;"/>
42             </p>
43         </form>
44     </body>
45 </html>

核心技术分析:

  1、生成底图

  2、生成验证码内容

  3、生成验证码图片

  4、校验验证码内容

posted @ 2015-05-15 08:44  banshaohuan  阅读(198)  评论(0编辑  收藏  举报