看起来我们将为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:我知道这种方法很容易受到直接攻击,就像我在博客上提到的那样。然而,它将防御你的平均垃圾邮件机器人盲目提交垃圾的任何形式,它可以找到。

其他回答

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

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

=)

我知道没人会读这篇文章,但是狗和猫的验证码呢?

你需要分辨出哪个是猫,哪个是狗,机器做不到。 http://research.microsoft.com/asirra/

是一个很酷的…

简单的文字听起来很棒。贿赂社区来做这项工作!如果您像我一样相信,SO代表积分可以衡量用户帮助网站成功的承诺,那么提供声誉积分来帮助网站免受垃圾邮件发送者的侵害是完全合理的。

Offer +10 reputation for each contribution of a simple question and a set of correct answers. The question should suitably far away (edit distance) from all existing questions, and the reputation (and the question) should gradually disappear if people can't answer it. Let's say if the failure rate on correct answers is more than 20%, then the submitter loses one reputation point per incorrect answer, up to a maximum of 15. So if you submit a bad question, you get +10 now but eventually you will net -5. Or maybe it makes sense to ask a sample of users to vote on whether the captcha questionis a good one.

最后,就像每日信誉上限一样,假设没有用户可以通过提交验证码问题获得超过100个声誉。这是对此类贡献的权重的合理限制,也有助于防止垃圾邮件发送者在系统中植入问题。例如,你可以选择与提交者的声誉成比例的概率而不是相等概率的问题。乔恩·斯基特,请不要提交任何问题。

当我看到一个关于人类计算的视频(该视频是关于如何使用人类通过游戏来标记图像)时,我有了一个想法来构建一个验证码系统。人们可以使用这样的系统来标记图像(可能用于其他目的),然后使用关于标记的统计信息来选择适合验证码使用的图像。

假设有一张图片,90%的人都给它贴上了“猫”或“摩天大楼”的标签。然后可以呈现图像,要求图像最明显的特征,这将是图像的主导标签。

这可能超出了SO的范围,但有人可能会发现这是一个有趣的想法:)

为什么不设置简单的编程问题,用户可以回答他们最喜欢的语言-然后在服务器上运行代码,看看它是否有效。通过在不同的随机文本上运行答案来避免人工验证码农场。

例子: “从- s = hihiuhi@ewfwef.cfwe提取域名”

用Python回答: return = etc."

类似的领域知识,其他子网站。

所有这些都有可以自动测试的标准公式,但使用随机字符串或值进行测试。

显然,这个想法有很多缺陷;)

另外,每5分钟只允许一次登录尝试。