PHP验证码函数实现:如何用GD库创建验证码并进行表单验证
验证码是一种防止机器人恶意攻击和登录的重要保护措施。在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文件,调用函数即可生成一个验证码。同时,在表单验证的地方也可以调用这个函数,获取生成的验证码字符串并与用户输入的验证码比较,实现表单验证的功能。
