欢迎访问宙启技术站
智能推送

如何使用PHP函数生成验证码和图形验证码进行安全验证

发布时间:2023-06-14 23:23:02

随着互联网的迅速发展,为了保证网站的安全性,验证码逐渐成为了必不可少的一环。验证码英文全称为"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对象,释放资源。

三、应用场景

验证码和图形验证码的应用场景非常广泛,如登录、注册、找回密码、评论区防刷,抽奖等等。在应用时,需要尽量提高验证码的难度,避免机器人或恶意攻击者攻破验证码系统,从而保证网站的安全性。同时由于验证码和图形验证码需要对图片输出,也要考虑到防刷新和图片验证码生成的性能优化等问题。