当前位置:首页 > PHP

php实现动态验证码

2026-02-13 21:43:42PHP

使用 PHP 生成动态验证码

PHP 可以通过 GD 库或 Imagick 扩展生成动态验证码图片,通常包括随机字符、干扰线和噪点以提高安全性。

核心步骤

安装或启用 GD 库(通常 PHP 默认已安装),在 php.ini 中取消注释 extension=gd

创建验证码生成脚本 captcha.php:

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

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

$font = 'path/to/font.ttf'; // 使用真实字体文件路径
for ($i = 0; $i < $length; $i++) {
    $color = imagecolorallocate($image, rand(0, 150), rand(0, 150), rand(0, 150));
    imagettftext($image, rand(18, 22), rand(-30, 30), 20 + $i * 25, 30, $color, $font, $code[$i]);
}

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

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

前端调用验证码

在 HTML 表单中显示验证码图片并设置自动刷新:

<img src="captcha.php" id="captcha" onclick="refreshCaptcha()">
<input type="text" name="captcha_code" required>
<script>
function refreshCaptcha() {
    document.getElementById('captcha').src = 'captcha.php?' + Math.random();
}
</script>

服务器端验证

表单提交后验证用户输入:

session_start();
if ($_POST['captcha_code'] !== $_SESSION['captcha']) {
    die('验证码错误');
}
// 验证通过后清除session中的验证码
unset($_SESSION['captcha']);

安全增强措施

使用更复杂的字符组合,避免使用易混淆字符(如 0 和 O)。

增加验证码失效时间:

php实现动态验证码

$_SESSION['captcha_time'] = time();
// 验证时检查
if (time() - $_SESSION['captcha_time'] > 300) {
    die('验证码已过期');
}

考虑添加更多干扰元素,如扭曲变形、背景噪点等。对于更高安全性需求,可以使用 Composer 安装专业验证码库如 "gregwar/captcha"。

标签: 验证码动态
分享给朋友:

相关文章

vue 实现动态路由

vue 实现动态路由

动态路由的实现方法 Vue中实现动态路由通常涉及以下关键步骤,结合Vue Router的API和异步加载逻辑完成。 基础配置 安装Vue Router并初始化路由实例。在router/index.j…

vue实现动态换肤

vue实现动态换肤

Vue 动态换肤实现方法 动态换肤是前端开发中常见的需求,Vue 可以通过多种方式实现这一功能。以下是几种常见的实现方法: CSS 变量结合 Vuex 或 Pinia 定义全局 CSS 变量,通过…

vue实现动态卡片

vue实现动态卡片

实现动态卡片的基本思路 在Vue中实现动态卡片通常涉及数据绑定、循环渲染和交互逻辑。动态卡片的内容、样式或数量可以根据数据变化而更新。 数据驱动的卡片列表 使用v-for指令循环渲染卡片,数据存储在…

vue实现组件动态复制

vue实现组件动态复制

Vue 实现组件动态复制的方法 使用 v-for 动态渲染组件 通过 v-for 指令可以基于数组数据动态生成多个相同结构的组件。只需在模板中使用 v-for 遍历数据数组,并为每个元素创建组件实例。…

vue实现动态导航栏

vue实现动态导航栏

Vue 实现动态导航栏的方法 基于路由配置动态生成 在 Vue 项目中,可以利用路由配置动态生成导航栏。Vue Router 的路由信息可以通过 this.$router.options.routes…

vue实现动态标签分类

vue实现动态标签分类

动态标签分类的实现方法 在Vue中实现动态标签分类功能,可以通过以下方式完成。假设需求是根据用户输入或数据变化动态生成和管理标签。 数据驱动渲染 使用v-for指令结合响应式数据实现动态标签渲染。在…