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

想法吗?


当前回答

我认为文本验证码方法的问题在于文本可以被解析并因此得到回答。

如果你的网站很受欢迎(如Stackoverflow),人们喜欢代码挂在它(如Stackoverflow),很有可能有人会把“打破验证码”作为一个挑战,很容易赢得一些简单的javascript + greasemonkey。

因此,例如,在线程的某个地方建议隐藏彩色字母的方法(确实是一个很酷的想法,想法),可以通过以下示例行简单解析轻松打破:

<div id = "captcha">
 <span class = "red">s</span>
 asdasda
 <span class = "red">t</span>
 asdff
 <span class = "red">a</span>
 jeffwerf
 <span class = "red">c</span>
 sdkk
 <span class = "red">k</span>
</div>

同样,解析这个也很简单:

3 + 4 = ?

如果它遵循模式(x + y)或类似的。

类似地,如果你有一组问题(橙色是什么颜色?比如,白雪公主周围有多少个小矮人?),除非你有成千上万个小矮人,否则你可以从其中挑选30个,生成一个问答散列,然后让脚本机器人重新加载页面,直到找到这30个小矮人中的一个。

其他回答

我的建议是ASCII验证码,它不使用图像,它是程序员/极客。 这是一个PHP实现http://thephppro.com/products/captcha/这是一个付费的。 有一个免费的,也是PHP实现,但我找不到一个例子-> http://www.phpclasses.org/browse/package/4544.html

我知道这些都是在PHP中,但我相信你们这些聪明的家伙构建SO可以“移植”到你最喜欢的语言。

我所知道的一种清除机器人的方法是在用户的cookie中存储一个密钥,如果密钥或cookie不存在,则假设它们是机器人,忽略它们或退回到图像CAPTCHA。这也是一种非常好的方法,可以防止为机器人创建大量会话/跟踪,这些会话/跟踪会给您的数据库添加大量噪音,或增加系统性能的开销。

有史以来最好的验证码!也许你需要像这样的东西来注册,以防止庸人进入。

如果您希望使用基于ascii的方法,可以考虑如何集成FIGlet。你可以制作一些自定义字体,并对每个字符进行一些字体选择随机化,以增加熵。字距调整使文本在视觉上更赏心悦目,也使机器人更难进行逆向工程。

如:

    ______           __     ____               _____          
   / __/ /____ _____/ /__  / __ \_  _____ ____/ _/ /__ _    __
  _\ \/ __/ _ `/ __/  '_/ / /_/ / |/ / -_) __/ _/ / _ \ |/|/ /
 /___/\__/\_,_/\__/_/\_\  \____/|___/\__/_/ /_//_/\___/__,__/ 

令人困惑的一件事是谷歌,显然是世界上拥有最多CS博士的公司,他们的验证码被破坏了,而且似乎没有采取任何措施。