什么是验证码
网站登录、注册页面常常需要用户输入验证码,以确认用户是人类而非机器人。验证码是一种图形验证码,要在图形画面中写入一段特定的文字或数字,用户输入正确后才能继续操作。
如果没有验证码,恶意机器人将可以自动注册大量的虚假用户并进行恶意攻击,影响了网站的正常运营。验证码不仅可以防止机器人恶意行为,也可以防止网络钓鱼、车站刷票、网站撞库等一系列安全问题。
将验证码生成图像可以避免机器自动识别文字或者数字。
验证码是如何工作的
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 生成验证码图片。同时,在本文中,我们也了解了验证验证码的方法。需要注意的是,要避免使用开放的字符字体集,否则可会完全失去验证的效果。