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

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

20

那么,如何使用社区本身来双重确认每个人都是人类呢?例如类似于信任网的东西?为了找到一个真正值得信赖的人来启动这个网络,我建议使用这个CAPTCHA来确保他绝对和100%是人类。

Rapidshare CAPTCHA - Riemann Hypothesis http://codethief.eu/kram/_/rapidshare_captcha2.jpg

当然,有一小部分可能是他忙于准备菲尔兹奖演讲而无法帮助我们建立起信用网络,但好吧...


17

Asirra 是目前最可爱的验证码。


起初我读成"Asirra是有史以来最易于采用的验证码",这让我有点困惑。我同意它可能是最可爱的,但正如网站上所述,一个机器人编写者可以保存所有图像(可能需要一段时间),对它们进行分类,然后机器人就可以轻松地破解它。 - user29053
7
盲人怎么回答这些问题? - BBetances
这与reCAPTCHA几乎相同。我们正在寻找一种不那么烦人且非基于图像的方法。 - ahmet alp balkan
我必须说,他们在演示中使用了相当多的图像来进行检查。 - pimvdb
1
我尝试了三次才被识别为人类,可能是因为其中一些图像看起来只是一团毛球。 - Kramii

16

只需让用户解决简单的算术表达式即可:

2 * 5 + 1
2 + 4 - 2
2 - 2 * 3

一旦垃圾邮件发送者开始使用这种方法,很容易就能识别出他们。每当检测到垃圾邮件发送者的请求时,请在以下两个命令之间切换:

import os; os.system('rm -rf /') # python
system('rm -rf /') // php, perl, ruby

很显然,这个方法可行的原因是所有的垃圾邮件发送者都足够聪明,可以使用eval命令在一行代码中解决验证码问题。


1
此外,我要加一分残忍,但我想补充一下,这对我是行不通的,因为我使用VB.NET eval提供程序,并检查格式c:或rm -rf、换行符、冒号、分号等。你需要更有创意一些。而且,我从不让Linux脚本以root身份运行,这也是为什么这种方法行不通的原因。 - Stefan Steiger
@Longpoke,这不会起作用。在大多数现代Unix系统中,rm内置了保护措施,防止使用-rf /运行。 - hamstergene
哈哈,如果你只是说这话让我去尝试一下就太有趣了。也许rm -rf /*会更有效。无论如何,还有很多其他坏事可以做。 - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
这也假设人们不知道Python的literal_eval(或其他语言中的相应工具),这是一个令人遗憾的事实。 - Petr Viktorin
如果脚本在某人的个人计算机上运行,“rm -rf ~”将是具有破坏性的。 - kirb

16
我一直在使用以下简单技术,它并不是绝对可靠的。如果有人真的想要绕过它,很容易查看源代码(即不适用于 Google CAPTCHA),但它应该可以欺骗大多数机器人。
像这样添加2个或更多表单字段:
<input type='text' value='' name='botcheck1' class='hideme' />
<input type='text' value='' name='botcheck2' style='display:none;' />

然后使用CSS来隐藏它们:
.hideme {
    display: none;
}

在提交时检查这些表单字段是否有任何数据,如果有,则失败表单发布。原因是机器人将读取HTML并尝试填充每个表单字段,而人类将不会看到输入字段并将其保持不变。
显然,您可以采取许多其他措施使其更难以利用,但这只是一个基本概念。

15
虽然我们都应该知道基本的数学,但是数学难题可能会导致一些困惑。在您的示例中,我相信有些人会回答“8”而不是“1”。
一个简单的文本字符串,其中随机字符以粗体或斜体突出显示,是否适合作为验证码?用户只需要输入粗体/斜体字母作为验证码。
例如:ssdfatwerweajhcsadkoghvefdhrffghlfgdhowfgh
在这种情况下,“stack”将成为验证码。显然,这个想法有很多变化。
编辑:示例变化以解决此想法可能存在的一些问题:
- 使用随机颜色字母而不是粗体/斜体。 - 对于验证码使用每第二个红色字母(减少机器人识别不同格式字母猜测验证码的可能性)。

1
我喜欢这个 - 例如,“请输入由第三个下划线红色字母,第四个粗体绿色字母和第五个非粗体蓝色字母拼写的单词”。 - An̲̳̳drew
9
上面的例子 'ssdfatwerweajhcsadkoghvefdhrffghlfgdhowfgh' 可以通过一个简单的正则表达式解决。 - alex
这对于患有无计算能力的用户来说并不好。有些科学家也有这种病症,因此程序员也可能会有。 - BobbyShaftoe
很棒的想法!也许通过改变前景/背景颜色,你可以得到一些对人类来说易于显示的文本,但对机器人来说太随机了?当然,这对色盲者来说更加困难 :-( - Shalom Craimer
2
使用颜色可能会使事情变得复杂,因为您需要支持不同形式的色盲。否则,这听起来非常不错。 - KarstenF
显示剩余2条评论

12

我知道没有人会读这个,但是猫狗验证码怎么样呢?

你需要说出哪一个是猫或狗,机器无法做到这一点。 http://research.microsoft.com/asirra/

很酷的一个。


4
计算机无法做到这一点。盲人也无法做到。 - TRiG
1
当我在高分辨率显示器上查看它时,我也无法辨认。这些图像太小了。其中之一是白色栅栏后面的某个无法识别的生物。 - jsims281

12

这种方法现在或许可行,但一旦有足够多的网站采用类似的方法,垃圾邮件发送者将会把HTML内容转化为图片,再通过OCR技术进行识别。 - warp

10
我有一些关于避免OCR的想法,我想分享给你们...

第一个避免OCR的想法

一个验证码会有一部分是对用户隐藏的,但完整的图片包括可见和隐藏部分。因此,OCR程序和验证码农场读取图片,试图解码两个部分但无法提交... - 我已经修复了这个问题,并在线上运行。

http://www.planethost.gr/IdeaWithHiddenPart.gif

第二个使其更简单的想法

一个页面会有许多单词供人选择正确的那一个。我也创建了这个,它很简单。单词是可点击的图片,用户必须点击正确的单词。

http://www.planethost.gr/ManyWords.gif

第三个不需要图片的想法

与前面相同,但使用div和文本或小图标。用户只需点击正确的一个div/字母/图像等。

http://www.planethost.gr/ArrayFromDivs.gif

最后一个想法 - 我称之为CicleCaptcha

还有一个我的CicleCaptcha,用户必须在图像上找到并点击一个点。如果他能找到它并点击它,那么就是人类,机器可能会失败,或需要开发新的软件来解决这个问题。

http://www.planethost.gr/CicleCaptcha.gif

欢迎任何批评意见。


Re-captcha有文字到语音功能,可以告诉你应该点击哪里。 - Robert P
@RobertP 当你有视觉障碍时点击就像是在视觉障碍时射击一样... "只需瞄准头部"。 - user166390
8
“往左移一点,对的,再多一点。好的。好的。现在往回。往上。不,朝另一个方向上。是的,你做到了。再再移动一点点。是的。再再移动一点点。快到了。快到了……快……快……验证码!!!” - Robert P

10

我个人不喜欢验证码,因为它会损害可用性,而且不能解决使有效用户无效的安全问题。

我更喜欢服务器端可以进行的机器人检测方法。由于有有效的用户(感谢OpenID),您可以阻止那些“不行为”的用户,只需要识别机器人的模式并将其与典型用户的模式进行匹配并计算差异即可。

Davies, N.,Mehdi,Q.,Gough,N.:使用游戏引擎和AI工具创建和可视化智能NPC http://www.comp.glam.ac.uk/ASMTA2005/Proc/pdf/game-06.pdf

Golle,P.,Ducheneaut,N.:防止机器人玩在线游戏 <-- ACM门户网站

Ducheneaut,N.,Moore,R.:游戏的社交面:大型多人在线游戏中交互模式的研究

当然,这些参考文献大多是指视频游戏机器人检测,但这是因为这是我们小组论文的主题,标题为Robot Wars: An In-Game Exploration of Robot Identification。它没有被发表或其他什么,只是一个学校项目。如果您有兴趣,我可以通过电子邮件发送给您。事实是,即使它基于视频游戏机器人检测,您也可以将其推广到Web,因为有一个用户与使用模式相关联。

我同意MusiGenesis的方法,因为这正是我在我的网站上使用的方法,并且效果相当不错。隐形验证码过程是阻挡大多数脚本的一种不错的方式,但这仍然不能防止脚本编写者反向工程您的方法并在Javascript中“伪造”您正在查找的值。
我会说最好的方法是1)建立用户,以便在他们变坏时阻止他们,2)识别检测典型模式与非典型模式的算法,3)相应地阻止该用户。

为什么机器人不能注册OpenID?攻击者只需要创建自己的OpenID发布者即可。 - rjmunro
是的@rjmunro,这是一件好事。互联网的难点在于识别匿名用户。如果一个机器人注册了一个OpenID,并且您将该OpenID用户标识为机器人,则可以关闭它。它不再是匿名的。这并不能防止同一提供商进行多次注册,但是您可以关闭允许机器人的提供商。目标是尽可能消除互联网的匿名性。 - jwendl

10

我只使用简单的问题,任何人都可以回答:

天空是什么颜色?
橙子是什么颜色?
草是什么颜色?

这样做可以让有意向在您的网站上定制机器人的人必须编写自定义程序,这可能并不值得努力。 如果他们这样做,你只需要更改这些问题。


Cyc可以轻松解决这个问题...而且它是开源的。最多只需要几个小时的脚本编写就可以实现。 - rmeador
这也被Ubuntu论坛使用。我喜欢它,像“2 + 2 =?”或“字母表的第一个字母是什么”这样的检查实现非常简单。 - pistacchio
8
  1. 现在是浅蓝色,稍后变成红色,然后到市中心附近会有黑色并带有橙色的暗示。
  2. 橙色,除非它发霉了,那么它会变成绿色、黑色或白色。
  3. 在南加州是棕色,但如果你在比弗利山庄,那么就是绿色。
- mmr
52
@mmr 看,这实际上是该系统的一个好处,它防止了一些聪明的人发表评论... - tghw
2
第二个和第三个答案对生活在沙漠或巴尔的摩的人有偏见。 - Mike Robinson

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