php验证码

作者: 半数的年 | 来源:发表于2018-07-16 00:22 被阅读0次

    理论分析

    image.png
    image.png

    1、实现验证码底图

    image.png
    $image = imagecreatetruecolor(100,300);
    // 为一副图像分配颜色
    $bgcolor = imagecolorallocate($image,255,255,255);
    // 为区域填充颜色
    imagefill($image,0,0,$bgcolor);
    header('Content-type: image/png'); // 提前输出图片header信息
    imagepng($image);   // 浏览器输出图片
    imagedestory($image);   // 销毁资源
    // output 浏览器输出白色的图片
    

    2、实现数字验证码

    image.png
    $image = imagecreatetruecolor(100,300);
    // 为一副图像分配颜色
    $bgcolor = imagecolorallocate($image,255,255,255);
    // 为区域填充颜色
    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); // 第i个数字的x坐标
        $y = rand(5,10); // 第i个数字的y坐标
    
        imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
    }
    header('Content-type: image/png'); // 提前输出图片header信息
    imagepng($image);   // 浏览器输出图片
    imagedestory($image);   // 销毁资源
    

    输出


    image.png

    3、增加干扰元素

    image.png
    (1)、追加干扰点
    $image = imagecreatetruecolor(100,300);
    // 为一副图像分配颜色
    $bgcolor = imagecolorallocate($image,255,255,255);
    // 为区域填充颜色
    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); // 第i个数字的x坐标
        $y = rand(5,10); // 第i个数字的y坐标
    
        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);
    }
    header('Content-type: image/png'); // 提前输出图片header信息
    imagepng($image);   // 浏览器输出图片
    imagedestory($image);   // 销毁资源
    

    输出


    image.png
    (2)、追加干扰线
    $image = imagecreatetruecolor(100,300);
    // 为一副图像分配颜色
    $bgcolor = imagecolorallocate($image,255,255,255);
    // 为区域填充颜色
    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); // 第i个数字的x坐标
        $y = rand(5,10); // 第i个数字的y坐标
    
        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),rand(80,220)); // 干扰线颜色
        imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
    }
    header('Content-type: image/png'); // 提前输出图片header信息
    imagepng($image);   // 浏览器输出图片
    imagedestory($image);   // 销毁资源
    

    输出


    image.png

    4、实现字母数字混合验证码

    image.png
    <?php
    /**
     * Created by PhpStorm.
     * User: zhengjiayuan
     * Date: 2018/7/15
     * Time: 22:19
     */
    $image = imagecreatetruecolor(100,300);
    // 为一副图像分配颜色
    $bgcolor = imagecolorallocate($image,255,255,255);
    // 为区域填充颜色
    imagefill($image,0,0,$bgcolor);
    // 加入4个字母数字混合
    for($i=0;$i<4;$i++){
        $fontsize=6; // 数字大小
        $fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120)); // 数字颜色
        $data= 'abcdefghijkmnpqrstuvwxy3456789';
        $fontcontent = substr($data,rand(0,strlen($data)),1);
    
        $x = ($i*100/4) + rand(5,10); // 第i个字符的x坐标
        $y = rand(5,10); // 第i个字符的y坐标
    
        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),rand(80,220)); // 干扰线颜色
        imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
    }
    header('Content-type: image/png'); // 提前输出图片header信息
    imagepng($image);   // 浏览器输出图片
    imagedestory($image);   // 销毁资源
    

    输出


    image.png

    5、通过session存储验证信息

    image.png

    captcha.php

    <?php
    /**
     * Created by PhpStorm.
     * User: zhengjiayuan
     * Date: 2018/7/15
     * Time: 22:19
     */
    
    session_start(); // 使用session
    
    $image = imagecreatetruecolor(100,30);
    // 为一副图像分配颜色
    $bgcolor = imagecolorallocate($image,255,255,255);
    // 为区域填充颜色
    imagefill($image,0,0,$bgcolor);
    
    $captch_code = ''; // 保存验证码信息
    // 加入4个字母数字混合
    for($i=0;$i<4;$i++){
        $fontsize=6; // 数字大小
        $fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120)); // 数字颜色
        $data= 'abcdefhjkmnopqrstuvwxy345678';
        $fontcontent = substr($data,rand(0,strlen($data)),1);
        $captch_code .= $fontcontent;
        $x = ($i*100/4) + rand(5,10); // 第i个字符的x坐标
        $y = rand(5,10); // 第i个字符的y坐标
    
        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),rand(80,220)); // 干扰线颜色
        imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
    }
    $_SESSION['authcode'] = $captch_code; // 保存验证码信息到session  必须放在显示图片前 不然这句代码不执行
    header('Content-type: image/png'); // 提前输出图片header信息
    imagepng($image);   // 浏览器输出图片
    imagedestroy($image);  // 销毁资源
    
    
    
    

    form.php

    <?php
    /**
     * Created by PhpStorm.
     * User: zhengjiayuan
     * Date: 2018/7/15
     * Time: 23:11
     */
        if (isset($_REQUEST['authcode'])){
            session_start();
            if (strtolower($_REQUEST['authcode']) == $_SESSION['authcode']){
                echo '<font color="#0000CC">输入正确</font>';
            }else{
                echo '<font color="#0000CC">输入错误</font>';
            }
            exit();
        }
    ?>
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>确认验证码</title>
        </head>
        <body>
            <form method="post" action="./form.php">
                <p>验证码图片:<img src="./captcha.php?r=<?php echo rand()?>" border="1" width="100"></p>
    
                <p>请输入图片中的内容: <input type="text" name="authcode" value="" /></p>
                <p><input type="submit" value="提交" style="padding: 6px 20px;"/></p>
            </form>
        </body>
    
    </html>
    
    image.png
    image.png

    6、用JS实现动态校验验证码

    image.png
    <?php
    /**
     * Created by PhpStorm.
     * User: zhengjiayuan
     * Date: 2018/7/15
     * Time: 23:11
     */
        if (isset($_REQUEST['authcode'])){
            session_start();
            if (strtolower($_REQUEST['authcode']) == $_SESSION['authcode']){
                echo '<font color="#0000CC">输入正确</font>';
            }else{
                echo '<font color="#0000CC">输入错误</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" src="./captcha.php?r=<?php echo rand()?>" border="1" width="100">
                    <!-- 实现动态校验验证码 -->
                    <a href="javasript: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>
    

    相关文章

      网友评论

        本文标题:php验证码

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