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

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个回答

211

我最喜欢的验证码:链接

验证码


13
那个很棒。该网站的链接是http://random.irb.hr/signup.php。有时候这样做会更容易。 - Marcio Aguiar
22
问题在于,对于大多数人来说这很困难,但计算机通常不会有问题。 - Tim Matthews
7
我认为那个问题的答案是-3? - dancavallaro
28
-3看起来是正确的。我记得一段时间以前使用这个网站进行研究时,当遇到验证码时感到非常开心,因为它很有趣且与众不同。它是用实际的放射性衰变源来访问量子随机数生成器的。 - Alex
2
@therefromhere - 我认为这种CAPTCHA并不普遍,没有必要花太多力气去做OCR、购买Mathematica等等。 :-) - ceejayoz
显示剩余7条评论

205

我开发的一种方法 看起来非常完美(尽管我可能没有像你一样遭受大量的评论垃圾邮件),它是在表单中添加一个隐藏域并将其填充为虚假值,例如:

<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: 我知道这种方法容易遭到直接攻击,就像我在我的博客中提到的那样。但是,它将保护免受大多数垃圾邮件机器人自动提交内容的干扰。


45
如果您使用ASP等技术并在表单页面加载时添加时间戳,然后将其与表单提交时的时间进行比较,那怎么样呢?如果ElapsedTime<10秒,则很可能是垃圾邮件。 - Clay Nichols
28
如果恶意用户愿意查看,那很明显是可以绕过的。虽然我相信你已经意识到这一点,但我猜你认为他们不会费心...如果这个网站没有任何价值,那么你是对的,他们不会费心——但如果有价值,那么他们会轻而易举地绕过它。 - AviD
48
这是我使用的变化。将隐藏值设为加密后的当前时间。在回传时,验证经过了10秒到10分钟之间的时间。这可以防止欺诈者试图插入一些始终有效的值。 - Tim Scott
7
对于那些指出机器人可以通过的人......我知道,因为我在答案中已经指出了。这是一种非常简单的方法,用于防止普通机器人和无聊的用户。我目前正在我的博客上使用它,到目前为止,它已经100%成功。 - GateKiller
8
我认为最好从易于绕过的测试开始,以确定它们是否充分。 - pbreitenbach
显示剩余8条评论

57

如果我没有遗漏什么,使用reCAPTCHA有何不妥。因为所有的工作都在外部完成。

这只是一个想法。


17
重新验证(Re-captcha)对用户不友好。验证码(Captcha)已经很糟糕了。但是为了获得一些微小的OCR(光学字符识别技术)优势而使用户感到更加困难,这是极其不友好的。 - pbreitenbach
19
为什么它对用户不友好?垃圾邮件是否用户友好? - Elzo Valugi
14
有时候,验证码的图片即使对人类来说也难以解读,这会给合法用户带来沮丧感,因此它是对用户不友好的。您可以查看Josh提供的最糟糕验证码链接,了解一些过于难以解读的图片的例子。 - Andrei Fierbinteanu
4
如果 reCAPTCHA 太难了,你可以让它加载另一张图片。 - mhitza
23
reCAPTCHA 是很好的,而且它还实现了一个较少有自己开发的解决方案考虑的无障碍选项。 - alxp
显示剩余4条评论

42
这种方法的优点是,对于大多数人来说,验证码永远不会出现!我喜欢这个想法,我们难道不能直接钩入声望系统吗?我的意思是,任何拥有100分以上声望的人很可能是人类。所以,如果他们已经有了声望,你甚至不需要在CAPTCHA方面做任何事情。然后,如果他们不是,再发送它,我相信不需要太多帖子就能达到100分,社区会立即对任何试图使用冒犯性标签的用户进行打击,为什么不添加一个“报告垃圾邮件”的链接,将其下调200分呢?得到三个这样的链接,就可以解锁垃圾邮件机器人成就,再见了:)编辑:我还应该补充一点,我喜欢非图片CAPTCHA的数学思路。或者也可以用一些简单的谜语之类的东西。这可能会让发帖更有趣^_^

13
如果高声望会员的帐户凭证被盗,会发生什么? - James McMahon
20
@nemo 那你就处理它吧,但仅因这个理由而避免解决方案是没有太多道理的。 - pbreitenbach
因为每个人都会看到垃圾邮件和高声望,并知道账户已被盗。 - hamstar

37

4
蜜罐验证码的解释(看起来非常好): 机器人喜欢表单,它们填写所有字段。蜜罐验证码包括一个被CSS隐藏的字段,因此只有机器人(和使用IE 3.0的用户)才能看到它。如果它被填写了,那么就是机器人。实现起来非常容易。 - Clay Nichols
5
再次强调,只需极少的时间和投资就可以轻松绕过此类安全措施。确实,这样做可以防止一些脚本小子的攻击,但如果您的网站具有价值,那么这并不是您主要面临的威胁。 - AviD
蜜罐验证码对可用性不利 - 屏幕阅读器将不会忽略隐藏的表单字段。 - Bayard Randel
是的,这个部署简单且运行非常好。可访问性是唯一的真正问题。 - meme
6
可通过添加一些文本轻松绕过无障碍性控制:“嘿,如果你是人,请将此字段留空!” - Strae
当我在我的网站上设置这个时,我觉得自己很聪明,但看起来我肯定不是第一个想到这个点子的人!这可以大大减少随意垃圾邮件的数量。显然,它不会捕捉所有的垃圾邮件,但每添加一个过滤器都会提高一点门槛。 - Doug Kavendek

30
避免使用有史以来最糟糕的验证码
引用:

小问题还好,但你需要自己写每个问题 :-(

某人需要写它们。

您可以像ReCaptcha一样打印单词一样制作小问题。 它提供两个单词,其中一个它知道答案,另一个它不知道 - 在第二个问题的足够回答之后,它现在也知道了答案。 提出两个小问题:

女人需要男人就像鱼需要什么?

橙色橙色橙色。 输入绿色。

当然,这可能需要与其他技术(例如计时器或计算机密钥)配合使用。 需要轮换/撤下问题,因此为了保持问题的供应,您可以临时添加:

输入您的明显问题:

您甚至不需要答案; 其他人将为您解决这个问题。 您可能需要允许标记问题为“太难”,例如:“asdf ejflf asl;jf ei;fil;asfas”。

现在,为了减缓运行StackOverflow游戏机器人的人,您需要按IP地址旋转问题 - 因此,在所有问题都用完之前,相同的IP地址不会得到相同的问题。 这会减慢构建已知问题字典的速度,迫使机器人的人类所有者回答您的所有小问题。


14
请注意小问题的提问,因为这些问题对你来说可能很容易,但对于那些没有掌握英语或来自不同文化背景的人来说可能会非常困难。如果你强迫他们只用字典登录,他们可能会感到沮丧!更糟糕的是,他们可能会停止使用该网站。 - ya23
14
“A woman needs a man like a fish needs a bicycle.” 这句话的意思是女人不需要男人来生活,就像鱼不需要自行车一样。 - Lotus Notes
2
自行车。Irina Dunn所说的话(由Gloria Steinem普及)。 - webbiedave
9
像鱼需要母鱼一样。 - matt lohkamp

27

我曾在一个朋友的网站上看到过这个东西。他正在以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'   

2
+1,虽然我不认为你应该为这样的东西付费。我宁愿从头开始构建它。 - user29053
5
好的,但为了盲人也需要一个口头版本。 - pro
29
问题在于,相较于图片来说,这种方式更容易被破解。你只需要将其转换成图片,就能得到一张完美的黑白图像,可以进行OCR识别。 - Andrei Krotkov
@Andrei,这个有另一种版本,是使用“figlet”生成的,可以将字符“mush”在一起,使captcha的字符共享ASCII字符。 这些比较难以进行OCR扫描。 - Pasi Savolainen
58
这可能是广告,但a)它是对问题的有效回答,b)作者明确指出这是他朋友的建议(这意味着他明确表明有偏见),所以我认为这个回答没有任何问题。 - Michael Stum

27

CAPTCHA(全自动区分计算机和人类验证码)在其当前的概念化中已经失效,很容易被绕过。目前没有一种现有的解决方案能够有效地起到作用 - Gmail 最好只有 20% 的成功率。

实际情况比这还要糟糕,因为这个统计数据仅使用了 OCR 技术,还有其他的绕过方法 - 例如 CAPTCHA 代理和 CAPTCHA 网站。我最近在 OWASP 上就这个主题发表了演讲,但 ppt 还没有发布到网上...

虽然 CAPTCHA 不能提供任何形式的实际保护,但如果您想要阻止随意驱逐垃圾,它可能已经足够了。但是它无法阻止半专业垃圾邮件发送者。

通常,对于拥有任何价值保护资源的网站,您需要采取三重方法:

  • 限制只允许来自已认证用户的响应,禁止匿名帖子。
  • 最小化(而不是预防)认证用户发出的少量垃圾邮件 - 基于声誉等级的方法。人类审核员也可以帮助这里,但是您会遇到其他问题 - 例如洪水般的垃圾邮件和一些网站更喜欢开放性...
  • 使用服务器端启发式逻辑来识别类似垃圾邮件的行为,或者更好地识别非人类行为。

在第二个方法中,CAPTCHA 可以帮助一点点,仅仅因为它改变了计算成本 - 如果其他两重方法都已经就位,攻破 CAPTCHA 不再值得去做(这是一种最小的成本,但仍然需要成本)。

同样,您的所有垃圾邮件(和其他垃圾)并不全是由计算机生成 - 使用 CAPTCHA 代理或网站,坏人可以让真正的人类向您发送垃圾邮件。


CAPTCHA 代理是指他们将您的图片提供给其他网站的用户,例如色情网站、游戏等。

CAPTCHA 网站可以雇佣许多便宜的劳工(印度、远东等)来解决问题...通常每 1000 个 CAPTCHA 的解决费用在 2-4 美元之间。最近在 eBay 上看到了这方面的招聘信息...


代理和刷号不会破解或绕过“验证码”因为它们被人类解决。实际上,它们的存在正是证明当前的方法有效!验证码并不仅意味着“我想要的提交类型”,而是“是否有人提交”。 - Fraser
10
没错!但是验证码通常用于防止“机器人”——无论这些机器人是否是由人类创建的,它们的目的都是防止大规模、非个人化使用。这恰恰证明了我的观点,即验证码解决了错误的问题(而且做得很糟糕)... - AviD
有很多情况下验证码是可以接受的。关键是网站所有者应该选择一个平衡用户体验和控制的解决方案。对于某些人来说,不需要验证码。对于其他人来说,需要验证码。对于还有一些人来说,则需要其他的解决方案。但是完全忽略验证码并不明智。 - pbreitenbach
1
问题源于认为添加验证码就可以获取控制权。但实际上并不能。完全没有任何实质性的帮助。确实有一些罕见情况下,它可以提供一些价值,但并不是"控制"。 (我经常在这里提到验证码,连同其他机制一起为防止垃圾邮件提供额外的小帮助。) - AviD

27
所以,CAPTCHA对所有用户都是必须的,除了管理员。[1]这太愚蠢了。因此会有一些用户可以编辑站点上的任何帖子,但是不能在没有CAPTCHA的情况下发布帖子吗?如果你有足够的声望来贬低帖子,则有足够的声望可以在没有CAPTCHA的情况下发布帖子。如果必须的话,可以增加门槛。此外,还有许多可以使用的垃圾邮件检测方法,即使对于未注册用户,也永远不需要填写那些该死的CAPTCHA表格。

26

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