带有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>>替换显示()函数中的img src标签
以及我们在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工具

Undress AI Tool
免费脱衣服图片

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

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

Clothoff.io
AI脱衣机

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

热门文章

热工具

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

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

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

Dreamweaver CS6
视觉化网页开发工具

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

PHP变量作用域常见问题及解决方法包括:1.函数内部无法访问全局变量,需使用global关键字或参数传入;2.静态变量用static声明,只初始化一次并在多次调用间保持值;3.超全局变量如$_GET、$_POST可在任何作用域直接使用,但需注意安全过滤;4.匿名函数需通过use关键字引入父作用域变量,修改外部变量则需传递引用。掌握这些规则有助于避免错误并提升代码稳定性。

PHP注释代码常用方法有三种:1.单行注释用//或#屏蔽一行代码,推荐使用//;2.多行注释用/.../包裹代码块,不可嵌套但可跨行;3.组合技巧注释如用/if(){}/控制逻辑块,或配合编辑器快捷键提升效率,使用时需注意闭合符号和避免嵌套。

写好PHP注释的关键在于明确目的与规范,注释应解释“为什么”而非“做了什么”,避免冗余或过于简单。1.使用统一格式,如docblock(/*/)用于类、方法说明,提升可读性与工具兼容性;2.强调逻辑背后的原因,如说明为何需手动输出JS跳转;3.在复杂代码前添加总览性说明,分步骤描述流程,帮助理解整体思路;4.合理使用TODO和FIXME标记待办事项与问题,便于后续追踪与协作。好的注释能降低沟通成本,提升代码维护效率。

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

易于效率,启动启动tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

用户语音输入通过前端JavaScript的MediaRecorderAPI捕获并发送至PHP后端;2.PHP将音频保存为临时文件后调用STTAPI(如Google或百度语音识别)转换为文本;3.PHP将文本发送至AI服务(如OpenAIGPT)获取智能回复;4.PHP再调用TTSAPI(如百度或Google语音合成)将回复转为语音文件;5.PHP将语音文件流式返回前端播放,完成交互。整个流程由PHP主导数据流转与错误处理,确保各环节无缝衔接。

在PHP中搭建社交分享功能的核心方法是通过动态生成符合各平台要求的分享链接。1.首先获取当前页面或指定的URL及文章信息;2.使用urlencode对参数进行编码;3.根据各平台协议拼接生成分享链接;4.在前端展示链接供用户点击分享;5.动态生成页面OG标签优化分享内容展示;6.务必对用户输入进行转义以防止XSS攻击。该方法无需复杂认证,维护成本低,适用于大多数内容分享需求。

要实现PHP结合AI进行文本纠错与语法优化,需按以下步骤操作:1.选择适合的AI模型或API,如百度、腾讯API或开源NLP库;2.通过PHP的curl或Guzzle调用API并处理返回结果;3.在应用中展示纠错信息并允许用户选择是否采纳;4.使用php-l和PHP_CodeSniffer进行语法检测与代码优化;5.持续收集反馈并更新模型或规则以提升效果。选择AIAPI时应重点评估准确率、响应速度、价格及对PHP的支持。代码优化应遵循PSR规范、合理使用缓存、避免循环查询、定期审查代码,并借助X
