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

验证码(Captcha)是指用于区分机器和人类用户的一种技术,通常用于防止自动化的攻击和垃圾信息。在 PHP 中,生成验证码一般使用 GD 库,可以生成数字、字母、数学公式等多种类型的验证码。

下面是一个简单的 PHP 代码示例,用于生成数字和字母混合的验证码:

```php

session_start();

$length = 6; // 验证码长度

$width = 100; // 图片宽度

$height = 40; // 图片高度

// 创建画布

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

// 定义白色背景和黑色文字颜色

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

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

// 填充背景色

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

// 生成随机字符串

$charset = 'abcdefghkmnpqrstuvwxyz23456789'; // 随机字符串集合(去掉易混淆的字符)

$captcha = ''; // 验证码

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

$captcha .= $charset[mt_rand(0, strlen($charset)-1)];

}

// 把验证码保存到 session

$_SESSION['captcha'] = $captcha;

// 把验证码绘制到画布上

$font = 5; // 字体大小

$x = 10; // 横坐标

$y = $height/2 + $font/2; // 纵坐标

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

$angle = mt_rand(-10, 10); // 字符旋转角度

imagettftext($image, $font, $angle, $x, $y, $textColor, 'fonts/arial.ttf', $captcha[$i]);

$x += $font + mt_rand(0, 5);

}

// 添加噪点

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

$color = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));

imagesetpixel($image, mt_rand(0, $width-1), mt_rand(0, $height-1), $color);

}

// 添加干扰线

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

$color = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));

imageline($image, mt_rand(0, $width-1), mt_rand(0, $height-1), mt_rand(0, $width-1), mt_rand(0, $height-1), $color);

}

// 输出图片并销毁图像资源

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

imagepng($image);

imagedestroy($image);

这段代码使用 imagecreatetruecolor 函数创建了一个大小为 $width x $height 的画布,并使用 imagefill 函数填充白色背景色。然后,它使用 imagettftext 函数把随机生成的验证码绘制到画布上,并添加了一些干扰线和噪点。最后,它输出了图片并销毁图像资源。

需要注意的是,上面的代码使用了 PHP 的 Session 机制来保存验证码,因此需要在执行这段代码之前确保会话已经启动或者手动启动会话。同时,为了把中文字符也显示到画布上,需要保证 GD 库已经安装了 FreeType 支持。

在实际应用中,为了增强验证码的安全性和可读性,还可以使用更复杂的字体、调整字体大小、添加更多的干扰元素等技术。

生成验证码是 Web 开发中常用的技术之一,它可以很好地防止机器人或非法用户进行恶意操作。在 PHP 中生成验证码也是非常简单的事情,下面我们来一步步介绍如何生成验证码。

步骤一:创建画布和字体

在 PHP 中生成验证码,首先需要创建一个画布,然后在画布上绘制出验证码文本,并设置字体和字体大小。

```php

// 创建画布

$image = imagecreatetruecolor(100, 30);

// 设置字体和字体大小

$font = './arial.ttf';

$fontSize = 20;

`imagecreatetruecolor()` 函数用于创建一个真彩色图像,默认情况下是黑色背景。还可以使用 `imagefill()` 函数来填充其它颜色的背景。

`$font` 变量用于指定字体文件的位置,这里使用的是 Arial 字体。如果没有安装 Arial 字体,也可以使用系统自带的字体(如宋体、黑体等)。

`$fontSize` 变量用于指定字体大小,这里设置为 20。

步骤二:生成随机字母和数字

在画布上绘制验证码文本之前,需要先生成随机的字母和数字,这里我们使用 `mt_rand()` 函数来生成。

```php

// 随机生成验证码文本

$letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

$numbers = '0123456789';

$code = '';

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

$char = '';

$type = mt_rand(0, 1);

if ($type == 0) {

$char = $letters[mt_rand(0, strlen($letters) - 1)];

} else {

$char = $numbers[mt_rand(0, strlen($numbers) - 1)];

}

$code .= $char;

}

`$letters` 和 `$numbers` 变量用于指定可用的字母和数字。这里选择了英文字母和数字,可以根据实际需求进行调整。

使用循环来生成 4 位的验证码,每次循环中先使用 `mt_rand()` 函数随机选择字母或数字,然后再根据随机选择的类型生成对应的字符,并将其添加在验证码文本中。

步骤三:绘制验证码文本

有了随机生成的验证码文本,现在就可以在画布上绘制出来。可以使用 `imagettftext()` 函数或 `imagestring()` 函数来绘制文本。

```php

// 绘制验证码文本

$textColor = imagecolorallocate($image, 255, 255, 255); // 文本颜色为白色

imagettftext($image, $fontSize, 0, 10, 22, $textColor, $font, $code);

`imagecolorallocate()` 函数用于创建文本颜色,这里设置为白色。

`imagettftext()` 函数用于绘制 TrueType 字体的文本,参数分别为:画布对象、字体大小、旋转角度、左上角 x 坐标、左上角 y 坐标、文本颜色、字体文件、验证码文本。

步骤四:输出图像并释放资源

最后一步就是将生成的验证码输出到浏览器,并释放资源。

```php

// 输出图像并释放资源

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

imagepng($image);

imagedestroy($image);

`header()` 函数用来设置 HTTP response header,这里设置输出类型为 PNG 图片类型。

`imagepng()` 函数用于将创建的图像输出到浏览器。

`imagedestroy()` 函数用于释放掉创建的图像资源。

完整的代码如下:

```php

// 创建画布

$image = imagecreatetruecolor(100, 30);

// 设置字体和字体大小

$font = './arial.ttf';

$fontSize = 20;

// 随机生成验证码文本

$letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

$numbers = '0123456789';

$code = '';

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

$char = '';

$type = mt_rand(0, 1);

if ($type == 0) {

$char = $letters[mt_rand(0, strlen($letters) - 1)];

} else {

$char = $numbers[mt_rand(0, strlen($numbers) - 1)];

}

$code .= $char;

}

// 绘制验证码文本

$textColor = imagecolorallocate($image, 255, 255, 255); // 文本颜色为白色

imagettftext($image, $fontSize, 0, 10, 22, $textColor, $font, $code);

// 输出图像并释放资源

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

imagepng($image);

imagedestroy($image);

使用以上代码,即可在浏览器中生成随机的 4 位验证码。