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

想法吗?


当前回答

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

其他回答

我开发的一个方法,似乎工作得很完美(虽然我可能不会像你一样收到那么多评论垃圾邮件),是有一个隐藏字段,并填充一个虚假的值,例如:

<input type="hidden" name="antispam" value="lalalala" />

然后,我有一段JavaScript,它每秒更新的值与页面已加载的秒数:

var antiSpam = function() {
        if (document.getElementById("antiSpam")) {
                a = document.getElementById("antiSpam");
                if (isNaN(a.value) == true) {
                        a.value = 0;
                } else {
                        a.value = parseInt(a.value) + 1;
                }
        }
        setTimeout("antiSpam()", 1000);
}

antiSpam();

然后当表单提交时,如果反垃圾邮件值仍然是“lalalala”,那么我将其标记为垃圾邮件。如果反垃圾邮件值是整数,我会检查它是否大于10(秒)。如果低于10,我把它标记为垃圾邮件,如果超过10,我就让它通过。

If AntiSpam = A Integer
    If AntiSpam >= 10
        Comment = Approved
    Else
        Comment = Spam
Else
    Comment = Spam

理论是:

垃圾邮件机器人不支持JavaScript,只提交它看到的内容 如果机器人支持JavaScript,它会立即提交表单 评论者在发帖前至少阅读了一些页面内容

这种方法的缺点是它需要JavaScript,如果您没有启用JavaScript,您的评论将被标记为垃圾邮件,但是,我确实会查看标记为垃圾邮件的评论,所以这不是问题。

回应评论

@MrAnalogy:服务器端方法听起来是一个很好的想法,和在JavaScript中完全一样。良好的电话。

@AviD:我知道这种方法很容易受到直接攻击,就像我在博客上提到的那样。然而,它将防御你的平均垃圾邮件机器人盲目提交垃圾的任何形式,它可以找到。

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

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

例如ssdfatwerweajhcsadkoghvefdhrffghlfgdhowfgh

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

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

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

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

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

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

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

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

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

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


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

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

验证码检查你是人还是电脑。 问题是,在那之后,计算机需要判断你是否是人类。

因此,一个解决方案是让一个用户填写CAPTCHA,让下一个用户检查它。 问题当然是时间差距。

Asirra是史上最可爱的验证码。