zoukankan      html  css  js  c++  java
  • 使用php生成数字、字母组合验证码

    项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略。实现方法多种多样,下面就来讲解下如何用php生成简单的文字+数字组合的验证码: 

    所用语言php,gd库

    原理解释:

    a>实质上是在服务器端随机生成验证码,将其存储在$_SESSION中。

    b>然后将验证码写在图片上,将图片发送至客户端,用户输入图片的上的验证码,递交给服务器。

    c>服务端再与$_SESSION中存储的信息比对,一致则通过,否则不通过。

     

    分为两步:

    1)第一步服务器端生成验证码

    2)客户端使用验证码

    第一步:在服务器端如何生成验证码:<code.php>

    <?php
    session_start(); //1>session_start()必须置于最顶部,2>多服务器,要考虑集中管理session信息
     //phpinfo();//打印出php的信息
     //1.生成一张底图(100;height:30)
    $image=imagecreatetruecolor(100,30);
    $bgcolor=imagecolorallocate($image,255,255,255);//画笔着色
    imagefill($image,0,0,$bgcolor);//将底图的着色
     
    //随机生成四个数字
    /*
    for($i=0;$i<4;$i++){
        $fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
        $fontcontent=rand(0,9);//验证码的内容
        $fontsize=6;//字体大小
        $x=($i*100/4)+rand(5,10);//x轴
        $y=rand(5,10);//Y轴
        imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);//使用imagestring()将文字写在画布上
    }
    */
    $captch_code="";
    for($i=0;$i<4;$i++){
        $fontsize=6;
        $fontcolor=imagecolorallocate($image,rand(20,100),rand(30,100),rand(10,200));
        $str="abcdefghkmnpwsert1234567890";//给出一个字符串,用于生成随机验证码
        $fontcontent=substr($str,rand(0,strlen($str)),1);//每次截取一个字符
        $captch_code.=$fontcontent;//拼接
        $x=($i*100/4)+rand(5,10);
        $y=rand(5,10);
        imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
    }
    $_SESSION['authcode']=$captch_code;//保存在session中
    //添加干扰点
    for($i=0;$i<100;$i++){
        $pointcolor=imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200));
        imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor);
    }
    //添加干扰线
    for($i=0;$i<3;$i++){
        $linecolor=imagecolorallocate($image,rand(80,200),rand(80,200),rand(80,200));
        imageline($image,rand(5,95),rand(5,25),rand(5,95),rand(5,25),$linecolor);
    }ob_clean();//清空缓存
    header("content-type:".'image/png');//输出图片的头文件固定格式(可以是image/jpg、image/png、)
    imagepng($image);//向浏览器输出一张图片
    imagedestroy($image);//销毁内存中的底图
     
    //session_start
    

      第二步:将生成的验证码图片返回给客户端<form.php>

    <?php
    header("Content-type:text/html;charset=utf-8");//避免出现乱码的情况
    if(isset($_REQUEST['authcode'])){
        session_start();//使用$_SESSION之前必须使用session_start()
        if(strtolower($_REQUEST['authcode'])==$_SESSION["authcode"]){//$_SESSION['authcode']是服务器端存储的验证码,$_REQUEST['authcode']获取客户端输入的信息
            echo "<font color='#000cc'>输入正确</font>";
        }
        else{
            echo "<font color='#0000cc'>输入错误</font>";
        }
        exit();
    }
    ?>
    

      

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>验证码正确</title>
        </head>
    </html>
    <body>
        <form action="./form.php">
            <p>验证码图片:<br>
    //点击验证码图片本身进行验证码的切换(需求一)
        //生成随机数字,便于访问服务端,如果地址是相同的则浏览器不会刷新访问
            <img id="captCode" src="./code.php?=<?php echo rand();?>" width="100px;height:100px;" alt=""
                     onclick="this.src='code.php?+ Math.random()'">  
    //点击‘点击切换’,切换验证码(需求二)
                <img id="captCode" src="./code.php?=--><?php //echo rand();?><!--" width="100px;height:100px;" alt="">         
                <a href="javascript:void(0)" onclick="document.getElementById('captCode').src='code.php?=<?php echo rand();?>'">点击切换?</a>
            </p>
            <p>请输入验证码的内容:
                <input type="text" name="authcode" value=""/>
            </p>
            <P>
                <input type="submit" value="提交" style="padding:6px 20px;"/>
            </P>
        </form>
    </body>
    

      

    几点异常:

    1): 如果出现乱码的情况:header("Content-type:text/html;charset=utf-8");//避免出现乱码的情况

    2):如果验证码图片不能显示在前端:那可能是缓存的问题:

    事实截图:

     

  • 相关阅读:
    验证手机和电话号码
    oracle取字符串长度的函数length()和hengthb()
    AngularJs教程
    nop commerce文档
    根据子查询批量删除的sql语句
    AngularJs赋值问题
    PetaPoco模糊查询
    js转换 /Date(1464671903000)/ 格式的日期的方法
    jquery-cookie插件怎么读写json数据
    executssql 函数的每一句代码的意思
  • 原文地址:https://www.cnblogs.com/tdalcn/p/8949974.html
Copyright © 2011-2022 走看看