看起来我们将为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>兼容的验证码,如果可能的话。
想法吗?
我会做一个简单的基于时间的验证码。
启用JavaScript:检查后时间减去加载时间大于HUMANISVERYFASTREADER。
禁用JavaScript: HTTP请求开始时间减去HTTP响应结束时间(存储在会话或隐藏字段中)大于HUMANISVERYFASTREADER加上NETWORKLATENCY乘以2。
在任何一种情况下,如果它返回真,那么你重定向到一个图像验证码。
这意味着大多数时候人们不需要使用图像验证码,除非他们的阅读速度非常快,或者垃圾邮件机器人设置为延迟响应。
注意,如果使用隐藏字段,我将为它使用一个随机id名称,以防bot检测到它被用作CAPTCHA并试图修改该值。
另一种完全不同的方法(只适用于JavaScript)是使用jQuery Sortable函数允许用户对一些图像进行排序。也许是一个小的3x3拼图。
我认为文本验证码方法的问题在于文本可以被解析并因此得到回答。
如果你的网站很受欢迎(如Stackoverflow),人们喜欢代码挂在它(如Stackoverflow),很有可能有人会把“打破验证码”作为一个挑战,很容易赢得一些简单的javascript + greasemonkey。
因此,例如,在线程的某个地方建议隐藏彩色字母的方法(确实是一个很酷的想法,想法),可以通过以下示例行简单解析轻松打破:
<div id = "captcha">
<span class = "red">s</span>
asdasda
<span class = "red">t</span>
asdff
<span class = "red">a</span>
jeffwerf
<span class = "red">c</span>
sdkk
<span class = "red">k</span>
</div>
同样,解析这个也很简单:
3 + 4 = ?
如果它遵循模式(x + y)或类似的。
类似地,如果你有一组问题(橙色是什么颜色?比如,白雪公主周围有多少个小矮人?),除非你有成千上万个小矮人,否则你可以从其中挑选30个,生成一个问答散列,然后让脚本机器人重新加载页面,直到找到这30个小矮人中的一个。
简单的文字听起来很棒。贿赂社区来做这项工作!如果您像我一样相信,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个声誉。这是对此类贡献的权重的合理限制,也有助于防止垃圾邮件发送者在系统中植入问题。例如,你可以选择与提交者的声誉成比例的概率而不是相等概率的问题。乔恩·斯基特,请不要提交任何问题。