php中怎么实现验证码
时间 : 2023-04-08 04:26:02声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

在 PHP 中实现验证码(Captcha)可以通过使用 GD 图像库生成随机的数字或者字母图形。以下是一份简单的 PHP 代码来生成验证码。

```php

// 开始会话

session_start();

// 定义图形大小和字体大小

$width = 100;

$height = 40;

$fontSize = 20;

// 创建图像并填充白色背景

$image = imagecreatetruecolor($width, $height);

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

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

// 随机生成验证码

$code = generateCode();

$_SESSION['code'] = $code;

// 将验证码绘制到图像上

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

$textX = rand(5, 20);

$textY = rand(5, 20);

imagestring($image, $fontSize, $textX, $textY, $code, $textColor);

// 添加噪点和弧线

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

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

imagesetpixel($image, rand(0, $width), rand(0, $height), $noiseColor);

imagearc($image, rand(-50, $width), rand(-50, $height), rand(0, $width), rand(0, $height), 0, 360, $noiseColor);

}

// 设置响应的 MIME 类型并输出图像到浏览器

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

imagepng($image);

// 销毁图像资源

imagedestroy($image);

/**

* 生成随机的验证码

*/

function generateCode($length = 6) {

$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

$code = "";

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

$code .= substr($chars, rand(0, strlen($chars) - 1), 1);

}

return $code;

}

上述代码首先启动一个会话来存储验证码,并定义图形大小和字体大小。然后使用 GD 图像库创建一个白色背景的图形,并使用 `generateCode()` 函数随机生成一个验证码。接着将验证码绘制在图像上,添加一些噪点和弧线,最后将图像输出到浏览器中。

在验证表单中发送到后端时,将用户的输入验证码与存储在会话中的验证码进行比较,如果验证成功,则表单提交成功,否则重新加载生成的验证码和表单。

验证码(CAPTCHA)是一种用于验证用户是否为人类的技术。它通过生成随机文本、图像或数字等,要求用户进行识别并输入,从而确认用户是否为人类,而不是自动化机器人。

在PHP中,我们可以使用GD库和session技术来实现验证码功能。具体实现过程如下:

1. 生成随机文本或数字

可以通过rand()函数生成随机数字,也可以通过rand_str()函数生成随机字母。

function rand_str($len = 6, $format = 'ALL') {

$is_abc = $is_numer = 0;

$password = $tmp = '';

switch($format) {

case 'ALL':

$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

break;

case 'CHAR':

$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

break;

case 'NUMBER':

$chars='0123456789';

break;

default :

$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

break;

}

mt_srand((double)microtime()*1000000*getmypid());

while(strlen($password) < $len) {

$tmp =substr($chars,(mt_rand()%strlen($chars)),1);

if(($is_numer <> 1 && is_numeric($tmp) && $format != 'CHAR') || ($is_abc <> 1 && preg_match('/[a-zA-Z]/',$tmp) && $format != 'NUMBER')) {

$password .= $tmp;

$is_numer = is_numeric($tmp);

$is_abc = preg_match('/[a-zA-Z]/',$tmp);

}

}

return $password;

}

2. 创建验证码图像

使用GD库创建一个带有随机文本或数字的图像。

// 定义图像宽度、高度和字体大小

$img_width = 80;

$img_height = 30;

$font_size = 16;

// 创建图像资源

$image = imagecreate($img_width, $img_height);

// 定义图像背景颜色和字体颜色

$bg_color = imagecolorallocate($image, 255, 255, 255);

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

// 填充背景颜色

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

// 将随机生成的文本或数字写入图像

$text = rand_str(4, 'ALL');

$_SESSION['captcha'] = $text; // 将验证码存入session

imagettftext($image, $font_size, 0, 5, 20, $text_color, 'font.ttf', $text);

// 输出图像

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

imagepng($image);

// 销毁图像资源

imagedestroy($image);

3. 验证用户输入的验证码

将用户输入的验证码和之前存入session中的验证码进行比较,如果相同,则验证通过,否则验证失败。

session_start();

if (!empty($_POST['captcha']) && $_POST['captcha'] == $_SESSION['captcha']) {

echo '验证通过';

} else {

echo '验证失败';

}

在实际使用中,我们可以将以上三个步骤封装成一个函数,方便调用和使用。

综上所述,以上就是PHP中实现验证码的主要步骤。验证码技术虽然无法完美避免机器人攻击,但至少可以有效减缓机器人攻击的程度,保护网站的安全性。