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

看起来我们将为Stack Overflow添加验证码支持。这对于防止机器人、垃圾邮件发送者和其他恶意脚本活动是必要的。我们只希望人类在这里发布或编辑东西!

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

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

这种方法的优点是,对于大多数人来说,验证码永远不会出现! .

然而,对于禁用JavaScript的人,我们仍然需要一个备用方案,这就是棘手的地方。

我已经写了一个可以重用的传统的CAPTCHA控件。网

CaptchaImage

但是,我更倾向于使用一些文本化的东西,以避免为每个请求在服务器上创建所有这些图像的开销。

我见过这样的事情…

  • ASCII文本验证码:\/\/(_)\/\/
  • 数学难题:7减3乘以2等于多少?
  • 小问题:癞蛤蟆和冰棍,哪个更好吃?

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

想法吗?

82452 次浏览

有人还建议使用Raphael JavaScript库,它显然可以让你在所有流行的浏览器的客户端上作画:

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

.. 但这并不完全适用于我的<noscript>情况,不是吗?:)

但是要确保它不是谷歌可以回答。这也显示了一个问题——操作顺序!

虽然我们都懂基本的数学,但这道数学题可能会引起一些困惑。在你的例子中,我相信有些人会回答“8”而不是“1”。

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

例如<年代trong>年代sdfatwerwe一个jhcsadkoghvefdhrffghlfgdhowfgh

在这种情况下,“堆栈”将是验证码。

.

.

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

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

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

我喜欢这个主意,难道我们就不能直接加入代表系统吗?我的意思是,任何拥有100 + rep的人都有可能是人类。所以如果他们有代表,你甚至不需要在验证码方面做任何事情。

然后,如果他们不是,然后发送它,我相信它不会花那么多帖子到100,社区会立即扑向任何似乎是带有攻击性标签的垃圾邮件,为什么不添加一个“报告垃圾邮件”链接,降低200?获得3个,垃圾邮件成就解锁,再见;)

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

@ pc1oad1letter我也注意到在我的帖子。然而,这只是一个想法,而不是实际的实现。改变字体或使用不同的颜色,而不是粗体/斜体,可以很容易地解决可用性问题。

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

@lance

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

如果从静态图像列表中提取,绕过CAPTCHA就变得很简单,因为人类可以对它们进行分类,然后机器人就可以轻松地回答这些挑战。即使机器人不能回答所有问题,它仍然可以发送垃圾邮件。它只需要能够回答一小部分的验证码,因为当尝试失败时,它总是可以重试。

这实际上也是谜题的问题,因为拥有大量挑战是非常困难的。

@rob

蜜罐验证码怎么样? 哇,这么简单!看起来不错!尽管他们强调了无障碍问题。你认为这在SO会是一个问题吗?我个人觉得很难想象开发人员/程序员阅读屏幕有困难到需要屏幕阅读器的地步。< / p >

有些开发者不仅是法律上的盲人,而且是100%的盲人。手杖和辅助犬。我希望网站能以合理的方式支持他们。

然而,使用蜜罐验证码,您也可以放置一个隐藏的div,告诉他们将字段留空。如果他们填了,你也可以把它放在错误信息中,所以我不确定可访问性在这里有多大的问题。这肯定不太好,但也可能更糟。

我在phpBB 2.0网站上有一个垃圾邮件问题,我正在运行一段时间(网站现在升级了) 我在pbpBB论坛上找到了一个自定义验证码mod,在一段时间内工作得很好。我发现真正的解决方案是将此与(在帐户创建页面上)额外的“必填”字段结合起来。< br >我说;位置占领(平凡,但很容易知道)。
机器人从未尝试填充这些,仍然假设验证码是每次尝试失败的点

回答最初的问题:

  • ASCII很糟糕:我不得不眯着眼睛才能找到“WOW”。这是正确的吗?它可以是“VVOVV”或其他什么;
  • 非常简单的算术很好。盲人也能回答。(但正如Jarod所说,要注意操作符优先级。)我想有人可以编写一个解析器,但这使得垃圾邮件的成本更高。
  • 琐事是可以的,但你必须把它们都写出来:-(

我看过动物的照片[那是什么?]。漫画投票使用一个人物的图片,他们的名字写在图像的某处[输入名字]。不可能解析,对盲人来说不行。

您可以使用音频回退读取字母和数字(与验证码中的字母和数字相同)。

最后一道防线:使垃圾邮件易于报告(一键)和易于删除(一个重述屏幕检查是否是垃圾邮件帐户,显示最后十条消息,一键删除帐户)。不过,这仍然很费时。

这是我发明的方法,这似乎工作得很完美(虽然我可能没有得到那么多的评论垃圾邮件),是有一个隐藏字段,并填充一个虚假的值,例如:

<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:我知道这个方法很容易受到直接攻击,就像我在我的博客中提到的那样。然而,它将防御你的平均垃圾邮件机器人盲目提交垃圾的任何形式,它可以找到。

虽然这个类似的讨论已经启动:

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

一个更好的CAPTCHA控制(看Ma - NO IMAGE!) < / > < / p >

你可以在验楼及查楼上看到它的作用。

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

如何显示9个随机的几何形状,并要求用户选择两个正方形,或两个圆或其他。应该很容易写,也很容易使用。

没有什么比你无法正确阅读短信更糟糕的了……

你看过Waegis吗?

Waegis是一个在线web服务,它公开了一个开放的API(应用程序编程接口)。它通过API方法获取传入数据,并应用快速检查,及时识别垃圾邮件和合法内容。然后它将结果返回给客户端,以指定内容是否是垃圾邮件。”

如果没有实际的验证码作为你的第一个防线,你不仍然容易受到垃圾邮件发送者的浏览器脚本攻击吗(使用VB和IE很简单)?即加载页面,浏览DOM,点击提交按钮,重复…

所以,CAPTCHA对所有用户都是强制性的 除了版主。[1] < / p >

这太愚蠢了。所以会有用户可以编辑网站上的任何帖子,但没有验证码不能发布?如果你有足够的代表投票帖子,你有足够的代表发布没有验证码。如果有必要,可以调高一点。此外,你可以使用大量的垃圾邮件检测方法而无需图像识别,因此即使是未注册的用户也不需要填写那些该死的CAPTCHA表单。

我想他们正在研究节流。对于500+ rep的用户禁用CAPTCHA并为攻击者重置rep会更有意义。

我最近(不记得在哪里了)看到了一个显示一堆图片的系统。每幅画都有一个指定的字符。然后,用户被要求为一些图片输入字符,这些图片展示了某些类别的例子(汽车、计算机、建筑物、鲜花等)。图片和字符以及类别每次都会改变,以构建CAPTCHA字符串。

唯一的问题是与这种方法相关的更高带宽,并且您需要大量分类的图片。没有必要浪费太多资源来生成图片。

一种选择是带外通信;服务器可以向用户发送即时消息(或短信?),然后他/她必须在验证码字段中输入该消息。

这给用户带来了一个“非此即彼”的要求——要么你必须启用JavaScript,要么你必须登录到你所选择的IM服务。虽然它可能不像上面的一些其他解决方案那么灵活,但它适用于绝大多数用户。

那些拥有编辑权限的人,可以随意添加优点/缺点,而不是单独提交回复。

优点:

  • 可访问:许多IM客户端支持读取传入消息。一些基于web的客户端将与屏幕阅读器一起工作。

缺点:

  • javascript禁用的用户现在依赖于OpenID之上的另一个服务的正常运行时间。
  • 机器人将导致额外的服务器资源使用(发送带外通信),除非实现额外的保护

我的解决方案是将表单放在一个单独的页面上,并将时间戳传递给它。在该页上,我只在时间戳有效的情况下显示表单(不要太快,也不要太旧)。我发现机器人总是会直接点击提交页面,只有人类才能正确导航。

不会工作,如果你有内容页本身的形式,就像你现在做的,但你可以显示/隐藏链接到基于NoScript的特殊提交页面。对于这么小比例的用户来说,这是一个小小的不便。

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

只是一个想法。

也许你需要这样的东西来注册,以保持riff-raff。

我的建议是ASCII验证码,它不使用图像,它是程序员/极客。 这是一个PHP实现http://thephppro.com/products/captcha/,这是一个付费的。 有一个免费的,也是PHP实现,但我找不到一个例子-> http://www.phpclasses.org/browse/package/4544.html

我知道这些都是在PHP中,但我相信你们这些聪明的家伙构建SO可以“移植”到你最喜欢的语言。

我只是用了一些任何人都能回答的简单问题:

天空是什么颜色?< br > 橙子是什么颜色?< br > 草是什么颜色?< / p >

这使得有人必须为您的网站定制一个机器人程序,这可能不值得付出努力。如果有,你就改题。

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

  • ASCII文本验证码://(_)//
  • 数学难题:7减3乘以2等于多少?
  • 小问题:癞蛤蟆和冰棍,哪个更好吃?

加上在页面的CSS隐藏部分放置完全相同的验证码-蜜罐的想法。这样,你就有了一个地方可以得到正确答案,而另一个地方的答案应该是不变的。

如果你倾向于问题/答案解决方案,我曾经向用户展示了3-5个随机问题,他们可以从中选择,然后回答来证明他们是人类。该列表在每次页面加载时排序不同。

实际上,有一个与编程相关的验证码集是一个不错的想法。例如:

验证码

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

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

琐事是可以的,但你必须把它们都写出来:-(

一个人必须写它们。

你可以用ReCaptcha打印单词的方式来回答一些琐事问题。它提供了两个单词,其中一个它知道答案,另一个它不知道——在第二个单词的答案足够多之后,它现在也知道了那个单词的答案。问两个小问题:

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

橙色橙色橙色橙色。绿色的类型。

当然,这可能需要与其他技术相结合,例如计时器或计算秘密。问题需要轮换/退出,所以为了保持问题的供应,你可以特别添加:

进入你显而易见的问题:

你甚至不需要答案;其他人会帮你弄清楚的。你可能不得不允许把问题标记为“太难了”,就像这个:“asdf ejflf asl;jf ei;fil; asfast "

现在,为了让正在运行StackOverflow游戏机器人的人慢下来,你会根据IP地址旋转问题-所以相同的IP地址不会得到相同的问题,直到所有问题耗尽。这减慢了构建已知问题字典的速度,迫使机器人的人类所有者回答你所有的琐事问题。

即使使用rep,仍然应该有某种类型的验证码,以防止恶意脚本攻击。

非常简单的算术很好。盲人也能回答。(但正如Jarod所说,要注意操作符优先级。)我想有人可以编写一个解析器,但这使得垃圾邮件的成本更高。

足够简单,并且围绕它编写代码并不困难。我看到了两个威胁:

  1. 随机的垃圾邮件机器人和可能支持它们的人类垃圾邮件机器人;而且
  2. 机器人创建游戏堆栈溢出

通过简单的算术,你可以打败威胁1,但不能打败威胁2。

我写了一个PHP类,可以让你选择使用某个类型的验证码问题(数学,命名,反义词,完成),或者随机使用哪种类型。这些问题大多数说英语的孩子都能回答。 例如:< / >强

  1. 数学:2+5 = _
  2. 命名:图片中的动物是____
  3. 相反:快乐的反义词是___
  4. 完成:一头牛去_____

在实现前面提到的蜜罐验证码方法后,我们的表单垃圾邮件已经大幅减少。我相信自从实施以来,我们还没有收到任何通知。

你是否打算为Stackoverflow提供一个API,允许以编程方式操纵问题/答案?如果是这样,基于CAPTCHA的保护将如何适应这种情况?

虽然通过Atom聚合提要提供了一个丰富的只读接口,但它允许人们创建一些有趣的智能客户端/工具,用于组织和搜索Stackoverflow的大量内容;我认为在网页界面之外拥有提问和/或回答问题以及对内容投票的功能是非常有用的。(尽管这可能不符合基于广告的收入模式。)

我更愿意看到Stackoverflow使用启发式监控方法,试图检测恶意活动并阻止违规用户,但我可以理解使用CAPTCHA可能是一种更简单的方法,因为您的发布数据即将发布。

也许社区可以想出一些好的基于文本的验证码?

然后我们可以根据那些得票最多的人来列出一个好的名单。

Mollom是另一个可能感兴趣的askimet类型的服务。来自那些编写drupal /运行acquia的人。

这将是每次注册,而不是每次发布,对吧?因为这只会杀死站点,即使使用jQuery自动化。

使用简单的文本验证码,然后要求用户倒着输入答案,或者只输入第一个字母,或者最后一个字母,或者其他随机的东西。

另一个想法是制作一个ASCII图像,像这样(来自《传送门》游戏结束序列):

                             .,---.
,/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$;   .::,
.,    ..

并给用户一些选项,如:IS A, LIE, BROKEN HEART, CAKE。

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

如果只是检查JavaScript是否启用了呢?

任何使用这个网站的人都肯定会启用它。据人们所说,垃圾邮件机器人不会启用JavaScript。

我用一个简单的“Leave this field空白:”字段就得到了惊人的好结果。机器人似乎什么都填,特别是如果你把字段命名为“URL”。加上严格的推荐人检查,我还没有一个机器人通过它。

请不要忘记可访问性。对于使用屏幕阅读器的人来说,验证码是出了名的不可用。简单的数学问题或非常琐碎的琐事(我喜欢“天空是什么颜色”的问题)对视力受损的用户更友好。

验证码检查你是人还是电脑。 问题是,在那之后,计算机需要判断你是否是人类 所以解决方案是让一个用户填写验证码,让下一个用户检查。 问题当然是时间差距

我认为我们必须假设这个网站会经常受到有针对性的攻击,而不仅仅是一般的漂移机器人。如果它成为程序员搜索的第一个热点,它将引来很多的火力。

对我来说,这意味着任何CAPTCHA系统无法从重复的问题列表中抽取答案,一个人可以手动输入机器人,除了无法被机器人猜到。

如果你想要一个基于ascii的方法,看一下集成FIGlet。你可以制作一些自定义字体,并对每个字符进行一些字体选择随机化,以增加熵。字距调整使文本在视觉上更赏心悦目,也使机器人更难进行逆向工程。

如:

______           __     ____               _____
/ __/ /____ _____/ /__  / __ \_  _____ ____/ _/ /__ _    __
_\ \/ __/ _ `/ __/  '_/ / /_/ / |/ / -_) __/ _/ / _ \ |/|/ /
/___/\__/\_,_/\__/_/\_\  \____/|___/\__/_/ /_//_/\___/__,__/

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

要改写jQuery文章的摘要:

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

如果您希望使用传统的图像CAPTCHA,而不需要在每个请求上生成它们,那么另一种选择是离线预生成它们。然后你只需要随机选择一个来显示每个表单。

我一直在用下面这个简单的技巧,但也不是万无一失。如果有人真的想绕过这个,很容易查看源代码(即不适合谷歌验证码),但它应该愚弄大多数机器人。

像这样添加2个或更多的表单字段:

<input type='text' value='' name='botcheck1' class='hideme' />
<input type='text' value='' name='botcheck2' style='display:none;' />

然后使用CSS隐藏它们:

.hideme {
display: none;
}

在提交时检查这些表单字段中是否有任何数据,如果它们确实未能提交表单。理由是,机器人将读取HTML并尝试填充每个表单字段,而人类不会看到输入字段,并让它们单独存在。

显然,你可以做更多的事情来减少这种利用,但这只是一个基本概念。

在目前的概念中,CAPTCHA是不完善的,而且经常很容易被绕过。现有的解决方案没有一个是有效的——GMail最多只有20%的成功率。

实际情况要糟糕得多,因为这个统计数据只使用了OCR,还有其他方法可以绕过它——例如,CAPTCHA代理和CAPTCHA农场。我最近在OWASP做了一个关于这个主题的演讲,但是ppt还没有上线…

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

通常,对于一个有价值的资源需要保护的网站,你需要三个方面的方法:

  • 限制来自认证用户的回复,不允许匿名帖子。
  • 最小化(而不是阻止)来自认证用户的少数垃圾帖子-例如基于声誉的。人工版主在这里也可以提供帮助,但随后你会遇到其他问题——即充斥(甚至淹没)版主,而一些网站更喜欢开放……
  • 使用服务器端启发式逻辑来识别类似垃圾邮件的行为,或者更好的非人类行为。

验证码可以在第二个方面提供一点帮助,只是因为它改变了经济状况——如果其他方面都到位了,那么为了在如此少量的垃圾邮件中成功突破验证码(最低成本,但仍然是成本)就不再值得了。

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


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

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

这些JavaScript解决方案是否都适用于屏幕阅读器?而图像减去一个有意义的alt属性可能会破坏WCAG

我所知道的一种清除机器人的方法是在用户的cookie中存储一个密钥,如果密钥或cookie不存在,则假设它们是机器人,忽略它们或退回到图像CAPTCHA。这也是一种非常好的方法,可以防止为机器人创建大量会话/跟踪,这些会话/跟踪会给您的数据库添加大量噪音,或增加系统性能的开销。

令人困惑的一件事是谷歌,显然是世界上拥有最多CS博士的公司,他们的验证码被破坏了,而且似乎没有采取任何措施。

将一个数学问题发布为IMAGE,为了清晰起见,可能会使用附图。

只是图像中清晰可见的文本。

(2+5)*2

不是最精致的反垃圾邮件武器,但是微软支持:

Nobot-Control (AjaxControlToolkit的一部分)。

NoBot可以通过违反上述任何技术进行测试:快速回发、多次回发或禁用浏览器中的JavaScript。

演示:

http://www.asp.net/AJAX/AjaxControlToolkit/Samples/NoBot/NoBot.aspx

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

你不只是想让人类发帖。你需要能够讨论编程主题的人。所以你应该有一个验证码,比如:

下面的C函数声明是什么意思:char *(*(**foo [][8])())[]; ?

=)

简单的数学并不是答案——垃圾邮件发送者甚至不需要编写一个简单的解析器。谷歌将为他们做这件事,即使你使用单词而不是数字,所以它只需要在谷歌上快速搜索,它就完成了。

它也可以很容易地进行文本到数字的转换

似乎有某种错误在SO的渲染,因为它只显示第一个链接时,这是张贴,即使预览工作正常。第二个链接是-进入谷歌,搜索“1 * 42”

这句话的第五个单词是什么颜色?红色的吗?,蓝色,绿色?

(适当的颜色词)

如果不为验证码使用图像的主要问题是创建这些图像的CPU负载,那么在CPU负载“较轻”(相对而言)时找到创建这些图像的方法可能是一个好主意。没有理由需要在生成表单的同时生成验证码图像。相反,你可以从上次服务器负载“轻”时生成的大量验证码缓存中提取。您甚至可以重用缓存的验证码(以防表单提交出现奇怪的峰值),直到下次服务器负载“轻”时重新生成一堆新的验证码。

我认为一个定制的验证码是你最好的选择。这种方法需要一个专门针对机器人/脚本来破解它。这种努力因素应该会减少尝试的次数。人类毕竟是懒惰的

reCAPTCHA大学赞助并帮助数字化书籍。

我们生成和检查扭曲的图像,所以你不需要运行昂贵的图像生成程序。

我有两个解决方案,一个需要JavaScript,另一个不需要。两者都比7 + 4更难打败,但在海报上看,它们都没有reCaptcha那么难。我想出了这些解决方案,因为我需要为AppEngine提供验证码,而AppEngine提供了一个更受限制的环境。

不管怎样,这里是演示的链接:http://kevin-le.appspot.com/extra/lab/captcha/

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

你需要分辨出哪个是猫,哪个是狗,机器做不到。 http://research.microsoft.com/asirra/ < / p >

是一个很酷的…

基于CSS的验证码怎么样?

<div style="position:relative;top:0;left:0">
<span style="position:absolute;left:4em;top:0">E</span>
<span style="position:absolute;left:3em;top:0">D</span>
<span style="position:absolute;left:1em;top:0">B</span>
<span style="position:absolute;left:0em;top:0">A</span>
<span style="position:absolute;left:2em;top:0">C</span>
</div>

这将显示“ABCDE”。当然,使用自定义机器人仍然很容易。

映像可以在客户端从服务器传递的基于矢量的信息中创建。

这将减少服务器上的处理和传输的数据量。

只是在任何基于验证码的问题中都要小心文化偏见。

智力测试中的偏差

我推荐一些琐事问题。不是每个人都能理解字母的ASCII表示,有多个运算的数学问题会让人困惑。

最好的验证码系统是那些在计算机科学中滥用P=NP问题的系统。自然语言问题可能是这些问题中最好的,也是最容易被滥用的。任何可以通过简单的谷歌查询和一些检查来回答的问题(例如,太阳系中的第二颗行星是什么?是个好问题,而2 + 2 = ?在那种情况下,他是一个有价值的候选人。

使用样式化的HTML元素(如div)来显示验证码怎么样?从矩形区域中构造字母很容易,但很难分析它们。

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

我更喜欢服务器端的机器人检测方法。由于您拥有有效用户(多亏了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.:《游戏的社交面:大型多人在线游戏中的互动模式研究》

当然,大多数引用指向电子游戏机器人检测,但这是因为这是我们小组题为《机器人战争》的论文的主题: 机器人识别的游戏探索。它没有出版,只是学校的一个项目。如果你感兴趣,我可以给你发邮件。事实上,即使它是基于电子游戏机器人检测,你也可以将其推广到网页上,因为这里有用户使用模式

我非常赞同MusiGenesis的这种方法,因为我在自己的网站上也使用了这种方法,而且效果不错。看不见的CAPTCHA过程是阻止大多数脚本的一种不错的方法,但这仍然不能阻止脚本作者对您的方法进行逆向工程,并在javascript中“伪造”您正在寻找的值。

我会说最好的方法是1)建立一个用户,这样你就可以在他们不好的时候阻止他们,2)确定一种算法来检测典型模式和非典型模式的网站使用,3)相应地阻止该用户。

简单的文字听起来很棒。贿赂社区来做这项工作!如果你像我一样相信,SO代表点衡量用户对帮助网站成功的承诺,提供声誉点来帮助保护网站免受垃圾信息制造者的侵害是完全合理的。

每回答一个简单的问题和一组正确答案+10声望。这个问题应该与所有现存的问题保持适当的距离(编辑距离),如果人们不能回答它,声誉(和问题)应该逐渐消失。假设正确答案的失败率超过20%,那么提交者每个错误答案会损失1个声誉点,最多15个。因此,如果你提交了一个糟糕的问题,你现在得到+10,但最终你将净得-5。或者,让一组用户对验证码问题进行投票是有意义的。

最后,就像每日信誉上限一样,假设没有用户可以通过提交验证码问题获得超过100个声誉。这是对此类贡献的权重的合理限制,也有助于防止垃圾邮件发送者在系统中植入问题。例如,你可以选择与提交者的声誉成比例的概率而不是相等概率的问题。乔恩·斯基特,请不要提交任何问题。

如果只用ASP呢?NET Ajax NoBot?它似乎为我工作体面。它不是特别好,但还不错。

我会做一个简单的基于时间的验证码。

启用JavaScript:检查后时间减去加载时间大于HUMANISVERYFASTREADER。

禁用JavaScript: HTTP请求开始时间减去HTTP响应结束时间(存储在会话或隐藏字段中)大于HUMANISVERYFASTREADER加上NETWORKLATENCY乘以2。

在任何一种情况下,如果它返回真,那么你重定向到一个图像验证码。 这意味着大多数时候人们不需要使用图像验证码,除非他们的阅读速度非常快,或者垃圾邮件机器人被设置为延迟响应

注意,如果使用隐藏字段,我将为它使用一个随机id名称,以防bot检测到它被用作CAPTCHA并试图修改该值。

另一种完全不同的方法(只适用于JavaScript)是使用jQuery可分类的函数来允许用户对一些图像进行排序。也许是一个小的3x3拼图。

Mixriot.com使用ASCII艺术验证码(不确定这是否是第三方工具)。

 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

不是技术解决方案,而是理论解决方案。

< p > 1。给出一个单词或一个声音。“将鼠标移动到屏幕左上角,点击橙色按钮”或“点击这里,然后点击这里”(需要多步响应) 当任务完成了,问题就解决了。选择已经在页面上的对象,让它们单击。至少完成两个动作。< / p >

希望这能有所帮助。

我喜欢在“great rom network”中使用的验证码: 链接文本 < / p >

点击彩色的微笑,它很有趣,每个人都能理解…除了机器人哈哈

我认为文本验证码方法的问题在于文本可以被解析并因此得到回答。

如果你的网站很受欢迎(如Stackoverflow),人们喜欢代码挂在它(如Stackoverflow),很有可能有人会把“打破验证码”作为一个挑战,很容易赢得一些简单的javascript + greasemonkey。

因此,例如,线程中某处建议的隐藏彩色字母方法(确实是一个很酷的想法,想法),可以通过以下示例行的简单解析轻松打破:

<div id = "captcha">
<span class = "red">s</span>
asdasda
<span class = "red">t</span>
asdff
<span class = "red">a</span>
jeffwerf
<span class = "red">c</span>
sdkk
<span class = "red">k</span>
</div>

同样,解析这个也很简单:

3 + 4 = ?

如果它遵循模式(x + y)或类似的。

类似地,如果你有一个问题数组(what color is an orange?how many dwarves surround snowwhite?),除非你有成千上万个问题,否则你可以从中挑选出大约30个,生成一个问答散列,并让脚本机器人重新加载页面,直到找到这30个问题中的一个。

把它扔出去。我有一个简单的数学问题在我的联系方式之一,简单地问

什么是[数字1-12]+[数字1-12]

我可能一个月收到5-6封垃圾邮件,但我没有那么多流量。

验证码过滤器的一个理论想法。向用户提出一个服务器可以简单回答的问题,用户也可以回答。共享答案成为用户和服务器都知道的一种公钥。

Stack Overflow的相关示例:

用户XYZ有多少声誉点?

提示:查看屏幕侧面的信息,或点击此链接。 用户可以从已知的堆栈溢出用户中随机抽取 一个更一般的例子: 你住在哪里? 你住的地方星期六九点天气怎么样? 提示:使用雅虎天气,并提供湿度和一般条件

然后用户输入他们的答案

< p >西雅图 部分多云,85%湿度

计算机证实确实是西雅图当时的天气状况。

答案对用户来说是唯一的,但服务器有一种查找和确认答案的方法。

问题的类型可以多种多样。但其思想是,您对人类必须查找的事实组合进行一些处理,服务器可以简单地进行查找。这个过程是一个两部分的对话,需要一定程度的相互理解。这是一种反向转弯测试。让人类证明它可以提供可计算的数据,但它需要人类的知识来产生可计算的数据。

另一种可能的实现。你叫什么名字,什么时候出生的?

人会提供一个已知的答案,计算机可以在数据库中查找信息。

也许一个数据库可以由一个机器人来填充,但机器人需要一些智能来把相关的事实放在一起。服务器端的数据库或查找表可以被系统地删除明显的垃圾信息,如属性。

我确信在执行过程中有缺陷和细节有待解决。但这个概念似乎是合理的。用户提供服务器可以查找的事实组合,但服务器可以控制应该询问的组合类型。这些组合可以是随机的,服务器可以使用各种策略来查找共享答案。真正的好处是,你要求用户在他们的回答中提供某种类型的剖析和自我揭示。这使得机器人更加难以系统化。一群计算机开始在许多服务器和验证码表单上使用相同的答案

我是1972年下午3:45出生的机器人。

然后,这种响应可以被整个网络分析和使用,以阻止机器人,有效地使自动化在几次迭代后变得毫无价值。

当我进一步思考这个问题时,为评论博客文章实施一个基本的阅读理解测试会很有趣。在博客文章结束后,作者可以向他或她的读者提出一个问题。这个问题可以是每篇博客文章所独有的,这样做还有一个好处,那就是要求用户在发表评论前仔细阅读。你可以在一篇文章的末尾写一个简单的问题,答案存储在服务器端,然后用一组无意义的问题来填充数据库。

这篇文章谈论了紫色验证码技术吗? 服务器端回答(false, no)

这篇文章是关于验证码的吗? 服务器端回答(true, yes)

这篇文章是关于迈克尔·杰克逊的吗? 服务器端回答(false, no)

以随机的顺序提出几个问题,并使这个顺序有意义,这似乎很有用。例如,上面的would = no, yes, no。打乱顺序,问一些无意义的问题,答案是“不是”和“是”。

这里的一些人声称解决方案从未被机器人破坏过。我认为问题在于,你也不知道有多少人没有通过“验证码”。

一个网站不能变得对人类用户非常不友好。这似乎是在互联网上做生意的代价,你必须处理一些手工工作来忽略垃圾邮件。拒绝用户的验证码(或类似的系统)比根本没有验证码更糟糕。

无可否认,StackOverflow有一个非常有知识的受众,所以可以使用更多创造性的解决方案。但对于更普通的网站,你只能使用人们习惯的东西,否则你只会造成混乱,失去网站访问者和流量。一般来说,验证码不应该用于阻止所有机器人或其他攻击载体。这对合法用户来说太困难了。开始时要简单,然后逐渐增加难度,直到垃圾邮件水平在某种程度上达到可管理的水平,但不能超过这个水平。

最后,我想回到基于图像的解决方案:你不需要每次都创建一个新的图像。您可以预先创建大量(可能几千个?),然后随着时间的推移慢慢地更改这个集合。例如,每10分钟或每小时过期100个最旧的图像,并用一组新的图像替换它们。对于每个请求,从整个验证码集中随机选择一个验证码。

当然,这无法承受直接攻击,但正如前面多次提到的,大多数验证码都无法承受。不过,这足以阻止随机机器人。

Ajax花哨的验证码类型的图像为基础,除了你必须拖放基于形状识别,而不是键入字母/数字包含在图像。

当我看到一个关于人类的计算的视频(该视频是关于如何使用人类通过游戏标记图像)来构建验证码系统时,我有了一个想法。人们可以使用这样的系统来标记图像(可能用于其他目的),然后使用关于标记的统计信息来选择适合验证码使用的图像。

假设有一张图片,90%的人都给它贴上了“猫”或“摩天大楼”的标签。然后可以呈现图像,要求图像最明显的特征,这将是图像的主导标签。

这可能超出了SO的范围,但有人可能会发现这是一个有趣的想法:)

我确信大多数页面都是使用支持鼠标悬停的控件(按钮、链接等)构建的。

  • 不是显示图像并要求用户输入内容,而是要求用户将鼠标移动到任意控件(以随机顺序选择控件(任何按钮或链接))。
  • 并将颜色应用到鼠标上的控件(一些随机的颜色)(小JavaScript做的把戏)..
  • 然后让用户在鼠标上输入他/她所看到的颜色。

这只是一种不同的方法,我并没有实现这个方法。但这是可能的。

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

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

从理论上讲,这可以作为通过模糊性的安全,但在实践中,这是很好的。

我从未见过垃圾邮件发送者试图破解这种技术,尽管可能每隔几个月我就会收到一个手动输入的主题垃圾邮件条目,这有点怪异。

这是我的验证码努力:

The security number is a spam prevention measure and is located in the box
of numbers below. Find it in the 3rd row from the bottom, 3rd column from
the left.


208868391   241766216   283005655   316184658   208868387   241766212


241766163   283005601   316184603   208868331   241766155   283005593


241766122   283005559   316184560   208868287   241766110   283005547


316184539   208868265   241766087   283005523   316184523   208868249


208868199   241766020   283005455   316184454   208868179   241766000


316184377   208868101   241765921   283005355   316184353   208868077

当然,这些数字是随机的,行和列的选择以及左/右上/下的选择也是随机的。一个人留言告诉我“顺便说一句,安全问题太恶心了”:

http://jwm-art.net/dark.php?p=louisa_skit

点击“添加评论”查看操作。

请打电话给xxxxx,让我们谈谈你那里的天气。

但是,现在的发展太快了,利润导向也太大了,对我们选择的服务提供商来说,即使是一个电话也太贵了(时间很宝贵)。

我们接受了大部分时间与机器交谈。

伤心……

如果你做一个有不同颜色字母的验证码,你让用户特定的颜色只输入那些呢?

我编写了一个相当大的新闻网站,一直在摆弄验证码和分析垃圾邮件机器人。

我所有的解决方案都是针对中小型网站的(像本主题中的大多数解决方案一样)
这意味着他们阻止垃圾邮件机器人发布,除非他们为你的网站(当你很大的时候)做出了特定的解决方案


我发现的一个很好的解决方案是垃圾邮件机器人不会访问你的文章后48小时后,你发布了它. conf。 由于新闻网站上的一篇文章在发布后48小时内就获得了大部分浏览量,它允许未注册的用户在不输入验证码的情况下留下评论
另一个我见过的很好的验证码系统是由WebDesignBeach创建的 你有几个对象,你必须拖,下降一个到一个特定的区域。很有创意,不是吗?< / p >

我有一些想法想和你们分享……

避免OCR的第一个想法

一个验证码对用户来说有一些隐藏的部分,但完整的图像是两个代码在一起,所以OCR程序和验证码农场读取图像,包括可见部分和隐藏部分,尝试解码它们,但未能提交…-我已经准备好解决这个问题,并在网上工作。

http://www.planethost.gr/IdeaWithHiddenPart.gif < a href = " http://www.planethost.gr/IdeaWithHiddenPart.gif " > < / >

第二个想法,让它更容易

一页有很多单词,人类必须选择正确的一个。我也创建了这个,很简单。文字是可点击的图像,用户必须点击正确的图像。

http://www.planethost.gr/ManyWords.gif < a href = " http://www.planethost.gr/ManyWords.gif " > < / >

没有图像的第三个想法

和以前一样,但是有div和文本或小图标。用户必须只点击正确的一个div/字母/图像,无论如何。

http://www.planethost.gr/ArrayFromDivs.gif < a href = " http://www.planethost.gr/ArrayFromDivs.gif " > < / >

最终想法——我称之为CicleCaptcha

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

http://www.planethost.gr/CicleCaptcha.gif < a href = " http://www.planethost.gr/CicleCaptcha.gif " > < / >

欢迎任何批评。

我有一个vBulletin论坛,收到了大量的垃圾邮件。添加一个额外的规则解决了这一切;让人们输入一个单词的大写字母。由于我们的网站名为“TrefPuntMagic”,他们不得不输入“TPM”。我知道它不是动态的,如果一个垃圾邮件制造者想要真正的垃圾邮件我们的网站,他们可以做一个工作,但我们只是许多许多vBulletin论坛他们的目标,这是一个简单的解决方案。

利用社区本身来仔细检查这里的每个人是否都是人,比如像信任网一样的东西,怎么样?为了找到一个真的可以信赖人来启动web,我建议使用这个验证码来确保他绝对是100%的人类。

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

当然,有一个很小的机会,他会忙着准备他的菲尔兹奖演讲,来帮助我们建立信任的网络,但是……

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

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

等。

一旦垃圾邮件发送者开始流行,应该很容易就能发现他们。当检测到垃圾邮件发送者请求时,在以下两个命令之间切换:

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

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

为什么不设置简单的编程问题,用户可以回答他们最喜欢的语言-然后在服务器上运行代码,看看它是否有效。通过在不同的随机文本上运行答案来避免人工验证码农场。

< p >的例子: "Extract domain name from - s = hihiuhi@ewfwef.cfwe"

.

return = etc."< / p >

类似的领域知识,其他子网站。

所有这些都有可以自动测试的标准公式,但使用随机字符串或值进行测试。

显然,这个想法有很多缺陷;)

另外,每5分钟只允许一次登录尝试。

将其绑定到聊天室将是一种有趣的验证码方式。一种活生生的图灵测试。显然,这需要有人在线提问。

在我的博客上,除非有javascript,否则我不接受评论,而是通过ajax发布评论。它把所有的机器人挡在外面。我收到的唯一垃圾邮件来自人类垃圾邮件发送者(他们通常从站点复制并粘贴一些文本来生成评论)。

如果你必须要有一个非javascript版本,可以这样做:

下面字符串[y]中[x]的[某些操作]

给定一个足够复杂的[x]和[y],无法用正则表达式求解,那么编写解析器就很难了

数一下[dog,dangerous,danceable,cat]中短单词的个数= 2

在[dog,dangerous,danceable,catastrophe] = dog中最短的单词是什么

哪个单词以x结尾,[fish,mealy,box,stackoverflow] = box

在[apple.com, stackoverflow.com, fish oil.com] = fish oil.com中,哪个url是非法的

所有这些都可以在服务器端轻松完成;如果选项的数量足够大,并且频繁轮换,那么就很难获得所有选项,再加上永远不要每天给同一用户相同类型的内容超过一次

音频呢?提供一个有声音在说话的音频样本。让用户输入他听到的内容。也可能是被他识别出来的声音效果。

作为奖励,这可以帮助语音识别器创建封闭的标题,就像RECAPTCHA帮助扫描书籍一样。

可能愚蠢……我有个想法。

最近,我开始添加一个标签,名称和id设置为“message”。我将它设置为隐藏与CSS(显示:none)。垃圾邮件机器人看到它,填写并提交表单。服务器端,如果文本区域与id名称填写我标记为垃圾邮件。

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

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

Have You try http://sblam.com/en.html ? 据我所知,这是验证码的一个很好的替代方案,而且对用户来说是完全透明的

修正语法错误的验证码:

echo "Hello, world!;
for (int $i = 0; $i < 10; $i ++ {
echo $i /*
}

括号和引号被随机移除。

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

这一个使用1px块生成看起来像图像,但纯html/css。有关示例,请参见这里的链接:http://www.nujij.nl/registreren.2051061.lynkx?_showInPopup=true

1)人工求解

这里提到的所有解都被人工求解方法所绕过。一个专业的垃圾邮件机器人拥有数百个连接,当它自己无法解决CAPTCHA时,它会将截图传递给远程人工解决者。

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

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

AI(人工智能)机器人确定上下文,并在不同时间从不同的IP地址(不同国家)维护上下文敏感的对话。即使是博客的作者也经常不明白评论来自机器人。我不会说太多细节,但是,例如,机器人可以网络抓取人类对话,将它们存储在数据库中,然后简单地重用它们(一个短语一个短语),所以它们不会被软件甚至人类检测到是垃圾邮件。

得票最多的答案说明:

  • *"理论是:
    • 垃圾邮件机器人不支持JavaScript,只提交它看到的内容
    • 如果机器人支持JavaScript,它会立即提交表单
    • 评论者在发表“*”之前至少阅读了一些页面内容
    • 李< / ul > < / >

    以及蜜罐的答案和这个线程中的大多数答案都是完全错误的 我敢说它们是victim-doomed方法

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

    不同的问题是,即使是博客所有者也不能经常检测到来自机器人的评论,因为它们实际上来自人类对话和来自其他网络板(论坛,博客评论等)的评论。

    3)概念上的新方法

    抱歉,我把这部分去掉了

我认为比特币是一个非常实用的非图像验证码——详情见http://bitcoin.org

人们在注册时发送小额付款,确认后可以退还。你花在弄清楚验证码上的时间不会回来。

我一直在使用http://stopforumspam.com作为对抗机器人的第一道防线。在我已经实现的网站上,它可以阻止几乎所有的垃圾邮件发送者,而不使用验证码。