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

想法吗?


当前回答

如果没有一个真正的验证码作为第一道防线,你是不是仍然容易受到垃圾邮件发送者编写浏览器脚本的攻击(使用VB和IE很简单)?即加载页面,浏览DOM,点击提交按钮,重复…

其他回答

我的解决方案是将表单放在一个单独的页面上,并将时间戳传递给它。在该页上,我只在时间戳有效的情况下显示表单(不要太快,也不要太旧)。我发现机器人总是会直接点击提交页面,只有人类才能正确导航。

不会工作,如果你有内容页本身的形式,就像你现在做的,但你可以显示/隐藏链接到基于NoScript的特殊提交页面。对于这么小比例的用户来说,这是一个小小的不便。

在我的博客上,除非有javascript,否则我不接受评论,而是通过ajax发布评论。它把所有的机器人挡在外面。我收到的唯一垃圾邮件来自人类垃圾邮件发送者(他们通常从站点复制并粘贴一些文本来生成评论)。

如果你必须要有一个非javascript版本,可以这样做:

下面字符串[y]中[x]的[某些操作]

给定一个足够复杂的[x]和[y],无法用正则表达式求解,那么编写解析器就很难了

数一下[dog,dangerous,danceable,cat]中短单词的个数= 2

在[dog,dangerous,danceable,catastrophe] = dog中最短的单词是什么

哪个单词以x结尾,[fish,mealy,box,stackoverflow] = box

在[apple.com, stackoverflow.com, fish oil.com] = fish oil.com中,哪个url是非法的

所有这些都可以在服务器端轻松完成;如果选项的数量足够大,并且频繁轮换,那么就很难获得所有选项,再加上永远不要每天给同一用户相同类型的内容超过一次

我曾经在一个朋友的网站上看到过这个。他卖了20美元。这是ASCII艺术!

http://thephppro.com/products/captcha/

  .oooooo.         oooooooo 
 d8P'  `Y8b       dP""""""" 
888      888     d88888b.   
888      888 V       `Y88b '
888      888           ]88  
`88b    d88'     o.   .88P  
 `Y8bood8P'      `8bd88P'   

我认为一个定制的验证码是你最好的选择。这种方法需要一个专门针对机器人/脚本来破解它。这种努力因素应该会减少尝试的次数。人类毕竟是懒惰的

我确信大多数页面都是使用支持鼠标悬停的控件(按钮、链接等)构建的。

不是显示图像并要求用户输入内容,而是要求用户将鼠标移动到任意控件(以随机顺序选择控件(任何按钮或链接))。 并将颜色应用到控件(一些随机的颜色)上鼠标(小JavaScript做的伎俩).. 然后让用户在鼠标上输入他/她所看到的颜色。

这只是一种不同的方法,我并没有实现这个方法。但这是可能的。