验证码--数字和字母混合

本文详细介绍了一种基于PHP的验证码生成与校验方法。包括使用GD库生成带有随机字符和干扰元素的验证码图片,利用session存储验证码内容,并通过Ajax进行数据比较。此外,还提供了一个简单的用户界面用于验证用户的输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,是实现验证码的流程图:

那么需要的知识点有哪些呢?

按步骤来看

--生成图片,生成干扰元素,合成一张验证码图涉及到GD库

--生成随机内容,mt_rand()函数的使用

--数据存储在服务器端需要用到session会话

--最后的数据比较,需要用到Ajax

第一步:生成验证码,存储数据:

<?php  
    session_start();
    
    //创建一个100*30的图像
    $image = imagecreatetruecolor(100, 30);
    //给图像添加一个白色的背景
    $bgcolor = imagecolorallocate($image, 255, 255, 255);
    //给图像填充颜色
    imagefill($image, 0, 0, $bgcolor);
    $capcha = "";
    //在图像上产生随机数字
    for ($i=0; $i < 4; $i++) { 
        $fontsize=7;
        //字体随机颜色
        $fontcolor = imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120));
        //$fontcontent = substr(md5(rand()),1,1);//这样的数字字母混合方式容易出现0 o这样易混淆的字符
        $data = "abcdefghijkmnpqrstuvwxy3456789";
        $fontcontent = substr($data,rand(0,strlen($data)-1),1);
        $capcha.=$fontcontent;
        $x = ($i*100/4)+rand(5,10);
        $y = rand(5,10);
        imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);

    }
    $_SESSION['authcode'] = $capcha;
    //在图像上添加 点 干扰元素
    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");
    //以png格式输出图像
    imagepng($image);
    //输出后别忘了销毁
    imagedestroy($image);
?>

 

 

 第二步:通过表格校验数据

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>验证码校验</title>
</head>
<body>
<?php  
    if (isset($_POST['authcode'])) {
        session_start();
        if (($_POST['authcode'])==$_SESSION['authcode']) {
            header("refresh:2;url='./form.php'");
            echo '<font color="#0f0">输入正确!</font>';
        }else{
            echo '<font color="#f00">输入错误!</font';
        }
        exit();
    }
    
?>

    <form action="./form.php" method="post">
        <p>验证码图片:<img src="./capcha.php?r=<?php echo rand();?>" border="1" alt="" width="100" height="30">
            <a href="javascript:void(0)" onclick="document.getElementsByTagName('img')[0].src='./capcha.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>

 其中考虑到当验证码看不清时,点击换一个即可更换图片。

转载于:https://www.cnblogs.com/junyatou/p/6828617.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值