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

想法吗?


当前回答

这将是每次注册,而不是每次发布,对吧?因为这只会杀死站点,即使使用jQuery自动化。

其他回答

修正语法错误的验证码:

echo "Hello, world!;
for (int $i = 0; $i < 10; $i ++ {
  echo $i /*
}

括号和引号被随机移除。

机器人可以自动检查语法错误,但他们不知道如何修复它们!

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

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

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

然后使用CSS隐藏它们:

.hideme {
    display: none;
}

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

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

虽然我们都应该知道基本的数学,但这个数学难题可能会引起一些困惑。在你的例子中,我相信有些人会回答“8”而不是“1”。

用粗体或斜体突出显示随机字符的简单文本字符串是否合适?用户只需要输入粗体/斜体字母作为验证码。

例如ssdfatwerweajhcsadkoghvefdhrffghlfgdhowfgh

在这种情况下,“堆栈”将是验证码。 显然,这个观点有很多不同的版本。

编辑:解决与此想法相关的一些潜在问题的示例变体:

使用随机颜色的字母代替粗体/斜体。 使用每秒钟红色字母作为验证码(减少机器人识别不同格式的字母来猜测验证码的可能性)

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

避免最糟糕的验证码。

琐事是可以的,但你必须把它们都写出来:-(

总得有人来写。

你可以用ReCaptcha打印单词的方式来回答一些琐事问题。它提供了两个单词,其中一个它知道答案,另一个它不知道——在第二个单词的答案足够多之后,它现在也知道了那个单词的答案。问两个小问题:

女人需要男人,就像鱼需要鱼一样。

橙色橙色橙色橙色。绿色的类型。

当然,这可能需要与其他技术相结合,例如计时器或计算秘密。问题需要轮换/退出,所以为了保持问题的供应,你可以特别添加:

进入你显而易见的问题:

你甚至不需要答案;其他人会帮你弄清楚的。你可能要允许把问题标记为“太难了”,比如这个:“asdf ejflf asl;jf ei;fil;asfas”。

现在,为了让正在运行StackOverflow游戏机器人的人慢下来,你可以根据IP地址旋转问题-所以相同的IP地址不会得到相同的问题,直到所有的问题都耗尽。这减慢了构建已知问题字典的速度,迫使机器人的人类所有者回答你所有的琐事问题。