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