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

想法吗?


当前回答

你不只是想让人类发帖。你需要能够讨论编程主题的人。所以你应该有一个验证码,比如:

下面的C函数声明是什么意思:char *(*(**foo [][8])())[];?

=)

其他回答

在实现前面提到的蜜罐验证码方法后,我们的表单垃圾邮件已经大幅减少。我相信自从实施以来,我们还没有收到任何通知。

我真的很喜欢这个网站上使用的验证码方法:http://www.thatwebguyblog.com/post/the_forgotten_timesaver_photoshop_droplets#commenting_as

验证码过滤器的一个理论想法。向用户提出一个服务器可以简单回答的问题,用户也可以回答。共享答案成为用户和服务器都知道的一种公钥。

Stack Overflow的相关示例:

用户XYZ有多少声誉点?

提示:查看屏幕侧面的信息,或者点击这个链接。 用户可以从已知的堆栈溢出用户中随机抽取。

一个更一般的例子: 你住在哪里? 你住的地方星期六九点天气怎么样? 提示:使用雅虎天气,并提供湿度和一般条件。

然后用户输入他们的答案

西雅图 部分多云,湿度85%

计算机证实确实是西雅图当时的天气状况。

答案对用户来说是唯一的,但服务器有一种查找和确认答案的方法。

问题的类型可以多种多样。但其思想是,您对人类必须查找的事实组合进行一些处理,服务器可以简单地进行查找。这个过程是一个两部分的对话,需要一定程度的相互理解。这是一种反向转弯测试。让人类证明它可以提供可计算的数据,但它需要人类的知识来产生可计算的数据。

另一种可能的实现。你叫什么名字,什么时候出生的?

人会提供一个已知的答案,计算机可以在数据库中查找信息。

也许一个数据库可以由一个机器人来填充,但机器人需要一些智能来把相关的事实放在一起。服务器端的数据库或查找表可以被系统地删除明显的垃圾信息,如属性。

I am sure that there are flaws and details to be worked out in the implementation. But the concept seems sound. The user provides a combination of facts that the server can lookup, but the server has control over the kind of combinations that should be asked. The combinations could be randomized and the server could use a variety of strategies to lookup the shared answer. The real benefit is that you are asking the user to provide some sort of profiling and revelation of themselves in their answer. This makes it all the more difficult for bots to be systematic. A bunch of computers start using the same answers across many servers and captcha forms such as

我是1972年下午3:45出生的机器人。

然后,这种响应可以被整个网络分析和使用,以阻止机器人,有效地使自动化在几次迭代后变得毫无价值。

As I think about this more it would be interesting to implement a basic reading comprehension test for commenting on blog posts. After the end of a blog post the writer could pose a question to his or her readers. The question could be unique to each blog post and it would have the added benefit of requiring users to actually read before commenting. One could write the simple question at the end of a post with answers stored server side and then have an array of non sense questions to salt the database.

这篇文章谈到紫色验证码技术了吗? 服务器端回答(false, no)

这篇文章是关于验证码的吗? 服务器端回答(是,是)

这篇文章是关于迈克尔·杰克逊的吗? 服务器端回答(false, no)

以随机的顺序提出几个问题,并使这个顺序有意义,这似乎很有用。例如,上面的would = no, yes, no。打乱顺序,问一些无意义的问题,答案是“不是”和“是”。

在目前的概念中,CAPTCHA是不完善的,而且经常很容易被绕过。现有的解决方案没有一个是有效的——GMail最多只有20%的成功率。

实际情况要糟糕得多,因为这个统计数据只使用了OCR,还有其他方法可以绕过它——例如,CAPTCHA代理和CAPTCHA农场。我最近在OWASP做了一个关于这个主题的演讲,但是ppt还没有上线…

虽然CAPTCHA不能以任何形式提供实际的保护,但如果你想要阻止随意路过的垃圾,它可能足以满足你的需求。但它甚至无法阻止半专业的垃圾邮件发送者。

通常,对于一个有价值的资源需要保护的网站,你需要三个方面的方法:

限制来自认证用户的回复,不允许匿名帖子。 最小化(而不是阻止)来自认证用户的少数垃圾帖子-例如基于声誉的。人工版主在这里也可以提供帮助,但随后你会遇到其他问题——即充斥(甚至淹没)版主,而一些网站更喜欢开放…… 使用服务器端启发式逻辑来识别类似垃圾邮件的行为,或者更好的非人类行为。

验证码可以在第二个方面提供一点帮助,只是因为它改变了经济状况——如果其他方面都到位了,那么为了在如此少量的垃圾邮件中成功突破验证码(最低成本,但仍然是成本)就不再值得了。

同样,不是所有的垃圾邮件(和其他垃圾邮件)都是计算机生成的-使用CAPTCHA代理或农场坏人可以让真人发送垃圾邮件给你。


验证码代理是指他们将你的图像提供给其他网站的用户,如色情网站、游戏网站等。

验证码农场有很多廉价的劳动力(印度、远东等)来解决这些问题……通常每1000个验证码解决2-4美元。最近在Ebay上看到了这个帖子……

@lance

谁说每个请求都必须在服务器上创建所有映像?也许你可以有一个静态的图片列表,或者从Flickr中获取它们。我喜欢“点击小猫”验证码的想法。http://www.thepcspy.com/kittenauth。

如果从静态图像列表中提取,绕过CAPTCHA就变得很简单,因为人类可以对它们进行分类,然后机器人就可以轻松地回答这些挑战。即使机器人不能回答所有问题,它仍然可以发送垃圾邮件。它只需要能够回答一小部分的验证码,因为当尝试失败时,它总是可以重试。

这实际上也是谜题的问题,因为拥有大量挑战是非常困难的。