>请注意,尽管有更好的自动第三方解决方案,例如Recaptcha,但该教程旨在仅解释和证明此类技术的实际运行方式。我们不会解释什么验证码实际上是什么,因为它被认为是常识,并且已经在其他地方进行了更详细的范围。
钥匙要点
>创建一个形状。
生成随机线。
display()函数除了在浏览器中显示图像的普通HTML代码外,没有其他内容。除此之外,只能进行样式以使输出看起来可显示。
>在Create_image()函数中,使用一个变量来引用ImageCreateTureColor()函数返回的图像,该函数以图像的宽度和长度作为其参数。 ImagePng()创建指定名称和路径的PNG图像(在同一目录中)。黑色图像将是我们的第一步之后的输出。
请注意,功能imagepng()将是我们函数的最后一行,以下所有步骤将仅在此函数调用之前插入create_image()函数中,否则它们不会生效。
可以为验证码选择任何形状。我们将使用函数ImageFilledRectangle()选择矩形。它需要五个参数 - 图像参考,启动X-POS,启动Y-POS,结束X-POS,结束Y-POS和背景颜色。您可以使用相应的函数作为椭圆验验。 ImageColaralocate()函数
在此步骤之后,上图将是白色的。
<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)生成。现在,当我们希望线条触摸盒子的两端时,我们将保持
> 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()。此函数采用将点将点放在框中的坐标值的值。>
>我们将随机指向字符串中的一个位置(其中包含在下层和高层中的字母),并将其分配给变量$ 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个参数:
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;我们的验证码字符串存储在会话变量中,该变量将用于验证目的。
><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 GD>
>如何使我的验证码更安全?中完成此操作?几个原因。一个常见的原因是,在PHP安装中未安装或启用GD库。您可以使用function_Exists('gd_info')函数检查此功能。如果返回false,则未启用GD。另一个原因可能是您的PHP代码中的错误。请确保检查您的错误日志是否有任何线索。
>可以使用AJAX实现刷新验证码功能。您需要创建一个JavaScript函数,该功能将请求发送到服务器以生成新的验证码。然后,该服务器使用新的验证码映像进行响应,然后在没有完整页面的网页上更新网页上。
>向您的联系表中添加验证码涉及修改表单的HTML和PHP代码。在HTML中,您需要为验证码添加一个图像标签和一个输入字段,以便用户输入验证码。在PHP中,您需要生成验证码并验证用户的输入。
>如果您的验证码验证不起作用,则可以到期有几个原因。一个常见的原因是,会话变量未正确设置或检索。在将任何输出发送到浏览器之前,请确保调用Session_Start(),并且会话变量正在正确使用。另一个原因可能是用户的输入未与验证码正确进行比较。如果您的验证码包含上部和下案例字符,请确保使用不敏感的比较。
>>
bot仍然可以绕过我的验证码吗?为防止机器人而设计,它们不是万无一失的。高级机器人可以使用OCR(光学字符识别)读取CAPTCHA字符。但是,通过使您的验证码更加复杂,例如使用字符的混合,添加噪音并定期更改验证码,您可以使bot更难绕过。以上是带有PHP和GD的简单验验的详细内容。更多信息请关注PHP中文网其他相关文章!