如何使用PHP生成验证码图片

什么是验证码

网站登录、注册页面常常需要用户输入验证码,以确认用户是人类而非机器人。验证码是一种图形验证码,要在图形画面中写入一段特定的文字或数字,用户输入正确后才能继续操作。

如果没有验证码,恶意机器人将可以自动注册大量的虚假用户并进行恶意攻击,影响了网站的正常运营。验证码不仅可以防止机器人恶意行为,也可以防止网络钓鱼、车站刷票、网站撞库等一系列安全问题。

将验证码生成图像可以避免机器自动识别文字或者数字。

验证码是如何工作的

WEB服务器首先接收到客户端发来的请求,然后返回一个HTML页面。当页面中包含有验证码时,在WEB服务器端会为该验证码生成一张图片,并保存其对应的字符串至Session中。当客户端输入验证码后,该字符串将会返回到服务器端进行验证。

因此,有了图形验证码,减少了机器无限制的重复攻击可能,也增加了用户的安全性和隐私性。

如何使用PHP生成验证码图片

使用PHP可以很轻松地生成验证码图片。下面来看一下具体的做法:

前端页面

在HTML的页面中要加入一个img图片标签,并指向一个URL:

<img src="verifycode.php">

这个URL值指向一个 PHP 文件,该文件负责生成验证码图片并返回。现在来看一下verifycode.php文件的主要实现方式。

PHP后端生成验证码图片

首先要定义一个内部颜色,用于生成随机颜色。

$im = imagecreatetruecolor(100, 30);

$bg = imagecolorallocate($im, 255, 255, 255);

imagefill($im, 0, 0, $bg);

$code = '';

$codeLength = 6;

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

$code .= mt_rand(0, 9);

}

imagestring($im, 5, 10, 8, $code, imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)));

上述代码中,使用函数imagecreatetruecolor()创建一个真彩色图像,通过imagecolorallocate()函数为 $bg 分配一组 RGB 颜色,接下来,使用 imagefill()函数填充颜色,将 $bg 填充到一张100x30像素的画布上。

接下来需要生成随机验证码,使用 mt_rand()函数生成随机码。

在获取到随机码后,将它输出到图像上,使用函数imagestring()输出。图像的宽度高度、字体字号、文字内容以及文字颜色都需要指定。

输出内容是 $code ,生成的验证码字符串。

接下来,将 $code 存放在用户会话中起来,后续需要用到此 $code。

$_SESSION['verifyCode'] = $code;

最后,将编码后的图片从图片流中输出出去:

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

imagepng($im);

imagedestroy($im);

完整代码如下:

<?php

session_start();

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

$im = imagecreatetruecolor(100, 30);

$bg = imagecolorallocate($im, 255, 255, 255);

imagefill($im, 0, 0, $bg);

$code = '';

$codeLength = 6;

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

$code .= mt_rand(0, 9);

}

imagestring($im, 5, 10, 8, $code, imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)));

$_SESSION['verifyCode'] = $code;

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

imagepng($im);

imagedestroy($im);

当服务器返回此图片后,在用户提交表单时,验证码的值会被提交到服务器进行校验。

如何检查验证码

在用户提交表单时,验证码的值会被提交到服务器进行校验。如果验证码输入正确,那么该用户就能顺利地操作下一步,否则他将不能执行接下来的操作或需要提醒用户重新输入验证码。

具体实现方法比较简单,只需要获取用户输入的验证码,与Session中存储的验证码进行比对即可:

<?php

session_start();

$verifyCode = isset($_SESSION['verifyCode']) ? $_SESSION['verifyCode'] : '';

$userVerifyCode = isset($_POST['verifyCode']) ? trim($_POST['verifyCode']) : '';

if (empty($verifyCode) || empty($userVerifyCode) || strtolower($verifyCode) !== strtolower($userVerifyCode)) {

echo '验证码输入错误,请重新输入。';

}

代码中,$_POST['verifyCode']代表表单输入的验证码。如果验证码输入错误,就会给出相应的提示信息。

总结

本篇文章主要讲述了什么是验证码、验证码是如何工作的以及如何使用 PHP 生成验证码图片。同时,在本文中,我们也了解了验证验证码的方法。需要注意的是,要避免使用开放的字符字体集,否则可会完全失去验证的效果。

后端开发标签