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

想法吗?


当前回答

虽然类似的讨论开始了:

我们正在一个经常进行数据挖掘的应用程序上尝试这个解决方案:

一个更好的验证码控制(看妈-没有图像!)

你可以在我们的建筑检查搜索中看到它的作用。

您可以查看Source并看到CAPTCHA只是HTML。

其他回答

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

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

使用样式化的HTML元素(如div)来显示验证码怎么样?从矩形区域中构造字母很容易,但很难分析它们。

这种方法的优点是,对于大多数人来说,CAPTCHA永远不会可见!

我喜欢这个主意,难道我们就不能直接加入代表系统吗?我的意思是,任何拥有100 + rep的人都有可能是人类。所以如果他们有代表,你甚至不需要在验证码方面做任何事情。

然后,如果他们不是,然后发送它,我相信它不会花那么多帖子到100,社区会立即扑向任何似乎是带有攻击性标签的垃圾邮件,为什么不添加一个“报告垃圾邮件”链接,降低200?获得3个,垃圾邮件成就解锁,再见;)

编辑:我还应该补充一点,我喜欢非图像验证码的数学想法。或者是一个简单的谜语类型的东西。可能会让帖子更有趣^_^

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

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

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

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

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

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

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


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

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

如果你倾向于问题/答案解决方案,我曾经向用户展示了3-5个随机问题,他们可以从中选择,然后回答来证明他们是人类。该列表在每次页面加载时排序不同。