看起来我们将为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:我知道这种方法很容易受到直接攻击,就像我在博客上提到的那样。然而,它将防御你的平均垃圾邮件机器人盲目提交垃圾的任何形式,它可以找到。
Make an AJAX query for a cryptographic nonce to the server. The server sends back a JSON response containing the nonce, and also sets a cookie containing the nonce value. Calculate the SHA1 hash of the nonce in JavaScript, copy the value into a hidden field. When the user POSTs the form, they now send the cookie back with the nonce value. Calculate the SHA1 hash of the nonce from the cookie, compare to the value in the hidden field, and verify that you generated that nonce in the last 15 minutes (memcached is good for this). If all those checks pass, post the comment.
This technique requires that the spammer sits down and figures out what's going on, and once they do, they still have to fire off multiple requests and maintain cookie state to get a comment through. Plus they only ever see the Set-Cookie header if they parse and execute the JavaScript in the first place and make the AJAX request. This is far, far more work than most spammers are willing to go through, especially since the work only applies to a single site. The biggest downside is that anyone with JavaScript off or cookies disabled gets marked as potential spam. Which means that moderation queues are still a good idea.
从理论上讲,这可以作为通过模糊性的安全,但在实践中,这是很好的。
我从未见过垃圾邮件发送者试图破解这种技术,尽管可能每隔几个月我就会收到一个手动输入的主题垃圾邮件条目,这有点怪异。
在目前的概念中,CAPTCHA是不完善的,而且经常很容易被绕过。现有的解决方案没有一个是有效的——GMail最多只有20%的成功率。
实际情况要糟糕得多,因为这个统计数据只使用了OCR,还有其他方法可以绕过它——例如,CAPTCHA代理和CAPTCHA农场。我最近在OWASP做了一个关于这个主题的演讲,但是ppt还没有上线…
虽然CAPTCHA不能以任何形式提供实际的保护,但如果你想要阻止随意路过的垃圾,它可能足以满足你的需求。但它甚至无法阻止半专业的垃圾邮件发送者。
通常,对于一个有价值的资源需要保护的网站,你需要三个方面的方法:
限制来自认证用户的回复,不允许匿名帖子。
最小化(而不是阻止)来自认证用户的少数垃圾帖子-例如基于声誉的。人工版主在这里也可以提供帮助,但随后你会遇到其他问题——即充斥(甚至淹没)版主,而一些网站更喜欢开放……
使用服务器端启发式逻辑来识别类似垃圾邮件的行为,或者更好的非人类行为。
验证码可以在第二个方面提供一点帮助,只是因为它改变了经济状况——如果其他方面都到位了,那么为了在如此少量的垃圾邮件中成功突破验证码(最低成本,但仍然是成本)就不再值得了。
同样,不是所有的垃圾邮件(和其他垃圾邮件)都是计算机生成的-使用CAPTCHA代理或农场坏人可以让真人发送垃圾邮件给你。
验证码代理是指他们将你的图像提供给其他网站的用户,如色情网站、游戏网站等。
验证码农场有很多廉价的劳动力(印度、远东等)来解决这些问题……通常每1000个验证码解决2-4美元。最近在Ebay上看到了这个帖子……