PHP之验证码制作

"验证码用于屏蔽机器写入!!!"
目标:在底图上显示随机内容(如数字)
方法: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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Php:脚本语言,网站建设,服务器端运行 PHP定义:一种服务器端的HTML脚本/编程语言,是一种简单的、面向对象...
    廖马儿阅读 2,084评论 2 38
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,127评论 22 257
  • 背景 验证码就是把一串随机产品的数字动态生成一幅图片,再加上干扰元素。此时用户可以通过肉眼能识别里面的数字或者字符...
    dy2903阅读 1,994评论 0 7
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,014评论 11 349
  • 一天,周老板忽然收到绑匪的一个电话:“限你今天下午一点之前交出六万元现金,否则,等着为你儿子周小小收尸吧!” 周老...
    探秘桂北阅读 564评论 1 1