zoukankan      html  css  js  c++  java
  • 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、校验验证码内容

  • 相关阅读:
    趋势or过渡,量子点屏幕真的优于OLED?
    文件打开方式设置
    学Arduino 需要做哪些准备?(引自"知乎用户:郑兴芳,DhP"的回答)
    Arduino扫盲(持续添加中)
    订购一套Arduino UNO r3入门套件
    第一次接触Arduino
    关于移动端的事件委托问题
    ASDas
    CentOS利用source命令导入sql文件
    CentOS-LAMP
  • 原文地址:https://www.cnblogs.com/banshaohuan/p/4505037.html
Copyright © 2011-2022 走看看