【问题标题】:Best way to get a random word for a captcha script in PHP在 PHP 中为验证码脚本获取随机单词的最佳方法
【发布时间】:2009-08-01 19:08:39
【问题描述】:

我正在编写一个新的验证码脚本,它几乎完成了,除了我想要一个单词列表,例如假设我有一个包含 300 个 5 个字母单词的列表,我想用于验证码图像文本.

在高流量网站上处理此列表的最佳性能方法是什么?

每次加载时从文本文件中读取单词
存储在数组中
其他?

【问题讨论】:

  • 为什么不使用网上提供的免费验证码服务?喜欢:captchas.net
  • 我不想要外部服务,喜欢把东西放在内部,我认为它更专业
  • 上面的站点提供了 php 脚本,这些脚本将存放在您的 Web 服务器中。您无需与他们的服务器通信。只是他们为您提供了现成的代码。总之只是一个建议。至少看看他们的代码。
  • 哦,好的,我会看看它,实际上我制作我的原因是因为我查看了许多不同的预制件,但没有一个符合我的需求,所以我自己编写了代码,我很漂亮对此感到满意,我只是想在随机字符之外添加一些单词,谢谢,尽管我会检查那里的代码
  • 自制软件和开箱即用之间存在权衡。 Homebrew 可能很容易被脚本破解,并且您可能会在您的应用程序中引入巨大的安全漏洞而没有意识到这一点。另一方面,更传统的软件包可能有人在积极尝试规避它。

标签: php captcha


【解决方案1】:

使用固定的单词列表可能会使您的验证码变弱,因为它将变体的数量限制为 n! / (n - k)!选项。 n = 300 个单词并且每个验证码 k=2 个不同的单词,无论单词有多长,它都只有 89700 个选项。

如果您使用四个随机字母 (a-z) 的序列,您将获得更多选项(确切地说 n^k = 26^4 = 456976)。

【讨论】:

  • 哇,那是一些疯狂的数学,我什至不知道你能找到它,无论如何我最终还是放弃了想法这个词并使用了 4 个字符,我做了我的函数,我可以很容易地改变它更多,我想知道有多少个 5 或 6 个字符,哈哈
  • 您可以使用公式 n*^*k 进行计算,其中 n 是字符集中的字符数,k 要使用的字符数。
  • 这是一门叫做离散数学的科学。
【解决方案2】:

如果你只想从 30000 字中选择,我只是将它们全部放在一个数组中,直接用 php 代码,然后随机抽取一个。那将是最好的表现。

【讨论】:

  • 或序列化对象也可以提供帮助。
【解决方案3】:

性能的最佳选择

  1. 最好将随机数列表放入内存(APC 或 Memcache => google/stackoverflow 搜索 APC 或 Memcache)以获得最佳性能,因为磁盘 IO 会使您的网站变慢大多数时候。为此,您应该有一个具有足够内存(>= 128MB)的盒子,并且可以安装软件(APC/Memcache)。如果您想在高流量网站上获得良好的性能,您应该愿意为此付费!!!

  2. 如果您使用的是共享主机提供商(但您不会获得最佳性能),那么最好将单词放在同一文件中的数组中,因为每个 require 语句都会获取光盘中的文件。

返回随机词

就像lucky说的,你可以通过一个简单的rand函数调用来获取一个随机数

return ($words[rand(0, count($words)-1);

其中 $words 是包含所有单词的数组。

VPS 主机

这些是我使用 google 找到的一些便宜的 VPS 托管,但我认为您应该做更多的研究,为您的高性能网站找到最好的 VPS 托管。

【讨论】:

  • 感谢您的信息,我现在在 2 台服务器上运行,一直在寻找最佳性能,我昨天才开始使用 memcache,我想尝试 APC,但我认为 APC 是基于磁盘的?无论如何,我最终没有做随机单词列表,但我做了一个随机字体列表来用字体数组构建我的字符,而不是使用数组 rand 函数,我想也许常规 rand 函数可能更快?所以我用它来选择一个与我的数组编号相对应的数字
  • NOO APC 是基于内存的,并且(主要)是一个操作码缓存,它将字节码放入内存中,这将大大加快您的 php。如果可能的话,您应该真正安装它,因为它会大大加快您的网站速度。 APC 可以做的另一件事是将变量放入内存中(内存方式比磁盘 IO 快)en.wikipedia.org/wiki/…
【解决方案4】:

您可以简单地生成一个随机数并显示它,而不是 300 个单词。无需列表,无需加载列表,无需管理列表,......

【讨论】:

  • 已经完成,我正在扩展它的功能,我正在寻找获取任意长度列表并从中选择 1 个随机单词的最佳方法
  • 我认为您没有理解我的回答。您只需选择一个随机数并显示该数字本身,而不是您从中随机选择的单词列表。无需多讲。不需要清单。无需列表管理。它相当无脑。
  • 那将是我见过的最弱的验证码,你知道的只有 10 个数字吗?
  • 得到是在开玩笑。我所知道的几乎所有语言中的随机数生成器都可以使用 64 位浮点“随机”函数产生 56 位随机值。即使是脑残的 PHP 具有 一个随机数生成器(对 PHP 来说仅能保证 15 位),但其范围远大于“10 个数字”。 php.net/manual/en/function.rand.php
  • 我承认我对此知之甚少,但您是说数字 1-10 或 9+0 比使用整个 alfabet 更安全?就像我说的我不明白所有花哨的数学,它看起来像是 27 个字符的组合,大约有 456,976 个可能的验证码
【解决方案5】:

您每秒需要处理多少次登录?这似乎不是花时间进行优化的正确地方。几乎任何找到随机单词的方式都应该没问题,特别是如果您的单词列表只有 300 个单词。

我会从一个简单文本文件开始,每行一个单词,然后做一些简单的事情,比如

$words = file("wordlist.txt");
return ($words[rand(0, count($word)-1);

只有当它真的被证明是一个瓶颈时,我才会将其更改为随机 fseek() 或其他一些“高性能”技巧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2016-04-17
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多