PHP之验证码制作

2017-11-02  本文已影响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);
目标:让图片上的验证码内容显示为字母,或数字、字母混合体
方法: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);
 }
目标:再服务器端记录验证码信息,便于用户输入后做校验
方法: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>
1. 增加可点击的“换一个”文案
2. 用js选取器选取验证码图片
3. 用js修改验证码图片地址(改src)

上一篇下一篇

猜你喜欢

热点阅读