当前位置:首页 > PHP

php如何实现验证码

2026-02-28 04:39:21PHP

生成验证码图片

使用PHP的GD库创建图像资源,设置背景色和文字颜色。通过imagecreatetruecolor()函数创建画布,imagefill()填充背景,imagettftext()添加随机字符。

$width = 120;
$height = 40;
$image = imagecreatetruecolor($width, $height);
$bgColor = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bgColor);

添加干扰元素

绘制干扰线和噪点增加识别难度。使用imageline()随机生成线条,imagesetpixel()添加单个像素点。

for ($i = 0; $i < 5; $i++) {
    $lineColor = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
    imageline($image, rand(0, $width), rand(0, $height), rand(0, $width), rand(0, $height), $lineColor);
}

生成随机字符串

创建包含大小写字母和数字的字符池,通过rand()函数随机选取字符组合成验证码。

php如何实现验证码

$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789';
$code = '';
for ($i = 0; $i < 4; $i++) {
    $code .= $chars[rand(0, strlen($chars) - 1)];
}

输出图像并存储验证码

将验证码存入Session供后续验证,使用imagepng()输出图像后销毁资源。

session_start();
$_SESSION['captcha'] = $code;
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

前端调用验证码

在HTML表单中通过img标签动态加载验证码生成脚本,点击图片可刷新验证码。

php如何实现验证码

<img src="captcha.php" onclick="this.src='captcha.php?t='+Math.random()">
<input type="text" name="captcha" required>

验证用户输入

提交表单时比对Session存储的验证码与用户输入,注意处理大小写敏感问题。

session_start();
if ($_POST['captcha'] !== $_SESSION['captcha']) {
    die('验证码错误');
}
unset($_SESSION['captcha']);

增强安全性措施

建议实施的额外安全措施:

  • 设置验证码有效期(如5分钟过期)
  • 限制验证码尝试次数
  • 使用更复杂的扭曲变形字体
  • 考虑加入数学公式验证等动态验证方式

对于高安全需求场景,可考虑使用第三方验证码服务如reCAPTCHA。

分享给朋友:

相关文章

验证码实现vue

验证码实现vue

验证码实现(Vue) 在Vue中实现验证码功能通常需要结合前端生成和验证逻辑,以及可能的后端校验。以下是两种常见实现方式: 基于Canvas的图形验证码 通过Canvas动态生成包含随机字符的图…

如何实现vue表格联动

如何实现vue表格联动

实现 Vue 表格联动的方法 数据绑定与响应式更新 通过 Vue 的响应式特性,将多个表格的数据绑定到同一个数据源或计算属性。当一个表格的数据发生变化时,另一个表格会自动更新。例如: data()…

vue如何实现

vue如何实现

Vue 实现方法 Vue 提供了多种方式来实现功能,具体取决于需求。以下是一些常见场景的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。在组件中可以通过 pr…

vue如何实现计算

vue如何实现计算

Vue 计算属性的实现方法 在 Vue 中,计算属性(computed properties)是一种基于响应式依赖进行缓存的属性,适用于处理复杂逻辑或依赖其他数据属性的场景。以下是实现计算属性的几种方…

vue如何实现单选

vue如何实现单选

使用原生 HTML 单选按钮 在 Vue 中可以直接使用 HTML 的原生单选按钮,通过 v-model 绑定数据。 <template> <div>…

java如何实现多线程

java如何实现多线程

实现多线程的方法 在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。此外,还可以使用ExecutorService等高级工具类来管理线程。 继承Thread类 通…