PHP验证码怎么结合表单验证

来源:个人站长作者:北京GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《PHP验证码怎么结合表单验证》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《PHP验证码怎么结合表单验证》有用,将其分享出去将是对创作者最好的鼓励。

在PHP开发中,将验证码和表单验证联动是防止恶意提交、暴力破解的常用方案,核心思路是生成验证码后把内容存入session,表单提交时对比用户输入和session中存储的验证码值,一致则通过校验。

PHP验证码怎么结合表单验证

一、验证码生成实现

首先我们需要生成随机的验证码字符串,并将内容保存到session中,同时输出验证码图片给前端展示。以下是生成验证码的PHP代码:

<?php
// 开启session
session_start();

// 生成4位随机验证码,包含数字和字母
$code = '';
$charList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charLength = strlen($charList);
for ($i = 0; $i < 4; $i++) {
    $code .= $charList[rand(0, $charLength - 1)];
}
// 将验证码存入session
$_SESSION['captcha_code'] = $code;

// 创建验证码图片
$width = 120;
$height = 40;
$image = imagecreatetruecolor($width, $height);
// 设置背景色为浅灰色
$bgColor = imagecolorallocate($image, 240, 240, 240);
imagefill($image, 0, 0, $bgColor);
// 设置文字颜色为黑色
$textColor = imagecolorallocate($image, 0, 0, 0);
// 写入验证码文字
imagestring($image, 5, 30, 10, $code, $textColor);
// 输出图片并销毁资源
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>

二、前端表单页面实现

前端需要展示表单、验证码图片,同时提供刷新验证码的功能,以下是完整的HTML表单代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>PHP验证码表单验证</title>
</head>
<body>
    <h3>用户登录</h3>
    <form method="post" action="check.php">
        <p>
            用户名:<input type="text" name="username" required>
        </p>
        <p>
            密码:<input type="password" name="password" required>
        </p>
        <p>
            验证码:<input type="text" name="captcha" required>
            <img src="captcha.php" onclick="this.src='captcha.php?'+Math.random()" alt="验证码">
            <em>点击图片刷新验证码</em>
        </p>
        <p>
            <input type="submit" value="提交">
        </p>
    </form>
</body>
</html>

这里验证码图片的src指向我们之前写的验证码生成脚本captcha.php,点击图片时通过拼接随机参数刷新验证码,避免浏览器缓存导致验证码不更新。

三、表单提交后的验证逻辑

表单提交到check.php后,我们需要先校验验证码,再处理其他表单数据,以下是验证逻辑的代码:

<?php
session_start();

// 判断是否是POST提交
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo '非法请求';
    exit;
}

// 获取表单提交的验证码
$inputCaptcha = trim($_POST['captcha'] ?? '');
// 获取session中存储的验证码,转小写统一对比
$sessionCaptcha = strtolower($_SESSION['captcha_code'] ?? '');
$inputCaptchaLower = strtolower($inputCaptcha);

// 验证码校验
if (empty($inputCaptcha)) {
    echo '请输入验证码';
    exit;
}
if (empty($sessionCaptcha)) {
    echo '验证码已过期,请刷新重试';
    exit;
}
if ($inputCaptchaLower !== $sessionCaptcha) {
    echo '验证码错误';
    exit;
}

// 验证码校验通过后,清除session中的验证码,防止重复使用
unset($_SESSION['captcha_code']);

// 后续处理其他表单数据,比如验证用户名密码
$username = trim($_POST['username'] ?? '');
$password = trim($_POST['password'] ?? '');
// 这里可以添加用户名密码的校验逻辑,比如查询数据库
echo '表单验证通过,用户名:' . htmlspecialchars($username);
?>

四、注意事项

  • 一定要在使用session之前调用session_start()函数,否则无法读取和存储session数据。
  • 验证码校验通过后要立即清除session中的验证码,避免同一个验证码被重复使用,导致安全问题。
  • 对比验证码时建议统一转成小写或者大写,避免用户输入大小写不一致导致验证失败。
  • 生产环境中可以给验证码图片添加干扰线、噪点,提升验证码的识别难度,增强安全性。

五、常见问题排查

问题现象可能原因解决方法
验证码一直提示错误session没有正确开启,或者验证码生成和校验的session键名不一致检查两个文件的session_start()调用,确保存储和读取的键名都是captcha_code
验证码图片不显示验证码脚本有输出内容,或者header之前有空白输出确保captcha.phpheader调用之前没有任何输出,包括空格和换行
点击验证码图片不刷新浏览器缓存了验证码图片给图片src拼接随机参数,比如Math.random()生成的时间戳

PHP验证码表单验证session修改时间:2026-06-25 00:36:21

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。