首页 > 后端开发 > php教程 > 带有PHP和GD的简单验验

带有PHP和GD的简单验验

Jennifer Aniston
发布: 2025-02-22 09:13:09
原创
577 人浏览过

带有PHP和GD的简单验验

带有PHP和GD的简单验验

到目前为止,我们都以在线表格遇到了Captcha图像。验证码是必不可少的邪恶,本文将教您如何制作它们。

>请注意,尽管有更好的自动第三方解决方案,例如Recaptcha,但该教程旨在仅解释和证明此类技术的实际运行方式。我们不会解释什么验证码实际上是什么,因为它被认为是常识,并且已经在其他地方进行了更详细的范围。

钥匙要点

PHP中的GD(图形绘制)库可用于创建验证码图像,该图像通常由形状,失真和文本组成。

验证码创建过程涉及显示一个空图像,创建形状,生成随机线和点以及生成随机文本。
  • 码验证验证过程涉及将用户的输入与会话变量中存储的验证码字符串进行比较。如果输入与验证码字符串匹配,则将用户的响应视为正确。
  • > 为了确保始终刷新验证码图像,并且不会从浏览器缓存中检索,可以使用php。
  • 本教程演示了如何创建简单的验证码,建议使用更安全,更可访问的第三方解决方案(例如recaptcha)进行生产应用程序。
  • 绘制验证码
  • >您必须在继续之前安装GD(图形绘制)库。该库可以通过内置的PHP功能绘制图形和图像。要安装它,请运行sudo apt-get安装php5-gd或在基于非Ubuntu的操作系统上,请按照说明进行操作。
  • 验证码通常由三件事组成 - 形状,失真和文本。
  • 我们将遵循下面提到的步骤:

>在浏览器上显示一个空图像。

>创建一个形状。

生成随机线。

生成随机点。
  1. 生成随机文本。
  2. 本文中使用的过程样式仅出现仅是因为这是概念的证明,并且使最终文件尽可能简单。在一个真实的项目中,您会oop。
  3. >
  4. 显示一个空图像
  5. >图像将由HTML处理,就好像使用“ IMG”标签显示外部图像一样。使用了两个功能 - 一个用于创建图像,另一个用于显示。
  6. >
第一行指示在我们页面上用户会话的开始。

display()函数除了在浏览器中显示图像的普通HTML代码外,没有其他内容。除此之外,只能进行样式以使输出看起来可显示。

>在Create_image()函数中,使用一个变量来引用ImageCreateTureColor()函数返回的图像,该函数以图像的宽度和长度作为其参数。 ImagePng()创建指定名称和路径的PNG图像(在同一目录中)。

黑色图像将是我们的第一步之后的输出。

请注意,功能imagepng()将是我们函数的最后一行,以下所有步骤将仅在此函数调用之前插入create_image()函数中,否则它们不会生效。 带有PHP和GD的简单验验

创建一个形状

可以为验证码选择任何形状。我们将使用函数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)生成。现在,当我们希望线条触摸盒子的两端时,我们将保持坐标为,即我们的盒子的完整宽度。 坐标将被随机生成。这将仅创建一个随机行。我们将通过将此功能放入for循环中来生成多行。 带有PHP和GD的简单验验

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()。此函数采用将点将点放在框中的坐标值的值。带有PHP和GD的简单验验>

>通过使用rand()* 0随机生成X坐标,因为这是我们盒子的宽度,这将始终返回200岁以下的值。您可以使用RAND(0,200)。它们将产生相同的输出范围。 y坐标的生成如线步中。

带有PHP和GD的简单验验

生成随机文本

>我们将随机指向字符串中的一个位置(其中包含在下层和高层中的字母),并将其分配给变量$ 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个参数:

  1. >图像参考。
  2. 文本的字体大小(最多可以是5)。
  3. x坐标(每个字母比例更改)。
  4. y坐标(保持相同,尽管我们也可以随机更改此)。
  5. >要编写的实际字符串。
  6. 文本的字体色。
  7. 如果您希望具有更大的字体和不同的字体样式,
  8. >也可以使用函数imagettftext()。对于文本的角度和字体样式,它还需要2个其他论点。

X坐标的计算是通过检查完成的。大概,这些字母的间距约为35个像素(5($ i*30)),其中$ i = 0,1,2,3,4,5,6。这是因为如果我们将这个值保持在15-20px左右,则可能会有两个字母重叠。如果该值超过40px,则完全不适合盒子。

这将生成6个字母验证码文本。我们始终可以通过更改由于简单性(例如颜色,Y-Coordine等)来创造更多的随机性,例如

最终的验证码看起来像这样

>

每次您刷新页面时,在验证码中写的文本都会更改。

可以通过使用像素或更改颜色或大小来创建设计来实现更多随机性。带有PHP和GD的简单验验>

验证


>在这里采取用户的响应,然后在处理后,他/她会收到答复。首先,使用输入文本框和提交按钮制作一个简单的表单。根据复杂的Web应用程序的要求,可以有许多方法来处理验证码。但是,出于此示例,请保持简单,我们将在同一页面上对其进行处理。

>在上一个代码段中未解释的两行现在开始发挥作用:>

$ word。= $ letter; - 串联操作员。用于一个接一个地附加所有单个字母,生成6个字母的单词。

$ _ session ['catcha_string'] = $ word;我们的验证码字符串存储在会话变量中,该变量将用于验证目的。

>
  1. 我们将更改display()的定义以添加类似形式的结构。>
  2. 将使用两个提交按钮,一个将字符串提交,另一个提交按钮刷新页面。
  3. >将在两个关闭的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. 如果页面刚刚加载。
  2. 如果用户的答案不正确。

>每次单击提交按钮时,使用$标志设置为“ 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>
登录后复制
登录后复制

>我们需要上一页的会话变量,因此会话不会在此处销毁。关闭浏览器窗口后,会话将自动销毁。

>

验证码看起来像

带有PHP和GD的简单验验如果输入不正确,则只有然后再次提示用户。

>

带有PHP和GD的简单验验如果输入正确,则将向用户显示消息。

>

带有PHP和GD的简单验验>有一个小警告 - 当用户按下返回按钮时,浏览器缓存中的任何图像都不会重新加载,而页面则可以。在发布请求中,浏览器返回按钮将显示一个“过期的文档”页面,但是当请求获取时,图像不会再生。

>

解决方案很简单 - 每次创建图像的唯一名称,以便浏览器在缓存中找不到它们。我们将在创建和显示在浏览器中时,将一个唯一的字符串通过内置时间()函数返回给我们。

>在您开始会话的位置下方添加此行:

>用
<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更难绕过。

是CAPTCHA,是防止垃圾邮件的唯一方法?

CAPTCHA是防止垃圾邮件的常见方法,但这不是唯一的方法。其他方法包括使用Honeypot,这是一个隐藏的表单字段,该字段将填写,但人类不会检查用户的行为,例如填写表单所花费的时间,并使用诸如Akismet之类的服务,该服务已过滤出来垃圾邮件基于已知垃圾邮件的数据库。

以上是带有PHP和GD的简单验验的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板