您的当前位置:首页>全部文章>文章详情

【PHP】PHP实现验证码的生成与验证

CrazyPanda发表于:2023-12-28 22:45:11浏览:285次TAG:

PHP是一种常用的服务器端脚本语言,不仅功能强大,而且易于学习和编写。在网站开发中,验证码的生成与验证是非常重要的安全措施。在这篇文章中,我们将介绍如何使用PHP实现验证码的生成与验证。

一、什么是验证码?

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写。它是一种常见的在线验证机制,用于确保用户是真正的人而不是机器人。验证码通常由图像或声音组成,要求用户输入正确的答案,以证明其是真实用户。

二、生成验证码

在PHP中,生成验证码图像的过程分为多个步骤。首先,我们需要生成一张随机背景图,并在上面绘制一些干扰线和噪点,以增加验证码的安全性。然后,我们使用GD库将随机生成的字符绘制在图像上,最后将图像输出。

以下是一个示例代码,可以生成一个简单的4位数字验证码图像:

<?php
session_start();
header("Content-type: image/png");
 
$width = 100;
$height = 40;
$length = 4;
 
// 生成验证码字符串
$chars = "0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
    $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
 
// 保存验证码到Session
$_SESSION["captcha"] = $str;
 
// 创建图像对象并绘制背景
$im = imagecreatetruecolor($width, $height);
$bgColor = imagecolorallocate($im, 242, 242, 242);
imagefill($im, 0, 0, $bgColor);
 
// 添加干扰线
$lineColor = imagecolorallocate($im, 200, 200, 200);
for ($i = 0; $i < 6; $i++) {
    imageline($im, 0, mt_rand(0, $height), $width, mt_rand(0, $height), $lineColor);
}
 
// 添加噪点
$pixelColor = imagecolorallocate($im, 0, 0, 0);
for ($i = 0; $i < 50; $i++) {
    imagesetpixel($im, mt_rand(0, $width), mt_rand(0, $height), $pixelColor);
}
 
// 绘制验证码字符串
$font = 5;
$fontColor = imagecolorallocate($im, 0, 0, 0);
$fontWidth = imagefontwidth($font);
$fontHeight = imagefontheight($font);
$x = ($width - $fontWidth * $length) / 2;
$y = ($height - $fontHeight) / 2;
for ($i = 0; $i < $length; $i++) {
    $char = substr($str, $i, 1);
    imagechar($im, $font, $x + $fontWidth * $i, $y, $char, $fontColor);
}
 
// 输出图像
imagepng($im);
imagedestroy($im);
?>

三、验证验证码

生成验证码图像后,我们需要在提交表单时验证用户输入的验证码。在PHP中,我们可以通过比较用户输入的验证码和Session中保存的验证码进行验证。

以下是一个示例代码,可以验证用户输入的验证码并显示相关信息:

<?php
session_start();
 
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $captcha = $_POST["captcha"];
    if (!empty($captcha) && strtolower($captcha) == strtolower($_SESSION["captcha"])) {
        echo "验证码输入正确!";
    } else {
        echo "验证码输入错误!";
    }
}
?>
<form method="post">
    <input type="text" name="captcha" placeholder="请输入验证码">
    <img src="captcha.php" onclick="this.src='captcha.php?t='+Math.random()">
    <input type="submit" value="提交">
</form>

该代码中,我们在表单中添加了一个图像输入框和一个“刷新”按钮。当用户单击“刷新”按钮时,将随机生成一个新的验证码图像。用户输入后,单击“提交”按钮后将进行验证码验证。

四、结论

通过PHP实现验证码的生成与验证,可以有效地防止机器人或恶意攻击者对网站进行攻击。通过上述的示例代码,我们可以看到PHP代码实现验证码的过程也很简单,特别是使用GD库生成图像时,可以使代码更为简洁。因此,使用PHP代码生成验证码可以更有效地保护您的网站和用户的隐私安全。


猜你喜欢

【PHP】RESTfulAPI详解
1. 什么是RESTfulAPIRESTful API 是一种互联网软件架构的设计规范,设计指南,设计风格,设计原则(类似于web标准,并不是标准【规范,原则】)2. 产生背景开始开发时,前后端高度融合(耦合) 近些年:前后端分离,前端各种客户端产生。基于这种现状,需要一个统一的机制。为前后端通信服务(API机制) 因此,前后端分离开来前后端基于API 开发,即:面向接口开发 前后端基于接口传递数据。 RESTfulAPI作为制定接口标准的规范而产生了。3. RESTful APIAPI简介:
发表于:2024-05-24 浏览:275 TAG:
【PHP】php分布式架构有哪些技术
hp分布式架构的相关技术。分布式架构的概念和优势,然后从六个方面进行了详细的阐述,包括负载均衡、分布式缓存、分布式数据库、消息队列、分布式文件系统和容器化技术。最后对php分布式架构的技术进行了总结归纳。一、负载均衡在分布式架构中,负载均衡是非常重要的技术。它通过将请求分发到多个服务器上,实现了请求的平均分配,提高了系统的并发处理能力和可用性。负载均衡有多种实现方式,包括软件负载均衡、硬件负载均衡和DNS负载均衡等。二、分布式缓存分布式缓存是将数据缓存在多个服务器上,提高了系统的读取速度和性
发表于:2024-05-29 浏览:307 TAG:
【PHP】php有哪些爬虫模块类型
hp爬虫模块类型有cURL、Simple HTML DOM、Goutte、PhantomJS、Selenium等等。详细介绍:1、cURL,可以模拟浏览器行为轻松地获取网页内容;2、Simple HTML DOM,可以通过CSS选择器或XPath表达式来定位和提取HTML元素,方便地从网页中提取所需的数据;3、Goutte可以发送HTTP请求、处理Cookie、处理表单等等。本教程操作系统:Windows10系统、PHP8.1.3版本、Dell G3电脑。PHP作为一种流行的编程语言,具有强大
发表于:2023-12-04 浏览:638 TAG:
【PHP】SQL查询优化方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中使用!=或&lt;&gt;操作符,否则将引擎放弃使用索引而进行全表扫描。3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select&nbsp;id&nbsp;from&nbsp;t&nbsp;where&nbsp;num&nbsp;is&nbsp;null可以在num上设置默认值0,确保表
发表于:2024-07-15 浏览:259 TAG: #mysql
【PHP】php判断字符串是否含有日文字符
可以使用PHP的正则表达式函数preg_match()来检测字符串上的日文字符。以下是一个例子:$str&nbsp;=&nbsp;&quot;こんにちは、世界!&quot;; if&nbsp;(preg_match(&#39;/\p{Hiragana}|\p{Katakana}|\p{Han}/u&#39;,&nbsp;$str))&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;字符串包含日文字符。&quot;; } &nbsp;else&amp;nbs
发表于:2023-12-13 浏览:307 TAG:
【PHP】制作自己的Composer插件并与其他开发者共享
如何编写自己的Composer插件并分享给其他开发者在现代的PHP开发领域,Composer已经成为了一个不可或缺的工具。它可以帮助开发者管理项目依赖和自动加载类,大大简化了项目的构建过程。除了使用Composer来安装第三方的扩展包之外,我们也可以使用Composer来编写自己的插件,并将其分享给其他开发者。本文将逐步介绍如何编写自己的Composer插件,并提供具体的代码示例。首先,我们需要创建一个空的Composer插件项目。在命令行中进入项目根目录,然后执行以下命令:compo
发表于:2023-12-27 浏览:355 TAG:
【PHP】PHP实现图片验证码的生成和验证
PHP实现图片验证码的生成和验证在网站开发中,为了防止机器恶意攻击或者自动注册,我们经常会使用图片验证码来进行验证。本文将介绍如何使用PHP来生成和验证图片验证码,并给出具体的代码示例。生成图片验证码生成图片验证码的关键是生成随机的验证码字符串,并将其绘制到图片上。以下是一个生成图片验证码的示例代码:&lt;?php session_start(); &nbsp; //&nbsp;声明图片尺寸 $image_width&nbsp;=&nbsp;100; $image_height&amp;nb
发表于:2023-12-28 浏览:300 TAG:
【PHP】PHP8.1新特性大讲解之纯交集类型
纯交集类型 (Pure intersection types)您已经了解PHP 8.0 中的联合类型,交集类型也是一个类似的特性。联合类型要求输入是给定类型之一,交集类型要求输入是所有指定类型。当您使用大量接口时,交集类型特别有用:function&nbsp;generateSlug(HasTitle&amp;HasId&nbsp;$post)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;strtolower($post-&gt;getTitle())&amp;
发表于:2024-01-04 浏览:287 TAG:
【PHP】intervention/image设置文字竖排显示
在使用 intervention/image 库时,要让文字竖排显示,可以通过设置文字的样式和使用 rotate 方法将文字旋转90度来实现。以下是一个示例代码:use&nbsp;Intervention\Image\ImageManagerStatic&nbsp;as&nbsp;Image; &nbsp; //&nbsp;初始化ImageManager $imageManager&nbsp;=&nbsp;new&nbsp;Image(); &nbsp; //&nbsp;加载背景图片 $back
发表于:2024-04-08 浏览:333 TAG:
【PHP】ThinkPHP如何防止SQL注入攻击
在ThinkPHP中,参数绑定是一种安全的方式,用于处理用户输入,特别是在构建数据库查询时。参数绑定可以防止SQL注入攻击,因为绑定的参数会被自动转义,而不是直接插入到SQL语句中。以下是在ThinkPHP中使用参数绑定的一些建议。1. 控制器中的参数绑定:在控制器中,可以使用bind方法进行参数绑定。以下是一个简单的示例:public&nbsp;function&nbsp;index($id) { &nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;Db::
发表于:2024-01-04 浏览:334 TAG: