如何使用PHP函数生成验证码和图形验证码进行安全验证
随着互联网的迅速发展,为了保证网站的安全性,验证码逐渐成为了必不可少的一环。验证码英文全称为"Completely Automated Public Turing test to tell Computers and Humans Apart",即“全自动区分计算机和人类的图灵测试”。主要用于区分用户是人还是机器,防止机器人恶意攻击,保证网站的安全性。
本文将介绍如何利用PHP函数来实现验证码和图形验证码的生成。
一、生成验证码
验证码一般采用随机数或随机字符串进行生成,然后将其加以混淆,生成一张图片,并且在图片中渲染出一个随机数或字符串。
代码示例:
<?php
session_start();
$vcode = rand(1000, 9999);
$_SESSION['vcode'] = $vcode;
$width = 120;
$height = 40;
$img = imagecreatetruecolor($width, $height);
$bg_color = imagecolorallocate($img, 255, 255, 255);
$text_color = imagecolorallocate($img, 0, 0, 0);
imagefill($img, 0, 0, $bg_color);
imagettftext($img, 24, 0, 10, 30, $text_color, './arial.ttf', $vcode);
header("content-type:image/png");
imagepng($img);
imagedestroy($img);
?>
代码解释:
- 第1行:启用session。
- 第3行:生成4位随机数。
- 第4行:将随机数存储到session中。
- 第6-7行:设置验证码图片的宽度和高度。
- 第8行:创建一个真彩色图像资源对象。
- 第9-10行:设置图片的背景颜色和文字颜色。
- 第12行:填充图片的背景颜色。
- 第14行:将随机数绘制到图片上。
- 第16行:设置响应头的content-type属性,告诉浏览器返回的是一张png格式的图片。
- 第17行:将图片输出到浏览器。
- 第18行:销毁$img对象,释放资源。
二、生成图形验证码
图形验证码是在验证码的基础上加上了干扰线、干扰点、字体旋转等复杂度更高的要素,使得机器人更难以模拟,从而提高验证码的难度。
代码示例:
<?php
session_start();
$width = 120;
$height = 40;
//生成验证码字符串
$vcode = "";
for ($i = 0; $i < 4; $i++) {
$vcode .= chr(rand(97, 122));
}
$_SESSION['vcode'] = $vcode;
//创建图像资源
$img = imagecreatetruecolor($width, $height);
//填充背景颜色,这里使用的是浅色背景
$bg_color = imagecolorallocate($img, 220, 220, 220);
imagefill($img, 0, 0, $bg_color);
//随机生成干扰点
for ($i = 0; $i < 100; $i++) {
$point_color = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255));
imagesetpixel($img, rand(0, $width), rand(0, $height), $point_color);
}
//随机生成干扰线
for ($i = 0; $i < 2; $i++) {
$line_color = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255));
imageline($img, rand(0, $width / 2), rand(0, $height), rand($width / 2, $width), rand(0, $height), $line_color);
}
//字体旋转角度
$angle = rand(-10, 10);
//随机生成颜色,用于验证码绘制字符
$text_color = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255));
imagettftext($img, 24, $angle, 10, 30, $text_color, './arial.ttf', $vcode);
//设置响应头,输出图形
header("Content-type: image/png");
imagepng($img);
//释放资源
imagedestroy($img);
?>
代码解释:
- 第1行:启用session。
- 第6-9行:生成长度为4的随机字符串。
- 第11-12行:设定验证码图片的宽度和高度。
- 第15行:创建图像资源。
- 第17行:填充背景颜色。
- 第20-24行:添加100个随机位置的干扰点。
- 第27-32行:添加2条随机位置、随机颜色的干扰线。
- 第35行:生成旋转角度。
- 第38-39行:生成随机颜色。
- 第41行:在设置好的角度、位置和颜色的情况下,将验证码字符串绘制到验证码图片上。
- 第44行:设置响应头中的Content-type属性,告诉浏览器返回的是一张png格式的图片。
- 第45行:将图片输出到浏览器。
- 第48行:删除$img对象,释放资源。
三、应用场景
验证码和图形验证码的应用场景非常广泛,如登录、注册、找回密码、评论区防刷,抽奖等等。在应用时,需要尽量提高验证码的难度,避免机器人或恶意攻击者攻破验证码系统,从而保证网站的安全性。同时由于验证码和图形验证码需要对图片输出,也要考虑到防刷新和图片验证码生成的性能优化等问题。
