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

PHP内置函数实现验证码生成及验证

发布时间:2023-06-16 11:23:31

验证码在Web开发中非常常见,用于防止机器人和恶意攻击。本文介绍了使用PHP内置函数生成和验证验证码的方法。

验证码生成

PHP内置函数可以生成多种类型的验证码,如数字、字母、混合等。

数字验证码

数字验证码只包含数字,比较简单,适合初学者实践。

以下代码可以生成一个4位的数字验证码,并将其显示在一个图片中。

<?php
session_start();
$code = rand(1000,9999);
$_SESSION['code'] = $code;
header('Content-Type: image/jpeg');
$image = imagecreate(100, 30);
$background_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 0, 0, 0);
imagestring($image, 5, 40, 10, $code, $text_color);
imagejpeg($image);
imagedestroy($image);
?>

代码中用rand()函数生成4位的随机数,并将其存在$_SESSION['code']中,用header()函数设置输出为图片格式,用imagecreate()函数创建一个100x30的图片,用imagecolorallocate()函数设置图片背景和文字颜色,最后用imagestring()函数将验证码文字写在图片上,用imagejpeg()函数输出图片。

字母验证码

字母验证码只包含大小写字母,比数字验证码稍微复杂一些。

以下代码可以生成一个4位的字母验证码,并将其显示在一个图片中。

<?php
session_start();
$code = substr(md5(time()), 0, 4);//获取时间戳的MD5值的前4位
$letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$text = '';
for($i = 0; $i < 4; $i++){
    $text .= $letters[rand(0,51)];
}
$_SESSION['code'] = $text;
header('Content-Type: image/jpeg');
$image = imagecreate(100, 30);
$background_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 0, 0, 0);
imagestring($image, 5, 40, 10, $text, $text_color);
imagejpeg($image);
imagedestroy($image);
?>

代码中,用substr()函数获取时间戳的MD5值的前4位(即一个随机字母串),用for循环生成4位的随机字母串,将其存入$_SESSION['code']中,其余代码与数字验证码生成相同。

混合验证码

混合验证码包含数字和字母,比较复杂。

以下代码可以生成一个4位的混合验证码,并将其显示在一个图片中。

<?php
session_start();
$code = substr(md5(time()), 0, 4);
$text = '';
$possible = '23456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ';
$i = 0;
while ($i < 4) {
    $char = substr($possible, mt_rand(0, strlen($possible)-1), 1);
    $text .= $char;
    $i++;
}
$_SESSION['code'] = $text;
$im = imagecreatetruecolor(90, 40);
$bg = imagecolorallocate($im, 255, 255, 255);
$fg = imagecolorallocate($im, 0, 0, 0);
imagefill($im, 0, 0, $bg);
imagestring($im, 5, 20, 10, $text, $fg);
imagejpeg($im, 'image.jpg', 90);
imagedestroy($im);
header('Content-Type: image/jpeg');
readfile('image.jpg');
unlink('image.jpg');
?>

代码中,用while循环随机获取混合字符数组$possible中的字符,生成一个4位的随机混合验证码,其余代码与字母验证码生成相同。

验证码验证

生成验证码过程完成后,需要将用户输入的验证码与生成的验证码比对,验证其是否正确。比较验证码有多种方法,其中最为常见的是使用PHP内置函数session_start()。

session_start()函数可用于开启一个会话,在会话中可以存储生成的验证码及用户输入的验证码,并进行比对。

以下代码是一个检验验证码的示例。

<?php
session_start();
if(strtolower($_POST['code']) == strtolower($_SESSION['code'])){ //strtolower()函数将输入和生成的验证码都转化成小写,比较大小写混淆
    echo '验证码正确!';
} else {
    echo '验证码错误!';
}
?>

需要注意的是,由于使用了session_start()函数,此段代码必须放在页面最顶端,否则会报错。

小结

验证码的生成和验证是Web开发的常见技术,PHP内置函数可以方便地生成和比较验证码。生成验证码的过程中,需要注意控制输出的格式和内容,以便前端页面可以正确显示和验证。检验验证码的过程中,需要将生成的验证码存储在会话中,并与用户输入的验证码进行比对,检验是否正确。这是一种简单可行的方法,可用于Web开发中的各种场景。