PHP内置函数实现验证码生成及验证
验证码在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开发中的各种场景。
