PHP实战开发26-使用PHP生成图片验证码并进行校验

news2024/9/20 0:50:30

文章目录

  • 一、前言
  • 二、什么是验证码?
  • 三、PHP生成验证码图像
    • 3.1 生成验证码文字
    • 3.2 创建图像并绘制验证码文字
    • 3.3 将验证码存储到Session中
  • 四、前端使用jQuery验证输入
    • 4.1 步骤一:创建HTML结构和CSS样式
    • 4.2 使用jQuery发送AJAX请求进行校验
    • 4.3 步骤三:服务器端校验验证码
  • 五、总结


一、前言

本文已收录于PHP全栈系列专栏:PHP快速入门与实战

在现代互联网应用中,为了防止恶意操作和机器人攻击,常常会使用图片验证码来验证用户的身份。本文将介绍如何使用PHP语言生成图片验证码,并结合前端的jQuery框架实现验证码的输入校验。

二、什么是验证码?

验证码(CAPTCHA)是一种区分计算机程序和人类用户的图灵测试,常用于防止恶意操作和网络爬虫。一般来说,验证码通常由一个随机字符组成的图片和一个输入框组成。用户需要正确地将图片中的字符输入到输入框中,才能通过验证。

在这里插入图片描述

三、PHP生成验证码图像

3.1 生成验证码文字

首先,我们需要生成一个随机的包含数字和字母的字符串作为验证码文字。可以使用以下代码实现:

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

3.2 创建图像并绘制验证码文字

接下来,我们使用PHP的GD库创建一个空白的图像,并在图像上绘制验证码文字。可以使用以下代码实现:

$code = generateCode(6); // 生成长度为6的验证码文字

$width = 120; // 图像宽度
$height = 40; // 图像高度

$image = imagecreate($width, $height); // 创建一个空白的图像

$background_color = imagecolorallocate($image, 255, 255, 255); // 设置背景色为白色
$text_color = imagecolorallocate($image, 0, 0, 0); // 设置文字颜色为黑色

// 在图像上绘制验证码文字
imagettftext($image, 20, 0, 10, 30, $text_color, 'path/to/font.ttf', $code);

header('Content-Type: image/png'); // 设置响应头为PNG图片类型
imagepng($image); // 输出图像
imagedestroy($image); // 销毁图像资源

3.3 将验证码存储到Session中

为了校验用户输入的验证码,我们需要将生成的验证码存储到服务器的Session中。可以使用以下代码实现:

session_start(); // 启动Session

$_SESSION['captcha'] = $code; // 存储验证码

至此,我们已经成功地生成了一张带有验证码文字的图片,并将验证码存储到了Session中。

四、前端使用jQuery验证输入

在前端页面中,我们需要使用jQuery来验证用户输入的验证码是否正确。

4.1 步骤一:创建HTML结构和CSS样式

首先,我们需要在HTML页面中创建验证码图片和输入框的HTML结构,并为其添加相应的CSS样式。可以使用以下代码实现:

<!DOCTYPE html>
<html>
<head>
    <title>验证码验证示例</title>
    <style>
        .captcha-img {
            display: inline-block;
            margin-bottom: 10px;
        }
        .captcha-input {
            width: 200px;
            height: 30px;
        }
        .captcha-message {
            color: red;
        }
    </style>
</head>
<body>
    <div class="captcha-container">
        <img src="generate_captcha.php" alt="验证码" class="captcha-img" />
        <input type="text" name="captcha" class="captcha-input" />
        <span class="captcha-message"></span>
    </div>
    <button type="button" id="verify-btn">验证</button>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="verify_captcha.js"></script>
</body>
</html>

4.2 使用jQuery发送AJAX请求进行校验

我们需要使用jQuery来监听点击验证按钮的事件,并通过AJAX请求将用户输入的验证码发送到服务器进行校验。可以使用以下代码实现:

$(document).ready(function() {
    $('#verify-btn').click(function() {
        var captchaValue = $('input[name=captcha]').val();
        $.ajax({
            url: 'verify_captcha.php',
            method: 'POST',
            data: { captcha: captchaValue },
            success: function(response) {
                if (response === 'success') {
                    $('.captcha-message').text('');
                    alert('验证码正确!');
                } else {
                    $('.captcha-message').text('验证码错误,请重新输入!');
                }
            }
        });
    });
});

4.3 步骤三:服务器端校验验证码

最后,我们需要在服务器端接收并校验用户输入的验证码。可以使用以下代码实现:

session_start(); // 启动Session

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $captchaValue = $_POST['captcha'];

    if (isset($_SESSION['captcha']) && strtoupper($captchaValue) === strtoupper($_SESSION['captcha'])) {
        echo 'success';
    } else {
        echo 'error';
    }
}

至此,我们已经成功地完成了生成图片验证码并进行校验的功能。

五、总结

本文介绍了如何使用PHP语言生成图片验证码,并结合jQuery实现验证码的输入校验。通过以上步骤,我们可以轻松地在自己的网站中添加验证码功能,提高用户身份验证的安全性。希望本文对您有所帮助!

本文已收录于PHP全栈系列专栏:PHP快速入门与实战 很多精彩内容收录其中,欢迎大家关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/736873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Head Pose Estimation头部姿态估计任务的基本了解:从数据集开始

目录 前言一、HPE是什么&#xff1f;二、常用数据集1.COFW2.WFLW3.AFLW2000-3D4.300W-LP 三、SOTA workCVPR2022:SynergyNetCVPR2021 Workshop:ASMNet 四、我们想做的贡献 前言 为了检测司机的疲劳状态&#xff0c;除了基于人脸关键点的检测去判断是否闭眼&#xff0c;是否打哈…

基础算法-差分

差分其实就是求前缀和的逆运算 差分数组&#xff1a; Step1 首先给定一个原数组a&#xff1a;a[1], a[2], a[3],,,,,, a[n]; 然后我们构造一个数组b &#xff1a; b[1] ,b[2] , b[3],,,,,, b[i]; 使得 a[i] b[1] b[2 ] b[3] ,,,,,, b[i] 也就是说&#xff0c;a数组是b…

nvm升级node版本

1.首先有安装nvm和配置环境的前提 2、命令查看&#xff0c;切换到D盘目录下 3、安装到指定的版本 nvm安装指定版本的node 输入&#xff1a;nvm install 16.18.1 4、查看已有的node版本 nvm list 5、项目终端查看

【uniapp开发小程序】实现点击跳转手机通话 拨打电话功能

效果图&#xff1a; 代码展示&#xff1a; <template><view class"page-map"><view class"btn" click"telFun()" style"text-align: center;">电话咨询</view></view> </template> <script&g…

如何使用idea来查找所有未使用的代码?

一、目的 通过idea快速找到项目中没有被使用的代码 二、操作步骤 2.1 Code -> Analyze Code -> Run Inspection by Name 2.2 输入Unused declaration -> 查询没有被使用的方法和类 2.3 选择要扫描的范围 2.4 根据结果进行删除&#xff08;反复几次就可以清除干净&a…

如何获取局域网内海康摄像头的IP地址

文章目录 问题解决方法图像分类网络AlexNetVGGNetGooLeNet系列ResNetDenseNetSwin TransformerMAECoAtNetConvNeXtV1、V2MobileNet系列MPViTVITSWAEfficientNet系列MOBILEVITEdgeViTsMixConvRepLKNetTransFGConvMAEMicroNetRepVGGMaxViTMAFormerGhostNet系列DEiT系列MetaFormer…

linux 写c, 编译报错 stdio.h: No such file or directory,compilation terminated.

环境: windows11->subsystem(Ubuntu20)问题: linux 写c, 编译报错如图(fatal error: stdio.h: No such file or directory │compilation terminated. #include <stdio.h>) 复现: #include <stdio.h>int main() {printf("gcc编译报错: \n")return 0;…

产研融合共育人才 金山云“星云训练营”顺利开营

盛夏之日&#xff0c;万物并秀&#xff01;在莘莘学子告别校园、踏入社会的毕业季&#xff0c;金山云第一期星云训练营于7月9日在武汉隆重开营。金山云星云训练营承载着“技术立业”的企业基因&#xff0c;旨在助力学子提升专业技能&#xff0c;掌握前沿技术&#xff0c;为国家…

(02)Cartographer源码无死角解析-(78) ROS数据发布→子图内、子图间、约束与残差发布

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文…

requestAnimationFrame(请求动画帧)

前言 在Web应用中&#xff0c;实现动画效果的方法比较多&#xff0c;Javascript 中可以通过定时器 setTimeout 来实现&#xff0c;css3 可以使用 transition 和 animation 来实现&#xff0c;html5 中的 canvas 也可以实现。除此之外&#xff0c;html5 还提供一个专门用于请求…

VS2019使用入门

VS2019使用入门 1.Visual Studio任务栏图标显示变白2.从其他项目拷贝文件到当前项目参考文献 配置VS2019 实现简单的c人脸检测项目&#xff0c;可参考本人blog wndows平台VS2019OpenCVcmake简单应用。 1.Visual Studio任务栏图标显示变白 参考[1]&#xff0c;在命令提示符下输…

Wireshark简单使用教程

混合模式 混合模式就是在抓包的时候不轮是有线网络还是WIFI网络等都会将流量给打印出来 1.打开Wireshark抓包软件 2.点击捕获选择选项按钮 3.选中《在接口上使用混杂模式》 &#xff08;默认是开启的&#xff09; 过滤器 过滤器可以只筛选你要的数据包&#xff0c;下图箭…

JAVA主要日志输出工具

日志工具 SLF4J-JCL LOG4J-CORE LOGBACK SLF4J-SIMPLE JCL-OVER-SLF4J LOGBACK-CORE LOG4J LOG4J-API LOG4J-JUL LOG4J-JCL LOGBACK-ACCESS LOGBACK-CLASSIC SLF4-API SLF4J-LOGJ12 LOGBACK-CLASSIC LOG4J-SLF4J-IMPL JAVA日志体系概述 大家目前正在使用的日志输出工具 日志体…

剑指offer刷题笔记--Num41-50

1--数据流中的中位数&#xff08;41&#xff09; 主要思路&#xff1a; 维护两个优先队列&#xff0c;Q1大数优先&#xff0c;存储比中位数小的数&#xff1b;Q2小数优先&#xff0c;存储比中位数大的数&#xff1b; 当存储的数为偶数时&#xff0c;Q1.size() Q2.size(), 中位…

文献阅读笔记 # SimCSE: Simple Contrastive Learning of Sentence Embeddings

《SimCSE: Simple Contrastive Learning of Sentence Embeddings》EMNLP 2021 (CCF-B) Tianyu Gao†∗ Xingcheng Yao‡∗ Danqi Chen†作者来自普林斯顿计算机系和清华大学交叉信息研究院Code & Pre-trained Models 【研究对象】&#xff1a;Sentence Embedding&#xff…

ubuntu RPM should not be used directly install RPM packages, use Alien instead!

ubuntu RPM should not be used directly install RPM packages, use Alien instead! 所以我们最好下载deb版本的安装包 安装 参考文章

科技资讯|三星智能戒指资料曝光,智能穿戴发展新机遇

根据 Reddit 社区网友反馈&#xff0c;在 Beta 版三星 Health 应用中&#xff0c;发现了全新的“Ring Support”选项&#xff0c;暗示三星未来将会推出智能戒指产品。 三星内部正在开发健康追踪设备 Galaxy Ring&#xff0c;这款智能戒指配备 PPG&#xff08;光电容积脉搏波&…

【视觉SLAM入门】3. 相机模型,内外参,畸变推导

"瑾瑜匿瑕" 1. 相机模型和内参1.1 内参推导1.2 外参推导 2. 畸变2.1 径向畸变2.2 切向畸变 3. 深度信息3.1 算法测距3.2 物理测距 本节讨论围绕这个问题展开 机器人如何观测外部世界&#xff1f; \quad\large\textcolor{red}{机器人如何观测外部世界&#xff1f;} 机…

音频转文字怎么操作?这几个好用的音频转文字方法分享给你

想象一下&#xff0c;你在公交车上听到了一个超搞笑的笑话&#xff0c;想要记下来和朋友分享&#xff0c;但是又怕自己记漏或者记错了关键的部分。这时候&#xff0c;音频转文字的软件就能帮上大忙了&#xff01;你只需将录音导入到软件中&#xff0c;它就会像一位超级厉害的听…

4. Springboot快速回顾(@Mapper和@MapperScan)

springboot最重要的注解之一&#xff0c;因为有了Mapper注解&#xff0c;省去了在xml文件繁琐的配置 本文将对比介绍有无注解的区别&#xff0c;加深认识 目录 1 初次使用Mapper1.1 创建实体类Stu1.2 创建dao层接口1.3 创建service层接口和实现1.5 创建StuMapper.xml文件1.4 创…