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

Posted

技术标签:

【中文标题】实用的非基于图像的验证码方法?【英文标题】:Practical non-image based CAPTCHA approaches? 【发布时间】:2010-09-05 17:26:55 【问题描述】:

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

我们将使用 javascript (jQuery) 验证码作为第一道防线:

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

这种方法的优势在于,对于大多数人来说,验证码永远不会可见!

但是,对于禁用 JavaScript 的人,我们仍然需要一个后备,这就是它变得棘手的地方。

我写了一个traditional CAPTCHA control for ASP.NET,我们可以重复使用。

但是,我更喜欢使用文本内容,以避免每次请求在服务器上创建所有这些图像的开销。

我见过类似的东西..

ASCII 文本验证码:\/\/(_)\/\/ 数学谜题:7 减去 3 乘以 2 等于多少? 琐事问题:什么味道更好,蟾蜍还是冰棒?

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

想法?

【问题讨论】:

实际上不需要在服务器上创建镜像。您只需要处理请求。例如 琐事问题容易产生文化偏见(想想一个法国人回答你的问题......)。此外,他们可以处理英语不是母语的用户。此外,它们很容易被暴力破解(你只有 ~2^#_OfQuestions 选项)。 还有,冰棒到底是什么? 根据 Wolfram Alpha 的说法,“7 减去 3 乘以 2”是 1。我以为是 8。我认为你刚刚发明了反验证码。 @Mike Robinson:我认为程序员应该了解正常日常使用中的运算符优先级=) 【参考方案1】:

我的favourite CAPTCHA ever:

【讨论】:

那个很棒。该网站的链接是random.irb.hr/signup.php。有时会容易得多 唯一的问题是这对大多数人来说真的很难,但计算机通常不会有这个问题。 我相信这个问题的答案是-3? @Erik,不是真的。它还保留了那些拥有计算机科学博士学位但不想打扰的人。 -3 似乎是正确的。我记得不久前使用这个网站进行研究,当我使用 Captcha 时,我非常高兴,因为它很有趣而且与众不同。它用于访问使用实际放射性衰变源的量子随机数发生器。【参考方案2】:

A method that I have developed 似乎工作得很好(尽管我可能没有像你那样收到那么多评论垃圾邮件),是有一个隐藏字段并用虚假值填充它,例如:

<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,您的评论将被标记为垃圾邮件,但是,我确实审查了标记为垃圾邮件的 cmets,所以这不是问题。

对 cme​​ts 的回应

@MrAnalogy:服务器端方法听起来是个好主意,并且与在 JavaScript 中做的完全一样。好电话。

@AviD:我知道这种方法容易受到直接攻击,正如我在my blog 中提到的那样。但是,它会防御您的普通垃圾邮件机器人,后者会盲目地将垃圾提交到它可以找到的任何形式。

【讨论】:

不使用 JAVASCRIPT 的版本 如果您使用 ASP 等执行此操作,并且在加载表单页面时有一个时间戳,然后将其与提交表单的时间进行比较,那会怎么样。如果 ElapsedTime 如果恶意用户费心查看它,显然是可以绕过的。虽然我确定你知道这一点,但我猜你是在假设他们不会打扰......好吧,如果它不是任何有价值的网站,那么你是对的,他们不会打扰 - 但如果是的,然后他们会的,并且很容易绕过它...... 这是我使用的一个转折点。将隐藏值设置为现在的加密时间。回发后,确认 10 秒到 10 分钟已过。这会挫败那些试图插入一些始终有效值的骗子。 致所有指出机器人可以通过的人......正如我在答案中指出的那样,我知道这一点。这是阻止普通机器人和无聊用户的一种非常简单的方法。我目前在我的博客上使用它,到目前为止,它已经 100% 成功。 我认为最好从易于绕过的测试开始,看看它们是否足够。【参考方案3】:

除非我遗漏了什么,否则使用 reCAPTCHA 有什么问题,因为所有工作都是在外部完成的。

只是一个想法。

【讨论】:

重新验证码对用户不利。 Captchs 已经够糟糕了。但是,让用户更难获得一些微小的 OCR 好处是非常不利的。 为什么是用户敌对的?垃圾邮件对用户友好吗? 它对用户不利,因为有时图像即使对人类来说也难以解码,并且在发生这种情况时可能会让合法用户感到沮丧。请参阅 Josh 与最差验证码的链接,了解一些过度难以解码图像的示例。 @Andrei 如果对您来说太难,您可以随时让 reCAPTCHA 加载另一张图片。 reCAPTCHA 很好,它实现了 95% 的本土解决方案甚至没有考虑过的可访问性选项。【参考方案4】:

这种方法的优势在于,对于大多数人来说,验证码永远不会可见!

我喜欢这个主意,有没有什么办法可以直接连接到代表系统?我的意思是,任何说 +100 代表的人都可能是人类。因此,如果他们有代表,您甚至不必费心在 CAPTCHA 方面做任何事情。

然后,如果他们不是,然后发送它,我相信不需要那么多帖子就能达到 100 个,社区会立即潜入任何似乎在发送带有攻击性标签的垃圾邮件的人,为什么不添加一个“报告垃圾邮件”链接,downmods 200?获得其中 3 个,解锁垃圾邮件机器人成就,再见 ;)

编辑:我还应该补充一点,我喜欢非图像验证码的数学想法。或者也许是一个简单谜题类型的东西。可能会让发帖更有趣^_^

【讨论】:

高业力会员账户凭证被盗怎么办? @nemo 然后你处理它。但很少有理由仅仅因为这个原因而避免解决方案。 因为每个人都会看到垃圾邮件和高业力,并且知道帐户已被盗。【参考方案5】:

honeypot captcha 呢?

【讨论】:

蜜罐验证码的解释(看起来很不错):机器人喜欢表格。他们填写所有字段。蜜罐验证码包含一个被 CSS 隐藏的字段,因此只有机器人(以及使用 IE 3.0 的机器人)才能看到它。如果它被填满,它就是一个机器人。非常容易实现。 同样,只需极少的时间投入即可轻松绕过。诚然,你会设法阻止一些脚本小子,但如果你的网站有价值,那不是你的主要威胁。 蜜罐验证码不利于可用性 - 屏幕阅读器不会忽略隐藏的表单字段。 是的,这很容易部署并且运行良好。可访问性是唯一真正的问题。 可访问性可以通过简单地绕过添加一些文本:Hey, if youre a human, keep this field blank!【参考方案6】:

避免使用worst CAPTCHAs of all time。

琐事是可以的,但你必须写下每一个:-(

有人必须写出来。

您可以像 ReCaptcha 打印文字一样做琐事问题。它提供了两个单词,其中一个它知道答案,另一个它不知道 - 在第二个答案足够多之后,它现在也知道答案了。问两个小问题:

女人需要男人,就像鱼需要男人一样?

橙橙橙。键入绿色。

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

输入你的明显问题:

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

现在,为了减慢运行 *** 游戏机器人的速度,您可以按 IP 地址轮换问题 - 因此,在所有问题用尽之前,相同的 IP 地址不会得到相同的问题.这会减慢构建已知问题字典的速度,迫使机器人的人类所有者回答您所有的琐事问题。

【讨论】:

请注意琐事问题,因为它们有时对您来说很容易,而对于来自不同国家的未掌握英语的人或来自不同国家的人来说可能会难以置信困难文化。如果您强迫他们只使用字典登录,他们可能会生气!或者更糟糕的是,他们只是停止使用该网站。 “女人需要男人,就像鱼需要男人一样?”那么这个问题的答案是什么呢? 自行车。引用 Irina Dunn(由 Gloria Steinem 推广)。 ...就像一条鱼需要一条淑女鱼。【参考方案7】:

我曾经在朋友的网站上看到过这个。他卖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'   

【讨论】:

+1,尽管我认为您不应该为这样的事情付费。我宁愿从头开始构建它。 不错,但盲人也需要口语版 这样做的问题是它比图像更容易破解。您所要做的就是将其读入图片,然后您就可以在一张完美的黑白图像上进行 OCR。 @Andrei,还有一个替代版本,使用“figlet”生成,这可以将字符“混合”在一起,以便验证码的字符共享 ASCII 字符。这些对 OCR 来说有点困难。 这可能是广告,但 a)它是对问题的有效答案 b)作者明确表示这是由朋友(这意味着他明确表示有偏见),所以我不'没有看到任何问题的答案。【参考方案8】:

CAPTCHA 在其当前的概念化中被破坏并且通常很容易被绕过。现有的解决方案都没有有效的工作——GMail 最多只有 20% 的成功率。

实际上比这更糟糕,因为该统计信息仅使用 OCR,并且还有其他方法可以绕过它 - 例如,验证码代理和验证码农场。我最近在OWASP做了一个演讲,但是ppt还没有上线……

虽然 CAPTCHA 无法以任何形式提供实际保护,但如果您想要阻止随意路过的垃圾,它可能足以满足您的需求。但它甚至无法阻止半专业的垃圾邮件发送者。

通常,对于需要保护任何有价值资源的网站,您需要三管齐下的方法:

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

CAPTCHA 可以在第二个插脚上帮助一点点,仅仅是因为它改变了经济性 - 如果其他插脚到位,则不再值得费心突破 CAPTCHA(成本最低,但仍然是成本)成功处理如此少量的垃圾邮件。

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


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

CAPTCHA 农场有许多廉价劳动力(印度、远东地区等)来解决这些问题……通常每解决 1000 个验证码需要 2-4 美元。最近在 Ebay 上看到一个帖子...

【讨论】:

代理和农场不会破坏它或绕过“验证码”,因为它们正在被人类解决。事实上,它们的存在证明了当前方法确实有效! CAPTCHA 并不意味着“我想要的提交类型”,而只是“是否是人工提交”...... 没错!但验证码最常用于防止“机器人”——这些机器人是否是人类并不重要,其目的是防止大规模、非个人使用。这只是证明了我一直说的话,CAPTCHA 解决了 错误 问题(而且做得很糟糕)... 在很多情况下验证码都可以。关键是网站所有者应该选择一个平衡用户体验和控制的解决方案。对于某些人来说,没有验证码。对于其他人,验证码。对于其他人,其他事情。但是完全忽略验证码并不明智。 问题源于认为将 CAPTCHA 放入,会给你控制权。它没有。一点也没有。在一些罕见的情况下,它可以提供一些价值,但不能提供“控制”。 (我在这里经常提到 CAPTCHA,以及其他机制提供了额外的一点点,以帮助使垃圾邮件变得不值得。)【参考方案9】:

因此,所有用户都必须使用 CAPTCHA 除了版主。 [1]

这真是太愚蠢了。所以会有用户可以编辑网站上的任何帖子,但不能在没有验证码的情况下发布?如果您有足够的代表来对帖子投反对票,那么您就有足够的代表在没有验证码的情况下发布。如果必须的话,让它更高。此外,还有很多垃圾邮件检测方法可以在没有图像识别的情况下使用,因此即使是未注册用户也无需填写那些被上帝遗忘的 CAPTCHA 表单。

【讨论】:

【参考方案10】:

请确保它不是 Google can answer。这也表明该 --order of 操作存在问题!

【讨论】:

【参考方案11】:

如何使用社区本身来仔细检查这里的每个人都是人类,即类似于信任网络的东西?为了找到一个真正值得信赖的人来创建网络,我建议使用此 CAPTCHA 来确保他绝对是 100% 的人。

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

当然,他极有可能忙于准备他的菲尔兹奖演讲以帮助我们建立信任网络,但好吧......

【讨论】:

【参考方案12】:

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

【讨论】:

起初我将其解读为“Asirra 是有史以来最容易采用的验证码”。这让我有点失望。我同意它可能是最可爱的,但正如它在网站上所说的那样,机器人作者可以保存所有图像(可能需要一段时间),对它们进行分类,然后机器人很容易破解它。 盲人如何回答这些问题? 和 reCAPTCHA 几乎一样。我们正在寻找一种刺激性较小且不基于图像的方法。 我必须说他们使用了大量的图像来检查他们的演示。 在它承认我是人类之前,我进行了 3 次尝试 - 大概是因为其中一些图像看起来就像是毛茸茸的大球。【参考方案13】:

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

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 身份运行,这也是为什么这也行不通的原因。 @Longpoke 这根本行不通。在大多数现代 Unix 上,rm 内置了防止与-rf / 一起运行的保护。 大声笑,如果你只是这么说让我试一试,那会很有趣。也许 rm -rf /* 可以代替。无论如何,你可以做很多其他的坏事。 这也假设人们不知道 Python 的 literal_eval(或其他语言的等价物),这是一个非常可悲的事实。 rm -rf ~ 如果脚本在某人的个人计算机上运行,​​则会具有破坏性【参考方案14】:

我一直在使用以下简单的技术,它并非万无一失。如果有人真的想绕过这个,很容易查看源代码(即不适合 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

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

编辑:解决与此想法相关的一些潜在问题的示例变体:

使用随机颜色的字母代替粗体/斜体。 每隔一个红色字母使用一次验证码(减少机器人识别不同格式的字母来猜测验证码的可能性)

【讨论】:

我喜欢这个 - 例如“请输入由第三个带下划线的红色字母、第四个粗体绿色字母和第五个非粗体蓝色字母拼写的单词”。 上面的例子 'ssdfatwerweajhcsadkoghvefdhrffghlfgdhowfgh' 可以通过一个简单的正则表达式来解决 这对有计算能力的用户不利。有科学家有这种病痛,所以程序员可能有这种病也不是没有道理的。 好主意!也许即使通过改变前景色/背景色,你也可以得到一些人类容易看到的文本,但对于机器人来说太随机了?当然这对色盲的人来说更难:-( 使用颜色可能会使事情复杂化,因为您需要支持不同形式的色盲。否则这听起来不错。【参考方案16】:

虽然这个similar discussion 已经启动:

我们正在我们经常进行数据挖掘的应用程序之一上尝试此解决方案:

A Better CAPTCHA Control (Look Ma - NO IMAGE!)

您可以在我们的Building Inspections Search 上看到它的实际效果。

您可以查看 Source 并看到 CAPTCHA 只是 HTML。

【讨论】:

这适用于现在,但只要有足够多的网站使用这种方法,垃圾邮件发送者就会将 html 呈现为图像并 OCR 呈现结果。【参考方案17】:

我知道没有人会读到这篇文章,但是 狗或猫 CAPTCHA 呢?

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

是一个很酷的..

【讨论】:

计算机无法做到这一点。盲人也不能。 我也不是,在高分辨率显示器上看它时。这些图像很小。其中一个是在白色栅栏后面的一些无法辨认的生物。【参考方案18】:

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

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

它使某人不得不为您的网站定制一个机器人程序,这可能不值得付出努力。如果他们这样做,您只需更改问题即可。

【讨论】:

Cyc 可以轻松解决这个问题……而且它是开源的。最多需要几个小时的脚本来实现。 这也被 ubuntu 论坛使用。我喜欢它,以及像“2 + 2 =?”这样的检查的实现。或者“字母表的第一个字母是什么”很简单。 答案: 1) 现在是浅蓝色,后来是红色,然后是黑色,在市中心附近带有一丝橙色。 2)橙色,除非它发霉,否则它是绿色或黑色或白色。 3)棕色,在南加州,除非你在比佛利山庄,否则它是绿色的。 @mmr 看,这实际上是系统的一个好处,它可以防止 smartasses 发布 cmets... 第二个和第三个答案偏向于生活在沙漠或巴尔的摩的人。【参考方案19】:

我个人不喜欢 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.:防止机器人玩在线游戏

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

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

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

我会说最好的方法是 1) 建立一个用户,以便您可以在他们不好时阻止他们,2) 确定一种算法来检测网站使用的典型模式与非典型模式,以及 3) 阻止该用户因此。

【讨论】:

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

我有一些想法想和你分享......

避免 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 具有文字转语音功能。它可以告诉你点击哪里。 @RobertP 视障时点击就像视障时射击...“瞄准头部”。 @pst “向左一点。没错,再多一点。好。好。现在回来。向上。不,在另一边。是的,你明白了。只是一个再多一点。是的。再多一点。快到了。快到了……几乎……几乎……验证码!!!”【参考方案21】:

Best captcha ever!也许你需要这样的东西来注册以防止即兴表演。

【讨论】:

【参考方案22】:

最近,我开始添加一个名称和 ID 设置为“消息”的标签。我用 CSS 将其设置为隐藏(显示:无)。垃圾邮件机器人看到它,填写并提交表格。服务器端,如果填写了 id name 的 textarea 我会将帖子标记为垃圾邮件。

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

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

【讨论】:

使用 css 隐藏表单字段并断言它为空对我也有效。不是万无一失的,但它是一个不错的选择。 技术一:Honeypot【参考方案23】:

非常简单的算术很好。盲人将能够回答。 (但正如 Jarod 所说,请注意运算符优先级。)我猜有人可以编写解析器,但这会使垃圾邮件发送成本更高。

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

    随机垃圾邮件程序和可能支持它们的人类垃圾邮件程序;和 为 Stack Overflow 游戏创建的机器人

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

【讨论】:

我认为解析器比编写图像验证码破解器要容易得多。请记住,您向用户提供的最简单的东西就是垃圾邮件机器人可能会使用的东西。可悲的是,无 JS 验证码需要更难。【参考方案24】:

如果您结合使用您拥有的验证码想法(选择其中任何一个 - 或随机选择其中一个):

ASCII 文本验证码://(_)// 数学谜题:7 减去 3 乘以 2 等于多少? 琐事问题:什么味道更好,蟾蜍还是冰棒?

除了在页面的 css 隐藏部分放置完全相同的验证码 - 蜜罐的想法。这样一来,您就可以在一个地方期待正确的答案,而另一个地方的答案应该保持不变。

【讨论】:

在我看来,“什么味道更好”是相当主观的。那些在味觉上犹豫不决的人将被解释为机器人。此外,只有两个答案,作为机器人通过的机会是 50%。 主观部分正确,但具体来自原始问题。我的观点是随机使用所有三种(或多种)类型。此外,如果答案是多项选择,则通过的机会只有 50%。如果您让用户键入单词而没有在列表中指明可能的答案,那么机器人在问题/答案中挑选出正确的单词会变得更加困难。【参考方案25】:

我通过一个简单的“将此字段留空:”字段获得了惊人的好结果。机器人似乎会填写所有内容,特别是如果您将该字段命名为“URL”之类的名称。结合严格的推荐人检查,我还没有机器人通过它。

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

【讨论】:

【参考方案26】:

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

为一个简单问题和一组正确答案的每个贡献提供 +10 声望。问题应该与所有现有问题适当地远离(编辑距离),如果人们无法回答,声誉(和问题)应该逐渐消失。假设如果正确答案的失败率超过 20%,那么提交者会因每个错误答案而损失 1 分,最多 15 分。因此,如果您提交了一个错误的问题,您现在会得到 +10,但最终您会净 -5。或者,让一组用户对验证码问题是否合适进行投票是有意义的。

最后,就像每日代表上限一样,假设没有用户可以通过提交验证码问题获得超过 100 个声望。这是对此类贡献权重的合理限制,它还可能有助于防止垃圾邮件发送者将问题植入系统。例如,您可以选择概率不相等但概率与提交者声誉成正比的问题。 Jon Skeet,请不要提交任何问题 :-)

【讨论】:

【参考方案27】:

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

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

从理论上讲,这可以通过默默无闻获得安全性,但在实践中,它非常出色。

我从来没有见过垃圾邮件发送者努力破坏这种技术,尽管可能每隔几个月我就会手动输入一个主题垃圾邮件条目,这有点令人毛骨悚然。

【讨论】:

【参考方案28】:

1) 人类求解器

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

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

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

AI(人工智能)机器人确定上下文并在不同时间从不同 IP 地址(不同国家/地区)维护上下文敏感对话。即使是博客的作者也经常无法理解 cmets 来自机器人。我不会详细介绍,但是,例如,机器人可以网络抓取人类对话,将它们存储在数据库中,然后简单地重复使用它们(逐个短语),因此它们不会被软件甚至人类检测为垃圾邮件。

The most voted answer告诉:

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

honeypot answer 和此线程中的大多数答案都是完全错误的。 我敢说他们是受害者注定的方法

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

不同的问题是,即使是博客所有者也无法经常检测到 cmets 来自 bot,因为它们实际上来自人类对话和从其他网络板(论坛、博客 cmets 等)收集的 cmets

3) 概念上的新方法

对不起,我把这部分作为沉淀物删除了

【讨论】:

您已经概述了该线程上几乎每个答案的问题。如果它们不是小网站独有的,它们都会很快被击败。如果它们中的任何一个用于大型网站或许多小型网站(例如作为 Wordpress 插件),它们将在一天之内被击败。它们真的不是验证码,而是通过默默无闻的安全的幸运案例。你也对;现代垃圾邮件正在放置连我都无法识别为垃圾邮件的 cmets。我已经放弃了 CAPTCHA,而是使用了 Mollom。众包垃圾邮件是一种更好的方法恕我直言。【参考方案29】:

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

有人可能会构建一个语法检查器来绕过它,但绕过验证码需要做更多的工作。不过,您会想到有一个相关的验证码。

【讨论】:

例外:您知道示例问题的答案吗(以防有人稍后偶然发现此问题并且图像不存在:“$var == array(1 = 'one');; 中有多少 PHP 语法错误”)是 @ 987654323@,不是3? (说真的。试试$var == array(1 =&gt; 'one');;)^_~ 嘿,时间已经够长了,我不记得制作那个图像了。你当然是对的,我认为这作为验证码不太好 - 但可能作为编程论坛的入门要求。【参考方案30】:

我不得不承认,我没有对抗垃圾邮件机器人的经验,也不知道它们有多复杂。也就是说,我在 jQuery 文章中没有看到任何不能纯粹在服务器上完成的内容。

重新表述 jQuery 文章中的摘要:

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

另一个选项,如果您想使用传统的图像验证码而不需要在每个请求上生成它们的开销,则可以离线预生成它们。然后你只需要随机选择一个与每个表单一起显示。

【讨论】:

以上是关于实用的非基于图像的验证码方法?的主要内容,如果未能解决你的问题,请参考以下文章

基于SVM的字母验证码识别

小工具 ——快速生成验证码

基于图像处理和卷积神经网络的文本验证码识别方案

selenium识别登录验证码---基于python实现

基于Tensorflow的验证码识别

图像处理基于模板匹配的验证码识别