让我来为您详细讲解一个简单安全的PHP验证码类,同时附上调用方法。
什么是验证码
验证码通常是一种用于验证用户身份的安全技术。主要应用在网络应用程序中,用于防止恶意的自动机器人的恶意攻击,以及保护网站用户的隐私。
简单安全的PHP验证码类
下面是一个简单安全的PHP验证码类的代码示例:
<?php
namespace App\Code;
class Captcha
{
protected $width;
protected $height;
protected $code_num;
protected $code;
protected $img;
public function __construct($width = 100, $height = 30, $code_num = 4)
{
$this->width = $width;
$this->height = $height;
$this->code_num = $code_num;
$this->code = $this->generateCode();
}
public function generateCode()
{
$char_pool = "ABCDEFGHJKLMNOPQRSTUVWXYZ23456789";
$code = '';
for ($i = 0; $i < $this->code_num; $i++) {
$code .= $char_pool[mt_rand(0, strlen($char_pool) - 1)];
}
return $code;
}
public function generateCaptcha()
{
$this->img = imagecreate($this->width, $this->height);
$bg_color = imagecolorallocate($this->img, 240, 240, 240);
$text_color = imagecolorallocate($this->img, 0, 0, 0);
for ($i = 0; $i < 15; $i++) {
$x1 = mt_rand(0, $this->width);
$y1 = mt_rand(0, $this->height);
$x2 = mt_rand(0, $this->width);
$y2 = mt_rand(0, $this->height);
imageline($this->img, $x1, $y1, $x2, $y2, imagecolorallocate($this->img, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200)));
}
$font = __DIR__ . '/../../fonts/Lato-Regular.ttf';
$font_size = $this->height / 1.5;
$text_box = imagettfbbox($font_size, 0, $font, $this->code);
$x = ($this->width - ($text_box[2] - $text_box[0])) / 2;
$y = ($this->height - ($text_box[1] - $text_box[7])) / 2;
imagettftext($this->img, $font_size, 0, $x, $y, $text_color, $font, $this->code);
}
public function getCode()
{
return $this->code;
}
public function display()
{
header("Content-Type:image/png");
imagepng($this->img);
}
public function saveImage($path)
{
imagepng($this->img, $path);
}
public function __destruct()
{
imagedestroy($this->img);
}
}
这个类包含 __construct()
构造函数,用于设置验证码的宽度,高度和验证码长度。generateCode()
生成一个随机的验证码字符串。 generateCaptcha()
创建一个图像,并在该图像中生成验证码。getCode()
返回当前验证码字符串。display()
和 saveImage()
用于输出或保存验证码图像。__destruct()
销毁验证码图像。
在该类中,使用 imagecreate()
创建一个图像对象,并通过 $bg_color
和 $text_color
变量设置颜色。使用 imageline()
创建干扰线,使用 imagettfbbox()
和 imagettftext()
将验证码文本添加到图像中。
调用方法
要使用这个验证码类,您需要在项目中加载这个类。下面是一个简单的示例:
// 引入验证码类库
require_once('vendor/autoload.php');
use App\Code\Captcha;
// 初始化验证码
$captcha = new Captcha();
// 生成验证码
$captcha->generateCaptcha();
// 获取验证码字符串
$code = $captcha->getCode();
// 输出验证码图像
$captcha->display();
在这个例子中,我们首先使用 require_once()
函数引入验证码类库。然后,我们使用 Captcha()
构造函数初始化验证码对象。接下来,使用 generateCaptcha()
生成验证码图像,并通过 getCode()
获取验证码字符串。最后,我们可以使用 display()
输出验证码图像,也可以使用 saveImage()
保存验证码图像到文件系统中。
示例说明
以下是使用上述验证码类的两个示例:
示例一:基于Web的验证码
假设您正在开发一个Web应用程序,并希望通过在登录页面上添加验证码,为您的用户提供更加安全的登录方式。下面是一个基于Web的示例代码,使用上述验证码类:
// 引入验证码类库
require_once('vendor/autoload.php');
use App\Code\Captcha;
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$captcha = new Captcha();
$captcha->generateCaptcha();
$_SESSION['captcha_code'] = $captcha->getCode();
$captcha->display();
exit;
}
if (isset($_POST['login']) && isset($_POST['captcha'])) {
if ($_POST['captcha'] !== $_SESSION['captcha_code']) {
echo '验证码不正确!';
exit;
}
// 验证通过,进行用户登录
}
在这个例子中,当用户提交登录表单时,我们生成一个新的验证码,并将验证码字符串保存在使用 session_start()
命令开启的会话中。我们检查用户输入的验证码是否与会话中保存的验证码相同。如果验证码正确,则登录操作继续,否则显示错误消息。
示例二:邮件验证码
另一个用例是发送验证码的电子邮件。下面是使用上述验证码类实现邮件验证码的示例代码:
// 引入验证码类库
require_once('vendor/autoload.php');
use App\Code\Captcha;
// 初始化验证码
$captcha = new Captcha();
// 生成验证码
$captcha->generateCaptcha();
// 获取验证码字符串
$code = $captcha->getCode();
// 发送验证码到用户邮箱
$message = '您的验证码是:'. $code;
mail('user@example.com', '验证码', $message);
在这个例子中,我们首先初始化验证码对象,并使用 $captcha->generateCaptcha()
生成一个验证码图像。然后,使用 $captcha->getCode()
获取验证码字符串,并将它包含到信息中发送到用户的邮箱。邮件服务之间的具体实现可能会有所不同,但基本原理是相同的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一个简单安全的PHP验证码类 附调用方法 - Python技术站