欢迎访问宙启技术站
智能推送

PHP验证码函数实现:如何用GD库创建验证码并进行表单验证

发布时间:2023-06-16 18:58:08

验证码是一种防止机器人恶意攻击和登录的重要保护措施。在PHP中,可以使用GD库创建验证码,并通过表单验证验证用户输入是否正确。下面将介绍如何用GD库创建验证码并进行表单验证。

1.创建验证码的过程

创建验证码的过程主要包括以下几步:

1.1 创建画布

使用imagecreatetruecolor函数创建一个指定大小的画布,一般为150x50。

1.2 设置画布背景色

使用imagecolorallocate函数设置画布的背景色,一般为灰色。

1.3 生成验证码字符串

可以使用rand函数生成随机的数字或字母的字符串作为验证码。

1.4 将验证码字符串写入画布

使用imagettftext函数将生成的验证码字符串写入画布中,可以设置字体、字号、角度等参数。

1.5 添加干扰线

使用imageline函数添加干扰线,可以设置线条的粗细、颜色等参数。

1.6 添加干扰点

使用imagesetpixel函数添加干扰点,可以设置点的大小、颜色等参数。

1.7 添加干扰圆

使用imageellipse函数添加干扰圆,可以设置圆的大小、颜色等参数。

1.8 输出验证码图片

使用header函数设置Content-type,并使用imagepng函数将生成的验证码图片输出。

2.表单验证的过程

表单验证的过程主要包括以下几步:

2.1 提交表单

用户在浏览器中输入验证码并提交表单。

2.2 获取用户输入

使用$_POST或$_GET函数获取用户提交的验证码值。

2.3 验证用户输入

将用户输入的验证码值与生成的验证码字符串进行比较,判断是否一致。

2.4 返回验证结果

根据比较结果返回相应的验证结果,如果一致则验证通过,否则验证失败。

下面是一个完整的PHP验证码函数的实现代码:

function generateCaptcha() {

    //1.创建画布

    $image = imagecreatetruecolor(150, 50);

    //2.设置画布背景色

    $bgColor = imagecolorallocate($image, 200, 200, 200);

    imagefill($image, 0, 0, $bgColor);

    //3.生成验证码字符串

    $captchaLength = 4;

    $captchaString = '';

    $charPool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

    for ($i = 0; $i < $captchaLength; $i++) {

        $captchaString .= $charPool[rand(0, strlen($charPool) - 1)];

    }

    //4.将验证码字符串写入画布

    $fontFile = 'arial.ttf';

    $fontSize = 24;

    $angle = 0;

    $x = 20;

    $y = 35;

    $textColor = imagecolorallocate($image, 0, 0, 0);

    imagettftext($image, $fontSize, $angle, $x, $y, $textColor, $fontFile, $captchaString);

    //5.添加干扰线

    $lineNumber = 5;

    for ($i = 0; $i < $lineNumber; $i++) {

        $x1 = rand(0, 150);

        $y1 = rand(0, 50);

        $x2 = rand(0, 150);

        $y2 = rand(0, 50);

        $lineColor = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));

        imageline($image, $x1, $y1, $x2, $y2, $lineColor);

    }

    //6.添加干扰点

    $pixelNumber = 100;

    for ($i = 0; $i < $pixelNumber; $i++) {

        $x = rand(0, 150);

        $y = rand(0, 50);

        $pixelColor = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));

        imagesetpixel($image, $x, $y, $pixelColor);

    }

    //7.添加干扰圆

    $circleNumber = 3;

    for ($i = 0; $i < $circleNumber; $i++) {

        $x = rand(0, 150);

        $y = rand(0, 50);

        $radius = rand(5, 10);

        $circleColor = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));

        imageellipse($image, $x, $y, $radius * 2, $radius * 2, $circleColor);

    }

    //8.输出验证码图片

    //8.1 设置Content-type

    header('Content-type: image/png');

    //8.2 输出验证码图片

    imagepng($image);

    //9.销毁画布资源

    imagedestroy($image);

    //10.返回验证码字符串

    return $captchaString;

}

最后,可以将生成验证码的函数封装在一个PHP文件中,然后在需要验证码的地方包含这个PHP文件,调用函数即可生成一个验证码。同时,在表单验证的地方也可以调用这个函数,获取生成的验证码字符串并与用户输入的验证码比较,实现表单验证的功能。