让我详细讲解一下“一个经典的PHP验证码类分享”的完整攻略。
简介
在网站开发过程中,为了防止恶意的机器人或爬虫攻击,我们常常需要使用验证码来进行验证。本文将分享一个基于PHP的验证码类的实现方式,这个验证码类可以生成包含数字和字母的图片,有效地进行验证。
代码实现
步骤一:基础设置
在生成验证码图像之前,我们需要先基于PHP代码进行一些设置,例如生成一个随机字符串并使用某个字体。
<?php
class Captcha{
//定义图像的宽度、高度和生成的验证码长度
private $width = 150;
private $height = 40;
private $length = 4;
//定义字体的路径
private $font = './Roboto/Roboto-Bold.ttf';
public function generate() {
//生成随机字符串
$randStr = substr(sha1(mt_rand()), 17, $this->length);
//保存随机字符串,便于后续验证
$_SESSION['captcha'] = $randStr;
//创建图像并设定背景色
$image = imagecreatetruecolor($this->width, $this->height);
$bgColor = imagecolorallocate($image, 235, 236, 237);
imagefill($image, 0, 0, $bgColor);
}
}
?>
步骤二:绘制字符和干扰线
有了基础设置之后,我们就可以进行字符的绘制和干扰线的绘制了。在字符的绘制中,我们需要指定字体文件及字符颜色,然后随机生成每个字符的位置进行绘制。在干扰线的绘制中,我们可以先生成一些随机的线条位置和颜色,然后使用imageline函数进行绘制。
<?php
class Captcha{
//...
public function generate() {
//...
//定义字符的颜色和绘制位置
$textColor = imagecolorallocate($image, 0, 0, 0);
$startX = ($this->width - 20 * $this->length) / 2;
$startY = ($this->height - 30) / 2;
//生成字符并进行绘制
for($i = 0; $i < $this->length; $i++) {
$char = substr($randStr, $i, 1);
$x = $startX + $i * 20 + mt_rand(-5, 5);
$y = $startY + mt_rand(-5, 5);
imagettftext($image, 20, mt_rand(-20, 20), $x, $y, $textColor, $this->font, $char);
}
//定义干扰线的颜色和长度,进行绘制
for($i = 0; $i < 5; $i++) {
$lineColor = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
$startX = mt_rand(0, $this->width);
$startY = mt_rand(0, $this->height);
$endX = mt_rand(0, $this->width);
$endY = mt_rand(0, $this->height);
imageline($image, $startX, $startY, $endX, $endY, $lineColor);
}
//输出图像并销毁
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
}
}
?>
步骤三:进行验证
生成验证码图片并输出之后,我们需要进行验证码的验证,保证用户输入的验证码和生成的验证码字符串一致。我们可以在表单中增加一个验证码输入框,用户提交表单时,将用户输入的验证码和之前保存在SESSION中的值进行比对。
<?php
session_start();
if(isset($_SESSION['captcha']) && !empty($_SESSION['captcha'])) {
if($_SESSION['captcha'] == $_POST['captcha']) {
// 验证通过
} else {
// 验证失败
}
} else {
// 未生成验证码
}
?>
示例说明:
示例一
在用户登录页面中添加验证码,使用上述验证码类进行验证码生成,并验证用户输入的验证码是否正确。如果验证码错误,需要给用户相应的提示信息。
<?php
session_start();
$captcha = new Captcha();
$captcha->generate();
?>
<form method="post" action="login.php">
<label for="username">用户名:</label>
<input type="text" name="username" id="username"><br>
<label for="password">密码:</label>
<input type="password" name="password" id="password"><br>
<label for="captcha">验证码:</label>
<input type="text" name="captcha" id="captcha"><br>
<img src="captcha.php" alt="验证码"><br>
<input type="submit" value="登录">
</form>
<?php
if(isset($_POST['username']) && isset($_POST['password']) && isset($_POST['captcha'])) {
if($_POST['captcha'] == $_SESSION['captcha']) {
// 验证通过,进行登录验证
} else {
echo "验证码错误,请重新输入";
}
}
?>
示例二
在注册页面中添加验证码,同样使用上述验证码类进行验证码生成,并保存用户的注册信息。如果用户输入的验证码错误,需要给出相应提示信息,不允许注册。如果用户输入的验证码正确,将用户信息保存到数据库中,并给出相应的成功提示信息。
<?php
session_start();
$captcha = new Captcha();
$captcha->generate();
?>
<form method="post" action="register.php">
<label for="username">用户名:</label>
<input type="text" name="username" id="username"><br>
<label for="password">密码:</label>
<input type="password" name="password" id="password"><br>
<label for="repeatpassword">再次输入密码:</label>
<input type="password" name="repeatpassword" id="repeatpassword"><br>
<label for="email">电子邮箱:</label>
<input type="text" name="email" id="email"><br>
<label for="captcha">验证码:</label>
<input type="text" name="captcha" id="captcha"><br>
<img src="captcha.php" alt="验证码"><br>
<input type="submit" value="注册">
</form>
<?php
if(isset($_POST['username']) && isset($_POST['password']) && isset($_POST['repeatpassword']) && isset($_POST['email']) && isset($_POST['captcha'])) {
if($_POST['captcha'] == $_SESSION['captcha']) {
// 验证通过,将用户信息保存到数据库中
} else {
echo "验证码错误,请重新输入";
}
}
?>
这就是一个基于PHP的验证码类的实现方式,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一个经典的PHP验证码类分享 - Python技术站