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、校验验证码内容