当开发一些需要用户输入敏感信息的网站时,很有必要在用户提交表单前进行验证码验证,以防止恶意用户通过程序提交大量无效数据。在 PHP 中,我们可以使用一些库或者自己编写代码来生成并验证验证码。
下面我会讲解一些生成验证码的常用方法,以及提供一些生成验证码的示例代码。
生成图形验证码
步骤1:定义一个字符集
我们要生成随机的字符验证码,需要定义一个字符集,可以是数字和大小写字母等。
$charSet = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
步骤2:随机生成验证码
我们可以通过调用 mt_rand()
函数随机生成字符验证码,这里的示例代码会生成一个6位的验证码。
$length = 6;
$randStr = '';
for ($i = 0; $i < $length; $i++) {
$randStr .= $charSet[mt_rand(0, strlen($charSet) - 1)];
}
步骤3:将验证码存储在 session 中,并生成验证码图片
我们需要将生成的验证码存储在 session 中,并生成验证码图片,以便用户在网页上输入验证码。这里我们可以借助 imagecreate()
、imagecolorallocate()
、imagettftext()
等函数生成一个带有验证码的验证码图片。
// 开启 session
session_start();
// 存储验证码
$_SESSION['captcha_code'] = $randStr;
// 创建画布
$width = 100;
$height = 50;
$image = imagecreate($width, $height);
// 随机生成背景颜色
$bgcolor = imagecolorallocate($image, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
// 随机生成验证码颜色
$color = imagecolorallocate($image, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200));
// 生成验证码图案
$fontPath = 'arial.ttf';
for ($i = 0; $i < $length; $i++) {
$fontSize = mt_rand(20, 25);
$angle = mt_rand(-30, 30);
imagettftext($image, $fontSize, $angle, ($i + 1) * ($width / $length), $height / 2 + $fontSize / 2, $color, $fontPath, $randStr[$i]);
}
// 输出图像
header('Content-type:image/png');
imagepng($image);
示例1:单页面验证码
在一个 HTML 页面中添加一个验证码表单:
<form method="post" action="submit.php">
<input type="text" name="captcha_code" placeholder="请输入验证码">
<img src="captcha.php" alt="验证码">
<input type="submit" value="提交">
</form>
当用户提交表单时,我们需要验证用户输入的验证码是否正确。这里我们可以通过比较用户输入的验证码和存储在 session 中的验证码来进行验证。
session_start();
// 获取用户输入的验证码
$captcha = $_POST['captcha_code'];
// 获取存储在 session 中的验证码
$captchaCode = $_SESSION['captcha_code'];
// 判断用户输入的验证码是否正确
if ($captcha === $captchaCode) {
// 验证码输入正确,处理表单
} else {
// 验证码输入错误,给出提示
}
示例2:注册页面验证码
在一个注册页面中,我们需要对用户输入的用户名、密码和验证码进行验证,如果验证通过,才能提交表单进行注册。
<form method="post" action="register.php">
<label>用户名:<input type="text" name="username"></label><br>
<label>密码:<input type="password" name="password"></label><br>
<label>验证码:<input type="text" name="captcha_code"></label>
<img src="captcha.php" alt="验证码">
<input type="submit" value="注册">
</form>
当用户提交表单时,我们需要对用户输入的验证码进行验证。如果验证通过,我们可以将用户名和密码存储到数据库中,完成用户注册。
session_start();
// 获取用户输入的用户名、密码和验证码
$username = $_POST['username'];
$password = $_POST['password'];
$captcha = $_POST['captcha_code'];
// 获取存储在 session 中的验证码
$captchaCode = $_SESSION['captcha_code'];
// 判断用户输入的验证码是否正确
if ($captcha === $captchaCode) {
// 验证码输入正确,将用户名和密码存储到数据库中
} else {
// 验证码输入错误,给出提示
}
生成短信验证码
除了图形验证码,我们还可以生成短信验证码,通过短信将验证码发送给用户。
步骤1:生成随机数字
与生成图形验证码的方法类似,我们可以随机生成一个指定长度的数字。
$length = 6;
$randStr = '';
for ($i = 0; $i < $length; $i++) {
$randStr .= mt_rand(0, 9);
}
步骤2:将验证码存储在 session 中,并发送短信
我们需要将生成的验证码存储在 session 中,并通过一些短信发送平台发送短信给用户。这里我们可以利用第三方短信发送服务,比如阿里大鱼、云片等。
session_start();
// 存储验证码
$_SESSION['sms_captcha_code'] = $randStr;
// 发送短信
$apiKey = 'YOUR_API_KEY';
$apiSecret = 'YOUR_API_SECRET';
$phone = '13800138000';
$templateCode = 'SMS_1234567890'; // 你的短信模板 ID
$sms = new SmsClient($apiKey, $apiSecret);
$result = $sms->send($phone, $templateCode, ['code' => $randStr]);
if ($result->code === 0) {
// 短信发送成功
} else {
// 短信发送失败
}
示例1:找回密码页面
在一个找回密码页面中,我们需要让用户输入手机号和验证码,如果验证码输入正确,才能进行下一步密码重置操作。
<form method="post" action="reset_password.php">
<label>手机号:<input type="text" name="phone"></label><br>
<label>验证码:<input type="text" name="sms_captcha_code"></label>
<input type="submit" value="下一步">
</form>
当用户提交表单时,我们需要对用户输入的验证码进行验证。如果验证通过,我们可以进入下一步密码重置操作。
session_start();
// 获取用户输入的手机号和验证码
$phone = $_POST['phone'];
$smsCaptcha = $_POST['sms_captcha_code'];
// 获取存储在 session 中的验证码
$smsCaptchaCode = $_SESSION['sms_captcha_code'];
// 判断用户输入的验证码是否正确
if ($smsCaptcha === $smsCaptchaCode) {
// 验证码输入正确,进入下一步操作
} else {
// 验证码输入错误,给出提示
}
示例2:注册页面
在一个注册页面中,我们需要让用户输入手机号和验证码进行注册。
<form method="post" action="register.php">
<label>手机号:<input type="text" name="phone"></label><br>
<label>验证码:<input type="text" name="sms_captcha_code"></label>
<input type="submit" value="注册">
</form>
当用户提交表单时,我们需要对用户输入的验证码进行验证。如果验证通过,我们可以将手机号和密码存储到数据库中,完成用户注册。
session_start();
// 获取用户输入的手机号和验证码
$phone = $_POST['phone'];
$smsCaptcha = $_POST['sms_captcha_code'];
// 获取存储在 session 中的验证码
$smsCaptchaCode = $_SESSION['sms_captcha_code'];
// 判断用户输入的验证码是否正确
if ($smsCaptcha === $smsCaptchaCode) {
// 验证码输入正确,将手机号和密码存储到数据库中
} else {
// 验证码输入错误,给出提示
}
以上就是生成验证码的一些常用方法和示例代码,可以满足大多数网站的需求。需要注意的是,验证码的安全性并不是绝对的,一些高级黑客仍然可以通过一些方式绕过验证码进行恶意操作。但是对于大部分普通用户来说,验证码可以有效地防止恶意攻击。
本文链接:https://my.lmcjl.com/post/14926.html
4 评论