带有PHP和GD的简单验验
>请注意,尽管有更好的自动第三方解决方案,例如Recaptcha,但该教程旨在仅解释和证明此类技术的实际运行方式。我们不会解释什么验证码实际上是什么,因为它被认为是常识,并且已经在其他地方进行了更详细的范围。
钥匙要点
PHP中的GD(图形绘制)库可用于创建验证码图像,该图像通常由形状,失真和文本组成。
验证码创建过程涉及显示一个空图像,创建形状,生成随机线和点以及生成随机文本。- 码验证验证过程涉及将用户的输入与会话变量中存储的验证码字符串进行比较。如果输入与验证码字符串匹配,则将用户的响应视为正确。 > 为了确保始终刷新验证码图像,并且不会从浏览器缓存中检索,可以使用php。
- 本教程演示了如何创建简单的验证码,建议使用更安全,更可访问的第三方解决方案(例如recaptcha)进行生产应用程序。
- 绘制验证码
- >您必须在继续之前安装GD(图形绘制)库。该库可以通过内置的PHP功能绘制图形和图像。要安装它,请运行sudo apt-get安装php5-gd或在基于非Ubuntu的操作系统上,请按照说明进行操作。 验证码通常由三件事组成 - 形状,失真和文本。
- 我们将遵循下面提到的步骤:
>在浏览器上显示一个空图像。
>创建一个形状。
生成随机线。
- 生成随机文本。
- 本文中使用的过程样式仅出现仅是因为这是概念的证明,并且使最终文件尽可能简单。在一个真实的项目中,您会oop。
- > 显示一个空图像
- >图像将由HTML处理,就好像使用“ IMG”标签显示外部图像一样。使用了两个功能 - 一个用于创建图像,另一个用于显示。
- >
display()函数除了在浏览器中显示图像的普通HTML代码外,没有其他内容。除此之外,只能进行样式以使输出看起来可显示。
>在Create_image()函数中,使用一个变量来引用ImageCreateTureColor()函数返回的图像,该函数以图像的宽度和长度作为其参数。 ImagePng()创建指定名称和路径的PNG图像(在同一目录中)。黑色图像将是我们的第一步之后的输出。
请注意,功能imagepng()将是我们函数的最后一行,以下所有步骤将仅在此函数调用之前插入create_image()函数中,否则它们不会生效。
可以为验证码选择任何形状。我们将使用函数ImageFilledRectangle()选择矩形。它需要五个参数 - 图像参考,启动X-POS,启动Y-POS,结束X-POS,结束Y-POS和背景颜色。您可以使用相应的函数作为椭圆验验。 ImageColaralocate()函数
将颜色分配给变量,因为它将颜色的RGB组合作为参数。以下代码将附加在create()函数中。
在此步骤之后,上图将是白色的。
<span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title</span>></span>demo.php<span><span></title</span>></span> </span> <span><span><span><body</span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div</span> <span>style<span>="<span>text-align:center;</span>"</span></span>></span> </span> <span><span><span><h3</span>></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></h3</span>></span> </span> <span><span><span><b</span>></span>This is just to check if you are a robot<span><span></b</span>></span> </span> <span><span><span><div</span> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>></span> </span> <span><span><span><img</span> src<span>="image.png"</span>></span> </span> <span><span><span></div</span>></span> </span> //div1 ends <span><span><span></div</span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></body</span>></span> </span><span><span><?php </span></span><span><span>?></span></span>
生成随机线。
现在,我们实际上是从使验证码的失真部分开始。在PHP中,线从起点(x1,y1)到终点(x2,y2)生成。现在,当我们希望线条触摸盒子的两端时,我们将保持
imageLine()函数将x1,x2,y1,y2坐在该顺序中作为参数,除了线的图像参考和颜色。线色已被分配,就像在上一步中分配了背景颜色一样。
> y坐标是rand()*p给出的,因为这是我们盒子的高度,并且始终将返回50以下的值。您可以使用rand(0,50)。它们将产生相同的输出范围。
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
生成随机点。
随机点将以与随机线相同的方式生成。使用的函数是ImagesetPixel()。此函数采用将点将点放在框中的坐标值的值。>
>通过使用rand()* 0随机生成X坐标,因为这是我们盒子的宽度,这将始终返回200岁以下的值。您可以使用RAND(0,200)。它们将产生相同的输出范围。 y坐标的生成如线步中。
生成随机文本
>我们将随机指向字符串中的一个位置(其中包含在下层和高层中的字母),并将其分配给变量$ letter
><span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title</span>></span>demo.php<span><span></title</span>></span> </span> <span><span><span><body</span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div</span> <span>style<span>="<span>text-align:center;</span>"</span></span>></span> </span> <span><span><span><h3</span>></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></h3</span>></span> </span> <span><span><span><b</span>></span>This is just to check if you are a robot<span><span></b</span>></span> </span> <span><span><span><div</span> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>></span> </span> <span><span><span><img</span> src<span>="image.png"</span>></span> </span> <span><span><span></div</span>></span> </span> //div1 ends <span><span><span></div</span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></body</span>></span> </span><span><span><?php </span></span><span><span>?></span></span>
放入循环时,看起来像
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
我们将解释行
><span>$line_color = imagecolorallocate($image, 64,64,64); </span><span>for($i=0;$i<10;$i++) { </span> <span>imageline($image,0,rand()%50,200,rand()%50,$line_color); </span><span>}</span>
在下一节中。
函数Imagestring()在我们的图像中写入文本。它有6个参数:
- >图像参考。 文本的字体大小(最多可以是5)。
- x坐标(每个字母比例更改)。
- y坐标(保持相同,尽管我们也可以随机更改此)。
- >要编写的实际字符串。
- 文本的字体色。
- 如果您希望具有更大的字体和不同的字体样式, >也可以使用函数imagettftext()。对于文本的角度和字体样式,它还需要2个其他论点。
X坐标的计算是通过检查完成的。大概,这些字母的间距约为35个像素(5($ i*30)),其中$ i = 0,1,2,3,4,5,6。这是因为如果我们将这个值保持在15-20px左右,则可能会有两个字母重叠。如果该值超过40px,则完全不适合盒子。
这将生成6个字母验证码文本。我们始终可以通过更改由于简单性(例如颜色,Y-Coordine等)来创造更多的随机性,例如最终的验证码看起来像这样
>每次您刷新页面时,在验证码中写的文本都会更改。
可以通过使用像素或更改颜色或大小来创建设计来实现更多随机性。>
>在这里采取用户的响应,然后在处理后,他/她会收到答复。首先,使用输入文本框和提交按钮制作一个简单的表单。根据复杂的Web应用程序的要求,可以有许多方法来处理验证码。但是,出于此示例,请保持简单,我们将在同一页面上对其进行处理。
>在上一个代码段中未解释的两行现在开始发挥作用:>
$ word。= $ letter; - 串联操作员。用于一个接一个地附加所有单个字母,生成6个字母的单词。
$ _ session ['catcha_string'] = $ word;我们的验证码字符串存储在会话变量中,该变量将用于验证目的。
>- 我们将更改display()的定义以添加类似形式的结构。
> 将使用两个提交按钮,一个将字符串提交,另一个提交按钮刷新页面。 - >将在两个关闭的DIV标签之间添加以下行(请参阅上一个display()函数中的注释)
<span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title</span>></span>demo.php<span><span></title</span>></span> </span> <span><span><span><body</span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div</span> <span>style<span>="<span>text-align:center;</span>"</span></span>></span> </span> <span><span><span><h3</span>></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></h3</span>></span> </span> <span><span><span><b</span>></span>This is just to check if you are a robot<span><span></b</span>></span> </span> <span><span><span><div</span> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>></span> </span> <span><span><span><img</span> src<span>="image.png"</span>></span> </span> <span><span><span></div</span>></span> </span> //div1 ends <span><span><span></div</span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></body</span>></span> </span><span><span><?php </span></span><span><span>?></span></span>
>在进一步移动之前,我们必须知道何时显示以及何时不显示输入框。它将仅显示
>- 如果页面刚刚加载。
- 如果用户的答案不正确。
>每次单击提交按钮时,使用$标志设置为“ 1”来满足第一个条件。最初,它已设置为任何其他值。通过检查我们的会话变量中存储的值是否与用户输入相同(请参见下面的代码)来实现第二个条件。
为了实现这一目标,我们将在本文开头替换开始步骤的以下几行:with:
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
请注意,函数create_image()和display()仅按照上述2个条件来调用。
<span>$line_color = imagecolorallocate($image, 64,64,64); </span><span>for($i=0;$i<10;$i++) { </span> <span>imageline($image,0,rand()%50,200,rand()%50,$line_color); </span><span>}</span>
>我们需要上一页的会话变量,因此会话不会在此处销毁。关闭浏览器窗口后,会话将自动销毁。
>验证码看起来像
如果输入不正确,则只有然后再次提示用户。
如果输入正确,则将向用户显示消息。
>有一个小警告 - 当用户按下返回按钮时,浏览器缓存中的任何图像都不会重新加载,而页面则可以。在发布请求中,浏览器返回按钮将显示一个“过期的文档”页面,但是当请求获取时,图像不会再生。
解决方案很简单 - 每次创建图像的唯一名称,以便浏览器在缓存中找不到它们。我们将在创建和显示在浏览器中时,将一个唯一的字符串通过内置时间()函数返回给我们。
。>在您开始会话的位置下方添加此行:
>用
<span>$pixel_color = imagecolorallocate($image, 0,0,255); </span><span>for($i=0;$i<1000;$i++) { </span> <span>imagesetpixel($image,rand()%200,rand()%50,$pixel_color); </span><span>} </span>
以及我们在create_image()函数中创建png映像的部分也将被
<span>$letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; </span><span>$len = strlen($letters); </span><span>$letter = $letters[rand(0, $len-1)]; </span> <span>$text_color = imagecolorallocate($image, 0,0,0);</span>
现在,图像将被称为Image39342015.png。此过程将随着页面的刷新而创建的图像多次,这可能会浪费大量的磁盘空间,因此,我们将确保在创建图像之前,删除了PNG扩展名的所有其他图像。在调用ImagePNG()函数之前添加以下内容。
<span>for ($i = 0; $i< 6;$i++) { </span> <span>$letter = $letters[rand(0, $len-1)]; </span> <span>imagestring($image, 5, 5+($i*30), 20, $letter, $text_color); </span> <span>$word.=$letter; </span><span>} </span><span>$_SESSION['captcha_string'] = $word;</span>
在生产应用程序中,只需确保您隔离存储验证码图像的文件夹,其他有用的图像也可能会被删除。
<span>$word.=$letter; </span><span>$_SESSION['captcha_string'] = $word; </span>
结论
在PHP中制作各种类型的验证码非常容易。本文介绍了用于创建标准验证码的三个基本内容 - 形状,失真和文本。本文是概念证明,本文介绍的代码不应在生产中使用,尤其是因为存在诸如recaptcha之类的优秀替代方案,这也支持声音输出以帮助有听力障碍的人。我们希望您发现这篇文章很有趣。在下面留下您的评论和反馈!>
经常询问的问题(常见问题解答)关于带有PHP GD的简单验证
>如何自定义验证码的外观?>可以通过修改PHP代码来自定义验证码的外观。您可以更改字体,颜色,尺寸,甚至可以更改验证码的背景。例如,要更改字体,您可以使用imagettftext()函数并在参数中指定字体文件。要更改颜色,您可以使用ImageColorallocate()函数并指定所需颜色的RGB值。请记住,自定义不仅使您的验证码更加美观,而且更加安全地抵抗机器人。>
>如何使我的验证码更安全?>有几种使验证码更安全的方法。一种方法是使用上和下情况的字母数字字符的混合。这增加了可能的组合数量,因此机器人更难猜测。您还可以增加验证码的长度。另一种方法是将噪声(例如线或点)添加到验证码图像中。可以使用ImageLine()和ImageLeLipse()函数在php。
>中完成此操作?几个原因。一个常见的原因是,在PHP安装中未安装或启用GD库。您可以使用function_Exists('gd_info')函数检查此功能。如果返回false,则未启用GD。另一个原因可能是您的PHP代码中的错误。请确保检查您的错误日志是否有任何线索。
>如何实现刷新验证验证功能?
>可以使用AJAX实现刷新验证码功能。您需要创建一个JavaScript函数,该功能将请求发送到服务器以生成新的验证码。然后,该服务器使用新的验证码映像进行响应,然后在没有完整页面的网页上更新网页上。
我可以在没有GD库的情况下使用CACTCHA吗?
,而GD库通常用于用于在PHP中创建验证码,这不是唯一的方法。您也可以使用其他库,例如ImageMagick,甚至可以创建基于文本的验证码。但是,这些方法可能无法提供与GD库相同的安全性和自定义。>如何将CAPTCHA添加到我的触点表格?
>向您的联系表中添加验证码涉及修改表单的HTML和PHP代码。在HTML中,您需要为验证码添加一个图像标签和一个输入字段,以便用户输入验证码。在PHP中,您需要生成验证码并验证用户的输入。
>>为什么我的验证验证验证不起作用?
>如果您的验证码验证不起作用,则可以到期有几个原因。一个常见的原因是,会话变量未正确设置或检索。在将任何输出发送到浏览器之前,请确保调用Session_Start(),并且会话变量正在正确使用。另一个原因可能是用户的输入未与验证码正确进行比较。如果您的验证码包含上部和下案例字符,请确保使用不敏感的比较。
>>如何使我的验证码可访问视觉受损的用户?
>使您的验证码可访问以视觉上的键盘访问受损的用户可能具有挑战性,但是有几种方法。一种方法是提供音频验证码选项。这涉及生成带有验证码字符大声说出来的音频文件。另一种方法是使用一个基于问题的验证码,在其中询问用户一个简单的问题,即一个机器人很难回答。>
bot仍然可以绕过我的验证码吗?为防止机器人而设计,它们不是万无一失的。高级机器人可以使用OCR(光学字符识别)读取CAPTCHA字符。但是,通过使您的验证码更加复杂,例如使用字符的混合,添加噪音并定期更改验证码,您可以使bot更难绕过。以上是带有PHP和GD的简单验验的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。
