美文网首页
PHP之验证码制作

PHP之验证码制作

作者: 吾是小马哥 | 来源:发表于2017-11-02 11:58 被阅读11次
    "验证码用于屏蔽机器写入!!!"
    目标:在底图上显示随机内容(如数字)
    方法:init imagecolorallocate ( resource $image , int $red , int $green , int $blue)
         bool imagestring ( resource $image , int $font , int $x , int $y , string $s ,  
     int $col)
    注意事项:控制好字体与分布,避免字体重叠或显示不全
    
    目标:为验证码增加干扰元素,干扰的点或线(两点确定一条线)
    方法:bool imagesetpixel(resource $image,int $x,int $y,int $color)
        bool imageline(resource $image,int $x1,int $y1,int $x2,int $y2,int $color)
    注意事项:干扰信息一定控制好颜色,避免“喧宾夺主”
    
    captcha.php:
    <?php
      //生成一张背景图片
      $image = imagecreatetruecolor(100,30);//创建一个宽100高30的区域
      $bgcolor = imagecolorallocate($image,255,255,255);//#ffffff
      imagefill($image,0,0,$bgcolor);//附上颜色
      //在底图上生成随机四个数字
      for( $i = 0; $i < 4; $i++) {
           $fontsize=6;
           $fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
           $fontcontent=rand(0,9);
           $x=( $i * 100 / 4 )+rand(5,10);//设置x、y轴区间
           $y=rand(5,10);
           imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
       }
      
      //为底图添加干扰点
      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));
          imageline( $image, rand(1,99), rand(1,29), rand(1,99), rand(1,29), linecolor);
      }
    
      header("Content-type: text/html; charset=utf-8");//乱码问题
      header('content-type:image/png');
      imagepng($image);
    
      //end
      imagedestory($image);
    
    • php实现字母验证码
    目标:让图片上的验证码内容显示为字母,或数字、字母混合体
    方法:int rand ( int $min, int $max )
    mixed array_rand ( array $input [, int $num_req = 1] )
    注意事项:N/A
    for( $i = 0; $i < 4; $i++) {
        $fontsize = 6;
        $fontcolor = imagecolorallocate( $image, rand(0,120), rand(0,120),rand(0,120));
        $data = 'abcdefghijklmnopqrstuvwxyz123456789';
        $fontcontent = substr( $data,rand(0,strlen($data)-1), 1 );
        $x=( $i * 100 / 4 )+rand(5,10);//设置x、y轴区间
        $y=rand(5,10);
        imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
     }
    
    • php通过session存储验证信息
    目标:再服务器端记录验证码信息,便于用户输入后做校验
    方法:bool session_start ( void )
    注意事项:1. session_start()必须处于脚本最顶部
    2. 多服务器情况,需要考虑几种管理session信息
    <?php
      session_start();
    
      $captch_code = '';
      for( $i = 0; $i < 4; $i++) {
        $fontsize = 6;
        $fontcolor = imagecolorallocate( $image, rand(0,120), rand(0,120),rand(0,120));
        $data = 'abcdefghijklmnopqrstuvwxyz123456789';
        $fontcontent = substr( $data,rand(0,strlen($data)-1), 1 );
        $x=( $i * 100 / 4 )+rand(5,10);//设置x、y轴区间
        $y=rand(5,10);
        imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
     }
      //保存到session中指定字段里
      $_SESSION['authcode'] = $captch_code;
    
    • 验证码通过表单提交、校验
    目标:将已生成的验证码提供给用户,并校验用户验证码的正确性
    方法:HTML<form>表单基础
    注意事项:N/A
    <?php
         if(isset($_REQUEST['authcode']))
         {
            session_start();
            //strtolower 转化为小写
            if (strtolower($_REQUEST['authcode'])==$_SESSION['authcode']) 
            {
                header('Content-type: text/html; charset=UTF8'); 
                echo '<font color="#0000CC">输入正确</font>';
            }
            else{
                header('Content-type: text/html; charset=UTF8'); 
                echo '<font color="#CC0000"><b>输入错误</b></font>';
                }
            exit();
         }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8"/> 
        <title>确认验证</title>
    </head>
     <body>
      <form method="post" action="./form.php">
       <p>验证码图片:<img id="captcha_img" border="1" src="./captcha.php?r=<?php echo rand();?>" width="100" height="30">
        <a href="javascript:void(0)" onClick="document.getElementById('captcha_img').src='./captcha.php?r='+Math.random()">换一个?</a>
       </p>
      
       <p>请输入图片的内容:<input type="text" name="authcode" value=""/></p>
       <p><input type="submit" value="提交" style="padding:6px 20px;"></p>
      </form>
     </body>
    </html>
    
    • 使用js实现动态校验验证码
    1. 增加可点击的“换一个”文案
    2. 用js选取器选取验证码图片
    3. 用js修改验证码图片地址(改src)
    
    

    相关文章

      网友评论

          本文标题:PHP之验证码制作

          本文链接:https://www.haomeiwen.com/subject/mbsopxtx.html