实用的非基于图像的CAPTCHA方法?


318

看起来我们将在堆栈溢出中添加CAPTCHA支持。这对于防止漫游器,垃圾邮件发送者和其他恶意脚本活动是必要的。我们只希望人类在此处发布或编辑内容!

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

http://docs.jquery.com/教程:Safer_Contact_Forms_Without_CAPTCHAs

这种方法的优点是,对于大多数人来说,CAPTCHA将永远不可见!

但是,对于禁用了JavaScript的人,我们仍然需要一个后备设备,这很棘手。

我已经为ASP.NET编写了一个传统的CAPTCHA控件,可以重复使用。

验证码图片

但是,我宁愿使用一些文本文件,以避免每次请求在服务器上创建所有这些图像的开销。

我看过类似的东西

  • ASCII文本验证码: \/\/(_)\/\/
  • 数学难题:7减去3乘2是什么?
  • 琐事问题:蟾蜍还是冰棒,哪个口味更好?

也许我只是在这里倾斜风车,但<noscript>如果可能的话,我希望有一个资源密集型,基于非图像的兼容验证码。

有想法吗?


16
无需在服务器上实际创建映像。您只需要处理请求。例如<img src =“ generateImage.aspx?guid = blah”>
布赖恩·邦迪

58
琐事问题容易引起文化偏见(例如法国人回答您的问题...)。此外,他们可以解决英语不是母语的用户。而且,可以使用蛮力轻松将其破坏(您只有〜2 ^#_ OfQuestions选项)。
亚当·马坦

72
另外,冰棍到底是什么?
Fraser

57
根据沃尔夫勒姆·阿尔法(Wolfram Alpha)的说法,“ 7乘以3乘以2”就是1。我认为是8。我想您刚刚发明了反验证码。
Mike Robinson 2010年

50
@迈克·罗宾逊:我认为程序员应该知道正常使用日的运算符优先级=)
Gnark

Answers:


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
无需JAVASCRIPT即可运行的版本如果您使用ASP等工具进行此操作,并且具有加载表单页面的时间戳记,然后将该时间戳记与提交表单的时间进行比较,那该怎么办?如果ElapsedTime <10秒,则可能是垃圾邮件。
克莱·尼科尔斯

28
如果恶意用户费心地看一下它,那么显然可以绕开它。虽然我确定您已经意识到了这一点,但我想您是在假设他们不会打扰...好吧,如果这不是一个有价值的网站,那么您是对的,他们不会打扰-但是如果就是这样,他们会并且足够轻松地解决它……
AviD

48
这是我使用的一个错误。将隐藏值设置为现在的加密时间。在发回邮件后,请确认已过10秒到10分钟。这挫败了骗子,他们会尝试插入一些始终有效的值。
Tim Scott

7
对于所有指出机器人可以超越的人……正如我在答案中指出的那样。这是阻止普通机器人和无聊用户的一种非常简单的方法。我目前在我的博客上使用它,到目前为止,它已100%成功。
GateKiller

8
我认为最好从易于旁路的测试开始,看看它们是否足够。
pbreitenbach 2009年

211

13
那太好了。该网站的链接是random.irb.hr/signup.php。有时要容易
得多

22
唯一的问题是,对于大多数人来说确实很难,但是计算机通常对此没有任何问题。
Tim Matthews

7
我相信这个问题的答案是-3?
dancavallaro

2
@Erik,不是真的。它还使那些拥有计算机科学博士学位但又不想打扰的人继续留在这里。
BobbyShaftoe

28
-3似乎正确。我记得前一段时间曾使用该网站进行研究,当我到达验证码时,我感到非常高兴,因为它既有趣又与众不同。它用于使用实际的放射性衰变源访问量子随机数生成器。
亚历克斯

57

除非我缺少任何东西,否则使用reCAPTCHA会有什么问题,因为所有工作都是在外部完成的。

只是一个想法。


17
验证码是用户敌对的。验证码已经够糟糕了。但是,使用户更难获得一些微小的OCR收益确实是敌对的。
pbreitenbach

19
为什么用户敌视?垃圾邮件易于使用吗?
Elzo Valugi 2010年

14
这是对用户的敌视,因为有时甚至对于人类来说,图像也难以解码,并且在这种情况下可能会使合法用户感到沮丧。有关过度难以解码图像的一些示例,请参见Josh的CAPTCHAS性能最差的链接。
Andrei Fierbinteanu 2010年

4
@Andrei,如果对您来说太难了,您总是可以让reCAPTCHA加载另一个图像。
mhitza

23
reCAPTCHA很好,它实现了一个可访问性选项,而95%的本地解决方案甚至都没有考虑过。
alxp 2010年

42

这种方法的优点是,对于大多数人来说,CAPTCHA将永远不可见!

我喜欢这个主意,难道我们没有任何办法可以挂接到rep系统吗?我的意思是,任何说+100 rep的人都可能是人类。因此,如果他们有代表,则您甚至不必费心做验证码。

然后,如果不是这样,则发送该邮件,我敢肯定,不会有那么多帖子才能达到100,并且社区将立即跳入似乎所有带有令人讨厌的标签的垃圾邮件的人,为什么不添加“报告垃圾邮件”链接下调200?获取其中的3个,spambot成就解锁,再见;)

编辑:我还应该补充一点,我喜欢非图像验证码的数学思想。或简单的谜语类型的东西。可能会使发布变得更加有趣^ _ ^


13
如果高业力会员帐户凭据被盗怎么办?
James McMahon

20
@nemo然后处理它。但是,仅出于这个原因,很少有理由避免解决方案。
pbreitenbach 2009年

因为每个人都会看到垃圾邮件和高额报酬,并且知道一个帐户被盗了。
hamstar 2011年

37

怎么样一个蜜罐验证码


4
Honeypot Captcha的解释(看起来很不错):机器人喜欢形式。他们填写了所有字段。蜜罐验证码包含一个由CSS隐藏的字段,因此只有漫游器(以及那些使用IE 3.0的漫游器)才能看到它。如果已填满,那就是机器人。非常容易实现。
克莱·尼科尔斯

5
同样,只需花费很少的时间即可轻松绕过。没错,您将设法阻止一些脚本,但是,如果您的网站有价值,那不是您的主要威胁。
AviD

honeypot captchas对可用性不利-屏幕阅读器不会忽略隐藏的表单字段。
Bayard Randel

是的,这很容易部署,效果很好。可访问性是唯一真正的问题。
meme,

6
可以通过简单地绕过可访问性来添加一些文本:Hey, if youre a human, keep this field blank!
Strae 2010年

30

避免有史以来最糟糕的验证码

Trivia可以,但是您必须分别编写它们:-(

有人必须写它们。

您可以按照ReCaptcha印刷字的方式进行琐事问题。它提供了两个单词,其中一个单词知道答案,另一个则不知道-在第二个单词得到足够答案之后,它现在也知道答案了。提出两个琐事问题:

女人需要男人,就像鱼需要男人吗?

橙色橙色橙色。键入绿色。

当然,这可能需要与其他技术结合,例如计时器或计算出的机密。您需要轮换/淘汰问题,因此,为了保持问题的供应量,您可以临时添加:

输入您的明显问题:

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

现在,要让正在运行StackOverflow游戏机器人的人放慢速度,您可以按IP地址轮换问题-这样,直到所有问题用尽后,相同的IP地址才会得到相同的问题。这会减慢构建已知问题的字典的速度,从而迫使机器人的所有者回答您所有的琐事问题。


14
请谨慎处理琐事,因为有时它们对您来说很容易,对于来自不同国家/地区的未掌握英语的人或来自不同文化背景的人来说,可能会非常困难。如果您强迫他们仅使用字典登录,他们可能会感到沮丧!甚至更糟的是,他们只是停止使用该网站。
2010年

14
“女人需要男人,就像鱼需要男人吗?” 那么这个问题的答案是什么?
Lotus Notes 2010年

2
自行车。艾琳娜·邓恩(Irina Dunn)引用(格洛里亚·斯坦因(Gloria Steinem)推荐)。
webbiedave

9
...就像一条鱼需要一条淑女鱼。
matt lohkamp,2010年

28

我曾经在朋友的网站上看到过此消息。他要卖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,尽管我认为您不应该为这样的事情付费。我宁愿从头开始构建它。
大林Seivewright

5
很好,但盲人也需要口头版本
专业人士

29
问题是它比图像更容易破解。您所要做的就是将其读入图片中,您将拥有完美的黑白图像以进行OCR。
Andrei Krotkov 09年

@Andrei,有一个替代版本,使用“ figlet”生成,可以将字符“拼合”在一起,以便验证码的字符共享ASCII字符。这些对OCR来说有点难。
帕西·萨沃拉宁

58
可能是广告,但a)这是对问题的有效答案,b)作者明确指出这是由朋友提出的(这意味着他明确指出有偏见),因此我认为答案没有任何问题。
迈克尔·斯托姆

28

在当前的概念化中,CAPTCHA已损坏,通常很容易被绕开。现有解决方案中没有一个能有效发挥作用-GMail最多只能在20%的时间内成功。

实际上,这要比这糟得多,因为该统计信息仅使用OCR,并且还有其他解决方法-例如,CAPTCHA代理和CAPTCHA场。我最近在OWASP上发表了关于该主题的演讲,但ppt尚未在线...

尽管CAPTCHA无法提供任何形式的实际保护,但如果您要阻止随意的随车垃圾,就足以满足您的需求。但这甚至不会阻止半专业的垃圾邮件发送者。

通常,对于具有任何价值的资源进行保护的站点,您需要采用三管齐下的方法:

  • 仅来自经过身份验证的用户的油门响应禁止匿名帖子。
  • 最小化(但不阻止)来自身份验证用户的少量垃圾邮件-例如基于信誉的垃圾邮件。人工主持人也可以在这里提供帮助,但是您还有其他问题-即淹没(甚至淹没)主持人,并且某些站点更喜欢开放性...
  • 使用服务器端启发式逻辑来识别类似垃圾邮件的行为,或者更好的非人类行为。

CAPTCHA可以通过第二个插脚来帮助小小的一角,仅仅是因为它改变了经济性-如果其他插脚到位,则不再需要打穿CAPTCHA(最低成本,但仍然是成本)来成功实现这样的成功少量垃圾邮件。

同样,并非您的所有垃圾邮件(和其他垃圾邮件)都是由计算机生成的-使用CAPTCHA代理或服务器场,坏人可以让真正的人向您发送垃圾邮件。


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

一个CAPTCHA农场有许多廉价的劳动力(印度,远东等)来解决这些问题……通常每解决1000个验证码就需要2到4美元。最近在Ebay上看到了关于此的发布...


代理和农场不会破坏它,也不会绕开“ CAPTCHA”,因为它们正在被人类解决。确实,它们的存在证明了当前方法确实有效!CAPTCHA的意思不是“我想要的提交类型”,而是“它是人类的提交” ...
Fraser,2009年

10
究竟!但是,验证码最常用于防止“机器人”-无论这些机器人是否为人类都无关紧要,其目的是防止大规模的非个人使用。这恰恰证明了我一直说的话,CAPTCHA解决了错误的问题(而且做得很糟)……
AviD 2009年

在很多情况下,验证码很好。关键是网站所有者应选择一种在用户体验与控制之间取得平衡的解决方案。对于一些,没有验证码。对于其他人,验证码。对于其他人,还有其他事情。但是,完全消除验证码并不明智。
pbreitenbach

1
问题来自于认为将CAPTCHA放进去,将给您那种控制权。它没有。没有实质性的一点。在少数情况下,它可以提供一些价值,但不能提供“控制”。(我在这里经常提到验证码,以及其他机制,这些额外的内容有助于使垃圾邮件变得不值得。)
AviD

27

因此,除了主持人外,CAPTCHA对所有用户都是强制性的。[1]

那真是愚蠢。因此,会有一些用户可以编辑网站上的任何帖子,但没有CAPTCHA不能发布帖子?如果您有足够的声望来投稿,则您有足够的声望而无需验证码。如有必要,使其更高。另外,还有许多垃圾邮件检测方法可以在没有图像识别的情况下使用,因此即使对于未注册的用户,也不必填写那些被遗忘的验证码表格。




17

Asirra是有史以来最可爱的验证码。


起初,我将其读为“ Asirra是有史以来最受采用的验证码”。这让我有点不高兴。我同意这可能是最可爱的,但是正如网站上指出的那样,机器人编写者可以保存所有图像(可能需要一段时间),对它们进行分类,然后机器人很容易将其破坏。
大林Seivewright

7
盲人该如何回答呢?
BBetances

它几乎与reCAPTCHA相同。我们正在寻找一种刺激性较小且不基于图像的方法。
AhmetB-Google 2010年

我必须说,他们使用了大量的图像来检查其演示。
pimvdb 2011年

1
在承认我是人类之前,我进行了3次测试-大概是因为某些图像看起来像是大毛茸茸的小球。
Kramii 2012年

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
也为残酷而+1,但我只是想补充一点,这对我不起作用,我使用VB.NET eval提供程序并检查格式c:或rm -rf,换行符,冒号,分号等。您需要比这更具创造力。此外,我从不让Linux脚本以root身份运行,这就是为什么这也不起作用的原因。
Stefan Steiger,2010年

@Longpoke这根本行不通。在大多数现代Unix上,内置了rm防止使用.NET 运行的保护-rf /
hamstergene

大声笑,如果您只是说让我尝试,那将很有趣。也许rm -rf / *可以代替。无论如何,您还有很多其他坏事可以做。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 2011年

这还假设人们不了解Python literal_eval(或其他语言的等效语言),这是一个非常可悲的事实。
Petr Viktorin

rm -rf ~如果脚本在某人的个人计算机上运行,​​将是破坏性的
kirb'2

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并尝试填充每个表单字段,而人类将看不到输入字段并留下它们。

显然,您可以做更多的事情来减少这种攻击的可能性,但这只是一个基本概念。


7
“ honeypot captcha”
mpen

15

虽然我们都应该了解基础数学,但是数学难题可能会引起一些困惑。在您的示例中,我确定有人会回答“ 8”而不是“ 1”。

简单的带有随机字符的粗体或斜体突出显示的文本字符串是否合适?用户只需要输入粗体/斜体字母作为验证码即可。

例如小号 sdfa werwe JH Ç悲伤ķ oghvefdhrffghlfgdhowfgh

在这种情况下,“堆栈”将是CAPTCHA。这个想法显然有很多变体。

编辑:示例变体,以解决此想法确定的一些潜在问题:

  • 使用颜色随机的字母,而不是粗体/斜体。
  • 在验证码中每隔两个红色字母使用一次(减少了漫游器识别格式不同的字母来猜测验证码的可能性)

1
我喜欢这个-例如“请输入第三个带下划线的红色字母,第四个加粗的绿色字母和第五个非加粗的蓝色字母拼写的单词”。
An̲̳̳drew

9
可以通过简单的正则表达式来解决“ ssdfatwerweajhcsadkoghvefdhrffghlfgdhowfgh”上方的示例
Alex

这对于有计算功能的用户来说不是很好。有这样的痛苦的科学家,所以有程序员可能并非没有道理。
BobbyShaftoe

好主意!也许即使通过改变前景色/背景色来玩耍,您也可以获得某种能使人类容易看到的文本显示出来的东西,但是对于机器人来说却太随意了?当然,这对色盲人士来说更难:-(
Shalom Craimer 09年

2
使用颜色可能会使事情复杂化,因为您需要支持不同形式的色盲。否则,这听起来不错。
KarstenF,2010年


12

我知道没人会读这本书,但是狗或猫的验证码呢?

您需要说说是猫还是狗,机器无法做到这一点。.http ://research.microsoft.com/asirra/

是一个很酷的..


4
电脑无法做到这一点。盲人也不能。
TRiG 2010年

1
在高分辨率显示器上查看时也不是。这些图像是微小的。其中一个是白色篱笆后面的一些无法辨认的生物。
jsims281 2010年

10

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

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

这样可以使某人不得不自定义程序对您的网站进行编程,这可能不值得。如果他们这样做,您只需更改问题。


Cyc可以轻松解决此问题,而且它是开源的。最多需要几个小时的脚本来实施。
rmeador

也由ubuntu论坛使用。我喜欢它,并且像“ 2 + 2 =?”这样的检查实现 或“什么是字母表的第一个字母”非常简单。
pistacchio,

8
答案:1)现在,在市中心附近,是浅蓝色,后来是红色,然后是黑色,带有橙色的提示。2)橙色,除非发霉,否则为绿色或黑色或白色。3)棕色,在南加州,除非您在比佛利山庄,否则它是绿色。
mmr

52
@mmr看到,这实际上是该系统的好处,它可以阻止smartasses发表评论……
tghw

2
第二个和第三个答案偏向生活在沙漠或巴尔的摩的人们。
Mike Robinson 2010年

10

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

我更喜欢可以在服务器端进行自动程序检测的方法。由于您拥有有效的用户(由于使用了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 Portal

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

当然,这些参考文献大多数都指向视频游戏机器人检测,但这是因为这就是我们小组论文《机器人大战:机器人识别的游戏中探索》的主题。它没有出版或任何东西,只是用于学校项目的东西。如果您有兴趣,我可以发送电子邮件。事实是,即使基于视频游戏机器人检测,您也可以将其推广到网络上,因为有用户在使用模式。

我确实同意MusiGenesis的这种方法,因为这是我在网站上使用的方法,并且效果很好。不可见的CAPTCHA流程是阻止大多数脚本的一种不错的方法,但是仍然不能防止脚本编写者对您的方法进行反向工程和“伪造”您在javascript中寻找的值。

我会说最好的方法是:1)建立一个用户,以便您可以在不良情况下阻止用户; 2)识别一种算法,以检测典型的网站使用模式与非典型的网站使用模式; 3)相应地阻止该用户。


机器人为什么不能注册OpenID?攻击者只需要创建自己的OpenID发布者即可。
rjmunro

是的@rjmunro,那是一件好事。互联网的困难在于识别匿名用户。如果漫游器注册了OpenID,并且您将该OpenID用户标识为漫游器,则可以将其关闭。它不再是匿名的。这并不能阻止同一提供商进行多次注册,但是您可以关闭该提供商以允许机器人进入。目的是尽最大可能消除互联网的匿名性。
jwendl

10

我有一些想法想与您分享...

避免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

欢迎任何批评家。


验证码的文字是语音。它可以告诉您在哪里单击。
罗伯特·P

@RobertP当您有视力障碍时单击就好像在您有视力障碍时进行射击一样……“只是瞄准头部”。

8
@pst“向左一点。是的,再多一点。好。好。现在回来。向上。不,反过来。是的,您已经明白了。更多。几乎在那里。几乎那里...几乎...几乎... CAPTCHA !!!”
罗伯特·P


7

最近,我开始添加名称和ID设置为“消息”的标签。我将其设置为使用CSS隐藏(显示:无)。垃圾邮件漫游器会看到它,然后填写并提交表单。服务器端,如果输入ID为name的textarea,则将该帖子标记为垃圾邮件。

我正在研究的另一种技术是随机生成名称和ID,其中一些是垃圾邮件检查,其他是常规字段。

这对我来说非常有效,而且我还没有收到任何成功的垃圾邮件。但是,访问网站的访问者却少得多:)


使用css隐藏表单字段并断言它为空也对我有用。不是很简单,但是是一个不错的选择。
克里斯,2010年

技术1:蜜罐
kevinji 2011年

6

非常简单的算法是好的。盲人将能够回答。(但是正如Jarod所说的,要提防运算符优先级。)我搜集到了可以编写解析器的人,但这使垃圾邮件的发送成本更高。

非常简单,围绕它编写代码将不难。我在这里看到两个威胁:

  1. 随机垃圾邮件和可能支持它们的人为垃圾邮件;和
  2. 用于游戏堆栈溢出的机器人

通过简单的算术,您可以击败威胁#1,但不能击败威胁#2。


我认为,解析器比编写图像验证码破解程序要容易得多。请记住,您提供给用户的最简单的方法就是垃圾邮件机器人可能会使用什么。可悲的是,无JS验证码需要更难。
stalepretzel

5

如果您结合使用了所获得的验证码提示(选择任意一个-或随机选择其中一个)怎么办:

  • ASCII文本验证码://(_)//
  • 数学难题:7减去3乘2是什么?
  • 琐事问题:蟾蜍还是冰棒,哪个口味更好?

并在页面的CSS隐藏部分中放置完全相同的验证码-honeypot想法。这样,您将在一个地方希望得到正确的答案,而在另一个地方应该保持答案不变。


1
我认为“味道更好”是很主观的。弯腰关注品味的人将被解释为机器人。此外,只有两个答案,成为机器人的机会是50%。
pimvdb 2011年

在主观方面是正确的,但具体之处在于最初的问题。我的观点是随机使用所有三种(或多种)类型。另外,如果答案是多项选择,则通过的机会仅为50%。如果您让用户键入单词而未在列表中指出可能的答案,则机器人很难在问题/答案中选择正确的单词。
TheEmirOfGroofunkistan 2011年

5

使用简单的“将此字段留空:”字段,我获得了惊人的好结果。Bot似乎填满了所有内容,尤其是如果您将该字段命名为“ URL”之类的话。结合严格的引荐来源网址检查,我还没有一个机器人能够通过它。

请不要忘记这里的可访问性。众所周知,对于许多使用屏幕阅读器的人来说,验证码是无法使用的。简单的数学问题或非常琐碎的琐事(我喜欢“天空是什么颜色”问题)对视力障碍的用户更加友好。


5

简单的文字听起来很棒。 贿赂社区去做这项工作!如果您像我一样相信SO代表积分能衡量用户对帮助网站成功的承诺,那么提供信誉积分来帮助保护网站免受垃圾邮件发送者的侵害是完全合理的。

每提供一个简单问题和一组正确答案,就会获得+10声望。该问题应该与所有现有问题保持适当的距离(编辑距离),并且如果人们无法回答,则声誉(和问题)应该逐渐消失。假设如果正确答案的失败率超过20%,那么提交者将为每个错误答案失去一个声誉点,最多不超过15个。因此,如果您提交的是错误问题,则现在得到+10,但最终您会得到净-5。或者,让一个样本用户对验证码问题是否是一个好的问题进行投票也许是有意义的。

最后,就像每日代表上限一样,假设没有人通过提交验证码问题赢得超过100个声誉。这是对此类贡献的权重的合理限制,也可能有助于防止垃圾邮件发送者将问题播种到系统中。例如,您可以选择问题的概率不相等,而是与提交者的声誉成正比的概率。乔恩·斯基特(Jon Skeet),请不要提出任何问题:-)


5

对服务器进行加密随机数的AJAX查询。服务器发送回包含随机数的JSON响应,并设置一个包含随机数值的cookie。计算JavaScript中随机数的SHA1哈希,将值复制到隐藏字段中。现在,当用户发布表单时,他们将cookie与现时值一起发送回去。计算来自cookie的随机数的SHA1哈希,与隐藏字段中的值进行比较,并验证您是否在最近15分钟内生成了随机数(memcached对此很有用)。如果所有这些检查都通过,请发表评论。

这项技术要求垃圾邮件发送者坐下并弄清楚发生了什么,一旦这样做,他们仍然必须触发多个请求并保持cookie状态才能发表评论。另外,只有Set-Cookie首先解析并执行JavaScript并发出AJAX请求,他们才会看到标头。这远远超出了大多数垃圾邮件发送者的工作量,尤其是因为该工作仅适用于单个站点。最大的缺点是,任何禁用JavaScript或禁用Cookie的人都会被标记为潜在垃圾邮件。这意味着审核队列仍然是一个好主意。

从理论上讲,这可以通过掩盖来视为安全,但是在实践中,它是极好的。

我从来没有见过垃圾邮件发送者努力打破这种技术,尽管也许每隔几个月我就会收到一次手动输入的垃圾邮件条目,这有点令人毛骨悚然。


5

1)人类解算器

这里提到的所有解决方案都可以通过人类求解器方法来规避。专业的垃圾邮件机器人保持数百个连接,当它无法解决验证码本身时,会将屏幕截图传递给远程人工求解器。

我经常读到,验证码的人类求解器违反了法律。好吧,这是由那些不知道这个(垃圾邮件)行业如何工作的人写的。
人类求解器不会直接与他们要解决的验证码进行交互。他们甚至不知道CAPTCHA是从哪个站点发送的。我知道有数十个(如果不是数百个)公司或网站提供人工求解器服务,但没有一个可以与被破坏的董事会直接互动的公司。
后者不违反任何法律,因此CAPTCHA解决方案完全是合法的(且已正式注册)商业公司。它们没有犯罪意图,例如可能已用于远程测试,调查,概念证明,原型验证等。

2)基于上下文的垃圾邮件

AI(人工智能)机器人在不同时间(来自不同国家/地区)的不同IP地址确定上下文并维护上下文敏感的对话。即使是博客的作者,也经常无法理解评论来自机器人。我不会讲很多细节,但是,例如,僵尸程序可以对人类对话进行网络抓取,将其存储在数据库中,然后简单地重用它们(逐词逐句),这样就无法通过软件甚至人类将其检测为垃圾邮件。

投票最多的答案

  • *“理论是:
    • 垃圾邮件机器人将不支持JavaScript,并将提交所看到的内容
    • 如果漫游器确实支持JavaScript,它将立即提交表单
    • 评论者至少在发布之前阅读了部分页面“ *

以及蜜罐答案,该线程中的大多数答案都是错误的。
我敢说他们是受害者的方法

大多数垃圾邮件通过来自(不同国家/地区)不同IP的本地和远程javascript感知(补丁和托管)浏览器工作,它们非常聪明地规避了陷阱和蜜罐。

不同的问题是,即使博客所有者也无法经常检测到来自机器人的评论,因为它们实际上是来自人工对话以及从其他Web板收集的评论(论坛,博客评论等)。

3)概念上的新方法

抱歉,我把这部分沉淀掉了


1
您已经在该线程上的几乎所有答案中概述了问题。如果它们不是小型网站所独有的,它们都会很快被击败。如果将它们中的任何一个用于大型网站或许多小型网站(例如,Wordpress插件),它们将在一天内被击败。他们确实不是CAPTCHAS,而是幸运的安全案例。您也说对了;现代垃圾邮件正在发表评论,即使我也无法将其视为垃圾邮件。我放弃了CAPTCHA,而是使用Mollom。垃圾邮件众包是一种更好的方法。

5

实际上,设置与编程相关的验证码可能是一个主意。例如:

验证码

有可能构建语法检查器来绕过此功能,但绕过验证码则需要做更多的工作。你有一个相关的验证码的想法。


5
例外:您是否知道示例问题的答案(以防万一,后来有人偶然发现该问题,而图像不存在:“中有多少PHP语法错误$var == array(1 = 'one');;”)1不是3?(认真尝试$var == array(1 => 'one');;)^ _〜
pinkgothic

嘿,已经足够长了,我不记得要制作这张照片了。您当然是对的,而且我认为作为验证码不是很好-但可能作为编程论坛的入门要求。
罗斯,2010年

4

我必须承认,我没有对抗水龙头的经验,也不真正知道它们的复杂程度。也就是说,我在jQuery文章中看不到任何无法完全在服务器上完成的事情。

重述jQuery文章的摘要:

  1. 在服务器上生成联系表时...
  2. 抓住当前时间。
  3. 合并该时间戳记和一个秘密单词,生成一个32个字符的“哈希”,并将其作为cookie存储在访问者的浏览器中。
  4. 将哈希或“令牌”时间戳存储在隐藏的表单标签中。
  5. 当表单回发时,时间戳记的值将与cookie中存储的32个字符“令牌”进行比较。
  6. 如果信息不匹配或丢失,或者时间戳太旧,请停止执行请求...

另一个选择是,如果要使用传统映像CAPTCHA,而又没有在每个请求上生成它们的开销,则是脱机预先生成它们。然后,您只需要随机选择一个即可与每种表单一起显示。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.