看起来我们将为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>兼容的验证码,如果可能的话。

想法吗?


当前回答

你看过威基斯吗?

Waegis是一个在线web服务,它公开了一个开放的API(应用程序编程接口)。它通过API方法获取传入数据,并应用快速检查,及时识别垃圾邮件和合法内容。然后它将结果返回给客户端,以指定内容是否是垃圾邮件。”

其他回答

你看过威基斯吗?

Waegis是一个在线web服务,它公开了一个开放的API(应用程序编程接口)。它通过API方法获取传入数据,并应用快速检查,及时识别垃圾邮件和合法内容。然后它将结果返回给客户端,以指定内容是否是垃圾邮件。”

If the main issue with not using images for the captcha is the CPU load of creating those images, it may be a good idea to figure out a way to create those images when the CPU load is "light" (relatively speaking). There's no reason why the captcha image needs to be generated at the same time that the form is generated. Instead, you could pull from a large cache of captchas, generated the last time server load was "light". You could even reuse the cached captchas (in case there's a weird spike in form submissions) until you regenerate a bunch of new ones the next time the server load is "light".

回答最初的问题:

ASCII很糟糕:我不得不眯着眼睛才能找到“WOW”。这是正确的吗?它可以是“VVOVV”或其他什么; 非常简单的算术很好。盲人也能回答。(但正如Jarod所说,要注意操作符优先级。)我想有人可以编写一个解析器,但这使得垃圾邮件的成本更高。 琐事是可以的,但你必须把它们都写出来:-(

我看过动物的照片[那是什么?]。漫画投票使用一个人物的图片,他们的名字写在图像的某处[输入名字]。不可能解析,对盲人来说不行。

您可以使用音频回退读取字母和数字(与验证码中的字母和数字相同)。

最后一道防线:使垃圾邮件易于报告(一键)和易于删除(一个重述屏幕检查是否是垃圾邮件帐户,显示最后十条消息,一键删除帐户)。不过,这仍然很费时。

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

我一直在用下面这个简单的技巧,但也不是万无一失。如果有人真的想绕过这个,很容易查看源代码(即不适合谷歌验证码),但它应该愚弄大多数机器人。

像这样添加2个或更多的表单字段:

<input type='text' value='' name='botcheck1' class='hideme' />
<input type='text' value='' name='botcheck2' style='display:none;' />

然后使用CSS隐藏它们:

.hideme {
    display: none;
}

在提交时检查这些表单字段中是否有任何数据,如果它们确实未能提交表单。理由是,机器人将读取HTML并尝试填充每个表单字段,而人类不会看到输入字段,并让它们单独存在。

显然,你可以做更多的事情来减少这种利用,但这只是一个基本概念。