当前位置:首页 > PHP

php验证码如何实现

2026-02-27 15:01:51PHP

使用GD库生成图像验证码

安装GD库确保PHP环境已启用GD库扩展,可通过phpinfo()检查。若未安装,需在php.ini中取消extension=gd的注释并重启服务。

创建画布与背景色
通过imagecreatetruecolor()创建指定宽高的画布,使用imagecolorallocate()设置背景色和文本颜色:

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

生成随机字符串
使用rand()mt_rand()生成4-6位随机字符,通常包含数字和字母:

$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
$code = substr(str_shuffle($chars), 0, 5);
$_SESSION['captcha'] = $code; // 存储到Session

绘制干扰元素
添加干扰线或噪点增强安全性:

for ($i = 0; $i < 5; $i++) {
    $color = 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), $color);
}

输出图像
设置HTTP头并输出PNG格式图像:

header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);

验证用户输入

表单提交后比对Session中的验证码:

session_start();
if ($_POST['captcha'] === $_SESSION['captcha']) {
    echo '验证成功';
} else {
    echo '验证码错误';
}
unset($_SESSION['captcha']); // 销毁Session

使用第三方库(如Gregwar/Captcha)

通过Composer安装简化开发:

composer require gregwar/captcha

生成验证码并嵌入表单:

use Gregwar\Captcha\CaptchaBuilder;
$builder = new CaptchaBuilder;
$builder->build();
$_SESSION['phrase'] = $builder->getPhrase();
echo '<img src="' . $builder->inline() . '" />';

安全性增强措施

  • 限制验证码有效期(如5分钟过期)
  • 禁止同一验证码重复使用
  • 使用扭曲变形字体或动态滤镜(如imagettftext()搭配TTF字体)
  • 前端限制频繁刷新请求

完整示例代码

// captcha.php
session_start();
$image = imagecreatetruecolor(100, 30);
$bg = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bg);
$text = substr(md5(uniqid()), 0, 5);
$_SESSION['captcha'] = $text;
$color = imagecolorallocate($image, 0, 0, 0);
imagestring($image, 5, 30, 8, $text, $color);
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

表单页调用方式:

<img src="captcha.php" />
<input type="text" name="captcha" required>

php验证码如何实现

分享给朋友:

相关文章

Vue如何实现多级域名

Vue如何实现多级域名

Vue 实现多级域名的方法 Vue 本身是一个前端框架,多级域名的实现通常需要结合后端配置和前端路由。以下是几种常见的方法: 使用路由动态匹配 在 Vue Router 中可以通过动态路由参数…

vue如何实现排序

vue如何实现排序

实现数组排序 在Vue中可以通过计算属性或方法对数组进行排序。使用JavaScript的sort()方法结合Vue的响应式特性实现动态排序。 data() { return { ite…

vue如何实现单选

vue如何实现单选

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

java如何实现多态

java如何实现多态

多态的概念 多态是面向对象编程的三大特性之一(封装、继承、多态),指同一操作作用于不同对象时,可以产生不同的行为。Java中主要通过方法重写(Override)和接口/抽象类实现多态。 实现…

java如何实现多线程

java如何实现多线程

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

vue router如何实现

vue router如何实现

Vue Router 的实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue Router 的具体方法: 安装 Vue Router…