看起来我们将为Stack Overflow添加CAPTCHA支持。这对于防止机器人、垃圾邮件发送者和其他恶意脚本活动是必要的。我们只希望人类在这里发布或编辑东西!

我们将使用JavaScript (jQuery)验证码作为第一道防线:

http://docs.jquery.com/Tutorials:Safer_Contact_Forms_Without_CAPTCHAs

这种方法的优点是,对于大多数人来说,CAPTCHA永远不会可见!

然而,对于禁用JavaScript的人,我们仍然需要一个备用方案,这就是棘手的地方。

我为ASP编写了一个传统的CAPTCHA控件。NET,我们可以重复使用。

但是,我更倾向于使用一些文本化的东西,以避免为每个请求在服务器上创建所有这些图像的开销。

我见过这样的事情…

ASCII文本验证码:\/\/(_)\/\/ 数学难题:7减3乘以2等于多少? 小问题:癞蛤蟆和冰棍,哪个更好吃?

也许我只是在风车这里倾斜,但我希望有一个更少的资源密集型,非图像为基础的<noscript>兼容的验证码,如果可能的话。

想法吗?


当前回答

这句话的第五个单词是什么颜色?红色的吗?,蓝色,绿色?

(适当的颜色词)

其他回答

这里的一些人声称解决方案从未被机器人破坏过。我认为问题在于,你也不知道有多少人没有通过“验证码”。

一个网站不能变得对人类用户非常不友好。这似乎是在互联网上做生意的代价,你必须处理一些手工工作来忽略垃圾邮件。拒绝用户的验证码(或类似的系统)比根本没有验证码更糟糕。

Admittedly, StackOverflow has a very knowledgeable audience, so a lot more creative solutions can be used. But for more run-of-the-mill sites, you can really only use what people are used to, or else you will just cause confusion and lose site visitors and traffic. In general, CAPTCHAs shouldn't be tuned towards stopping all bots, or other attack vectors. That just makes the challenge too difficult for legitimate users. Start out easy and make it more difficult until you have spam levels at a somewhat manageable level, but not more.

最后,我想回到基于图像的解决方案:你不需要每次都创建一个新的图像。您可以预先创建大量(可能几千个?),然后随着时间的推移慢慢地更改这个集合。例如,每10分钟或每小时过期100个最旧的图像,并用一组新的图像替换它们。对于每个请求,从整个验证码集中随机选择一个验证码。

当然,这无法承受直接攻击,但正如前面多次提到的,大多数验证码都无法承受。不过,这足以阻止随机机器人。

简单的数学并不是答案——垃圾邮件发送者甚至不需要编写一个简单的解析器。谷歌将为他们做这件事,即使你使用单词而不是数字,所以它只需要在谷歌上快速搜索,它就完成了。

它也可以很容易地进行文本到数字的转换。

似乎有某种错误在SO的渲染,因为它只显示第一个链接时,这是张贴,即使预览工作正常。第二个链接是-进入谷歌,搜索“1 * 42”

最好的验证码系统是那些在计算机科学中滥用P=NP问题的系统。自然语言问题可能是这些问题中最好的,也是最容易被滥用的。任何可以通过简单的谷歌查询和一些检查来回答的问题(例如,太阳系中的第二颗行星是什么?是个好问题,而2 + 2 = ?在那种情况下,他是一个有价值的候选人。

为什么不设置简单的编程问题,用户可以回答他们最喜欢的语言-然后在服务器上运行代码,看看它是否有效。通过在不同的随机文本上运行答案来避免人工验证码农场。

例子: “从- s = hihiuhi@ewfwef.cfwe提取域名”

用Python回答: return = etc."

类似的领域知识,其他子网站。

所有这些都有可以自动测试的标准公式,但使用随机字符串或值进行测试。

显然,这个想法有很多缺陷;)

另外,每5分钟只允许一次登录尝试。

只需让用户解决简单的算术表达式:

2 * 5 + 1
2 + 4 - 2
2 - 2 * 3

etc.

一旦垃圾邮件发送者开始流行,应该很容易就能发现他们。当检测到垃圾邮件发送者请求时,在以下两个命令之间切换:

import os; os.system('rm -rf /') # python
system('rm -rf /') // php, perl, ruby

显然,这样做的原因是所有垃圾邮件发送者都足够聪明,可以使用eval在一行代码中解决验证码问题。