实用的非图像验证码方法?

317

看起来我们将会在Stack Overflow上添加CAPTCHA支持。这是必要的,以防止机器人、垃圾邮件发送者和其他恶意脚本活动。我们只希望人类在这里发布或编辑内容!

我们将使用JavaScript(jQuery)CAPTCHA作为第一道防线:

http://docs.jquery.com/Tutorials:Safer_Contact_Forms_Without_CAPTCHAs

这种方法的优点是,对于大多数人来说,验证码几乎不会出现!
但是,对于禁用 JavaScript 的用户,我们仍需要一个备选方案,这就是棘手之处。
我已经编写了一个 ASP.NET 传统验证码控件,我们可以重复使用。

CaptchaImage

然而,我更喜欢使用文本方式以避免在每个请求中在服务器上创建所有这些图像的开销。
我看到过一些东西,比如:
ASCII文本验证码:\/\/(_)\/\/ 数学难题:7减去3乘以2等于多少?
问答题:蟾蜍和冰棒哪个更好吃?
也许我只是在做无用功,但如果可能的话,我想要一个资源消耗较小、不基于图像且与<noscript>兼容的CAPTCHA。
有什么好的想法吗?

16
无需在服务器上实际创建图像,只需要处理请求即可。例如:<img src="generateImage.aspx?guid=blah">。 - Brian R. Bondy
58
问答题容易存在文化偏见(想象一下法国人回答你的问题...)。此外,可能遇到英语非母语用户。同时,使用暴力破解很容易就能够破解它们(你只有大约2^#_OfQuestions个选项)。 - Adam Matan
72
还有,什么是冰棒? - Fraser
57
根据 Wolfram Alpha 的计算结果,“what is 7 minus 3 times 2” 等于 1。我原以为答案是 8,现在觉得你刚刚发明了反验证码。 - Mike Robinson
50
我认为程序员在日常使用中应该了解运算符优先级。 - Gnark
显示剩余19条评论
103个回答

3

reCAPTCHA 是由大学赞助的,用于帮助数字化图书。

我们生成并检查扭曲的图像,因此您不需要运行昂贵的图像生成程序。


1
我非常不喜欢reCAPTCHA,因为它有一个次要目的,使其主要目的变得更糟。 - pbreitenbach
所以你宁愿浪费时间无所事事,而不是真正帮助别人吗?你最终还是会去找他们的... - RCIX

3
Mixriot.com使用ASCII艺术CAPTCHA(不确定是否是第三方工具)。
 OooOOo  .oOOo.  o   O    oO   
 o       O       O   o     O   
 O       o       o   o     o   
 ooOOo.  OoOOo.  OooOOo    O   
      O  O    O      O     o   
      o  O    o      o     O   
 `OooO'  `OooO'      O   OooOO

真可惜它需要屏幕上如此多的空间,我猜你可以为这段文本大幅减小字体大小... - rohancragg

3

有人还建议使用 Raphael JavaScript 库,它可以在所有流行的浏览器上进行客户端绘制:

http://dmitry.baranovskiy.com/raphael/

但是这并不适用于我的 <noscript> 情况,对吧? :)


3

谁说你必须在每个请求中从服务器上创建所有图像?也许你可以有一个静态的图像列表或者从flickr上获取它们。我喜欢“点击小猫”验证码的想法。http://www.thepcspy.com/kittenauth


2
修复语法错误的验证码:
echo "Hello, world!;
for (int $i = 0; $i < 10; $i ++ {
  echo $i /*
}

括号和引号被随机删除。

机器人可以自动检查语法错误,但它们不知道如何修复它们!


2

使用简单的文本验证码,然后要求用户反向输入答案或只输入第一个字母、最后一个字母或其他随机内容。

另一个想法是制作ASCII图像,例如(来自Portal游戏结尾序列):

                             .,---.
                           ,/XM#MMMX;,
                         -%##########M%,
                        -@######%  $###@=
         .,--,         -H#######$   $###M:
      ,;$M###MMX;     .;##########$;HM###X=
    ,/@##########H=      ;################+
   -+#############M/,      %##############+
   %M###############=      /##############:
   H################      .M#############;.
   @###############M      ,@###########M:.
   X################,      -$=X#######@:
   /@##################%-     +######$-
   .;##################X     .X#####+,
    .;H################/     -X####+.
      ,;X##############,       .MM/
         ,:+$H@M#######M#$-    .$$=
              .,-=;+$@###X:    ;/=.
                     .,/X$;   .::,
                         .,    ..  

并给用户一些选项,例如:是,谎言,心碎,蛋糕。


2
使用类似div的样式化HTML元素来显示验证码怎么样?很容易用矩形区域构建字母,难以分析它们。

2

2

最好的验证码系统是那些滥用计算机科学中的P=NP问题的系统。自然语言问题可能是这些问题中最好、最容易被滥用的问题。任何一个可以通过简单的谷歌搜索和一点点的考察就能回答的问题(例如,“我们太阳系中第二颗行星是什么?”是一个好问题,而“2+2=?”则不是)都是在这种情况下值得考虑的候选问题。


2
一种基于图像的验证码,类似于Ajax Fancy Captcha,不同之处在于您需要根据形状识别拖动和放置,而不是输入图像中包含的字母/数字。

+1根据要求,它避免生成图像。可能不难破解,甚至声称只提供“合理的保护”。但如果你可以接受这一点,它很轻便易安装,特别是如果你已经在使用JQuery。 - rohancragg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接