当前位置:首页 > PHP

php如何实现验证码

2026-04-03 13:39:26PHP

使用GD库生成验证码

PHP的GD库可以用于生成图像验证码。以下是一个基本实现示例:

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

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$length = 6;
$code = '';
for ($i = 0; $i < $length; $i++) {
    $code .= $chars[rand(0, strlen($chars) - 1)];
}
$_SESSION['captcha'] = $code;

$font = 5;
$x = 10;
$y = 15;
for ($i = 0; $i < $length; $i++) {
    $textColor = imagecolorallocate($image, rand(0, 150), rand(0, 150), rand(0, 150));
    imagestring($image, $font, $x, $y, $code[$i], $textColor);
    $x += 20;
}

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>

添加干扰元素增强安全性

为提高验证码安全性,可以添加干扰线和噪点:

php如何实现验证码

// 添加干扰线
for ($i = 0; $i < 5; $i++) {
    $lineColor = imagecolorallocate($image, rand(100, 255), rand(100, 255), rand(100, 255));
    imageline($image, rand(0, $width), rand(0, $height), rand(0, $width), rand(0, $height), $lineColor);
}

// 添加噪点
for ($i = 0; $i < 100; $i++) {
    $pixelColor = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
    imagesetpixel($image, rand(0, $width), rand(0, $height), $pixelColor);
}

使用TrueType字体提升视觉效果

使用TTF字体可以生成更美观的验证码:

php如何实现验证码

$fontFile = 'path/to/font.ttf';
for ($i = 0; $i < $length; $i++) {
    $angle = rand(-30, 30);
    $textColor = imagecolorallocate($image, rand(0, 150), rand(0, 150), rand(0, 150));
    imagettftext($image, 20, $angle, $x, $y, $textColor, $fontFile, $code[$i]);
    $x += 25;
}

验证用户输入

在表单处理页面验证用户输入的验证码:

session_start();
if (strtolower($_POST['captcha']) == strtolower($_SESSION['captcha'])) {
    echo "验证码正确";
} else {
    echo "验证码错误";
}
unset($_SESSION['captcha']);

使用第三方库简化开发

可以考虑使用现成的验证码库如Gregwar/Captcha:

require_once 'vendor/autoload.php';
use Gregwar\Captcha\CaptchaBuilder;

$builder = new CaptchaBuilder;
$builder->build();
$_SESSION['phrase'] = $builder->getPhrase();
header('Content-type: image/jpeg');
$builder->output();

安全注意事项

验证码应区分大小写或统一转换为小写比较 每次验证后应立即销毁session中的验证码值 限制验证码尝试次数防止暴力破解 考虑添加过期时间限制验证码有效性

分享给朋友:

相关文章

vue中如何实现循环

vue中如何实现循环

循环渲染列表数据 在Vue中,使用v-for指令实现循环渲染。基本语法为v-for="(item, index) in items",其中items是数据源数组,item是当前遍历的元素,index是…

uniapp图形验证码

uniapp图形验证码

uniapp 图形验证码实现方法 在 uniapp 中实现图形验证码功能可以通过多种方式完成,以下是几种常见的实现方案: 使用第三方验证码服务 接入第三方验证码服务如极验、腾讯云验证码等,这些服务通…

vue如何实现拖动

vue如何实现拖动

Vue 实现拖动的常用方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现拖动功能。 <template>…

h5页面如何实现

h5页面如何实现

实现H5页面的方法 H5页面是基于HTML5技术的网页,通常用于移动端和响应式设计。以下是实现H5页面的关键步骤和技术要点。 基础结构 使用HTML5的DOCTYPE声明作为页面的起始。HTML5简…

vue如何实现截图

vue如何实现截图

Vue 实现截图的方法 在 Vue 中实现截图功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 html2canvas 库 html2canvas 是一个流行的 JavaScript 库,…

vue如何实现绑定

vue如何实现绑定

数据绑定基础 Vue 通过 v-bind 指令实现动态绑定 HTML 属性或组件 prop。基本语法为 v-bind:属性名="表达式",简写为 :属性名="表达式"。例如绑定 class 或 sty…