PHP Manual
/
算法

验证码如何工作(描述性图片)

22. 08. 2019

Obsah článku

验证码是目前保护免费格式的最常见方式之一。它最初不是为了保护数据安全,而是为了防止垃圾邮件,并承认它是一个人。

然而,它是由机器生成的,所以它并不总是完美的,但验证码测试的成功率大约为99%,只有1%的图像可以被一个制作精良的垃圾邮件机器人破译。

它是如何工作的

还有更多的选择,例如我使用这个解决方案。

  • 服务器接收到用户请求的表单页面的信息,并开始生成。
  • 在未来的验证码测试领域,它放了一张图片,上面有一个什么都不说的秘密地址(比如一个随机数,一串字符,......任何东西)。
  • 图像被生成并存储在该地址。同时,正确的成绩单被写入某处(也许是写入一个会话或数据库)。
  • 当用户提交表格时,会检查成绩单是否与他/她输入的内容相符。如果是这样,该表格就会被处理。如果没有,则要求重新描述另一张图片。
  • 在成功和不成功的尝试之后,临时验证码图像被删除(永远不会再被使用)。如果该表格在一定时间内没有提交,它也将被删除(过期)。

正确的转写

如果验证码测试可以被解决,用户可能是人类。但考虑一下无法解决任务的用户,特别是盲人用户,也是一件好事。这是一个很好的解决方案,可以结合多种可能的测试(特别是语音预取)。然而,目前机器的语音识别比读取图像的效率高得多。因此,这种解决方案并不总是理想的。

自定义简单验证码图像

通常情况下,只需生成一个具有一定尺寸的空白图像,并在其中清晰地输入几个字符即可,无需进一步编辑。认真的!大多数垃圾邮件机器人是愚蠢的,无法攻击具有这种保护的通用表格,尽管它是完全可读的文本,更好的OCR可以完美地转录。

产生的图像可能看起来像这样。

<img src="captcha.php" alt="ukázková captcha">

试着刷新几次页面,你会发现每次的代码都会随机变化。为了演示,它只是生成而没有保存,所以在你加载后立即被删除。

我使用PHPGD库解决了源代码,几乎所有的PHP安装和主机都有这个库。

Header("内容类型:image/png");
$obr = ImageCreate(100, 35);
$pozadi = ImageColorAllocate ($obr, 219, 28, 49); //背景色定义
$bila = ImageColorAllocate ($obr, 255, 255, 255); //文本的白颜色定义
$styl = array ($pozadi);
ImageSetStyle ($obr, $styl);
$nahodne_cislo = rand(11111,99999); //抽出一个5个字符长的随机数字
imagestring($obr, 5, 25, 10, $nahodne_cislo, $bila); //绘制文本的功能(在此为数字)。
ImagePNG($obr); //将图像生成到内存中并进行渲染
ImageDestroy($obr); //从内存中删除图像(它将不再需要,因为它只生成一次)。

然后,渲染图像只是一个HTML的问题。

<img src="captcha.php">

请注意,如果不作进一步的修改,这个脚本本身是不能发挥作用的。它只是作为一个示范,生成一个简单的图像。

摘要

验证码测试是相当可靠的,但很烦人,也很耗时。有时它们是不可读的,所以让用户选择使用javascript加载不同的图片是很好的,这样整个页面就不必重新加载,所有的东西都要重新填入。

请记住。对人类来说是微不足道的任务,对机器来说可能永远无法实现。这就是为什么即使是这种原始的验证码与完全可读的文本也能防止一半以上的垃圾邮件。

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2024