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

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

9

7

最近,我开始添加名为“message”的标签,并将其设置为隐藏(display:none),同时设置id。垃圾邮件机器人会看到它并填写表单进行提交。在服务器端,如果填写了id为name的文本区域,我将把该帖子标记为垃圾邮件。

另一种技术是随机生成名称和id,其中一些用于垃圾邮件检查,其他用于常规字段。

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


使用CSS隐藏表单字段并断言其为空也对我有用。虽然不是绝对可靠的方法,但是是一个不错的选择。 - Chris
技巧1:蜜罐 - Kevin Ji

6
非常简单的算术是很好的。盲人也可以回答。(但正如Jarod所说,要注意运算符优先级。)我想有人可以编写解析器,但这会使垃圾邮件更加昂贵。
足够简单,编码起来不难。我看到两个威胁:
1.随机垃圾邮件和可能支持它们的人类垃圾邮件; 2.创建用于游戏Stack Overflow的机器人。
通过简单的算术,您可以击退威胁#1,但无法击退威胁#2。

解析器(Parser),我认为,比编写图像验证码破解程序容易得多。请记住,您向用户提供的最简单的东西就是垃圾邮件机器人可能会使用的。不幸的是,无 JS 验证码需要更加困难一些。 - stalepretzel

5
简单的文本听起来很好。如果你像我一样认为SO声望分数衡量了用户对帮助网站成功的承诺,那么提供声望分数以帮助保护网站免受垃圾邮件攻击是完全合理的,贿赂社���去完成这项工作! 每个简单问题和一组正确答案的贡献都可以获得+10的声望。问题应该远离所有现有问题(编辑距离),如果人们无法回答,则声望(和问题)应逐渐消失。假设正确答案的错误率超过20%,则提交者每个不正确的答案会失去一个声望点,最多15个。所以如果您提交了一个糟糕的问题,您现在可以获得+10,但最终您将净亏损-5。或者也许有意义的是让一些用户投票表决验证码问题是否好用。
最后,就像每日声望上限一样,假设没有用户能通过提交验证码问题获得超过100的声望。这是对此类贡献所给予的权重的合理限制,它还可以帮助防止垃圾邮件发送者在系统中播种问题。例如,您可以选择题目而不是等概率,而是按照提交者的声望比例来选择。Jon Skeet,请不要提交任何问题:-)

5

1) 人力解决方案

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

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

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

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

最高得票的答案表示:

  • *“理论上:
    • 垃圾邮件机器人不支持JavaScript,并将提交其所看到的内容
    • 如果机器人支持JavaScript,则会立即提交表单
    • 评论者至少在发布之前阅读了页面的一些内容”*

以及蜜罐答案和本主题中的大多数答案都是错误的。
我敢说它们是受害者注定的方法

大多数垃圾邮件机器人通过来自不同IP(来自不同国家)的本地和远程JavaScript感知(修补和管理)浏览器工作,它们非常聪明,可以规避蜜罐。

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

3) 概念上的新方法

抱歉,我删除了这部分,因为它太仓促了。


1
你已经在这个帖子中几乎每个答案中都概述了问题。如果它们不仅限于小型网站,而是用于大型网站或多个小型网站(比如作为WordPress插件),它们很快就会被攻破。它们真的不是CAPTCHA,而是通过模糊性安全的幸运情况。你也是正确的;现代垃圾邮件是放置评论,即使我也无法识别为垃圾邮件。我已经放弃了CAPTCHA,改用Mollom。众包垃圾邮件是更好的方法,我认为。 - Dan

5
其实,我们可以考虑使用与编程相关的验证码集合。例如:

Captcha

有可能有人会构建一个语法检查器来绕过这个问题,但是绕过验证码需要更多的工作。 但是您可以想象一下拥有相关验证码的想法。


5
除非你知道这个例子问题的答案(万一有人在以后遇到这个问题时看不到图像:“在 $var == array(1 = 'one');; 中有多少个 PHP 语法错误?”),答案是 1,而不是 3。(认真地。尝试一下 $var == array(1 => 'one');;)^_^ - pinkgothic
嘿,已经很久了,我都不记得做过那张图片了。当然你是对的,我认为这并不适合作为验证码,但或许可以作为编程论坛的入门要求。 - Ross

5
我使用一个简单的“请勿填写此栏:”字段取得了惊人的好效果。如果您将该字段命名为“URL”等名称,机器人似乎会填写所有内容。结合严格的引荐者检查,我还没有遇到过机器人能够通过它的情况。
请不要忘记关注无障碍性。对于许多使用屏幕阅读器的人来说,验证码通常无法使用。简单的数学问题或非常琐碎的小知识(我喜欢“天空是什么颜色”的问题)更适合视力受损用户。

5
向服务器发出一个AJAX查询,获取加密随机数。服务器返回一个JSON响应,其中包含随机数,并设置一个包含该随机数值的cookie。在JavaScript中计算随机数的SHA1哈希值,并将该值复制到隐藏字段中。当用户提交表单时,他们现在会将cookie与随机数值一起发送回来。从cookie计算随机数的SHA1哈希值,然后与隐藏字段中的值进行比较,并验证您在过去15分钟内生成了该随机数(memcached在此方面很有用)。如果所有这些检查都通过,则发布评论。
此技术要求垃圾邮件发送者坐下来弄清楚发生了什么,一旦他们这样做了,他们仍然必须发送多个请求并维护cookie状态才能通过评论。此外,他们只有在解析和执行JavaScript以及进行AJAX请求时才会看到Set-Cookie标头。这比大多数垃圾邮件发送者愿意付出的努力要多得多,特别是因为该工作仅适用于单个站点。最大的缺点是关闭JavaScript或禁用Cookies的任何人都会被标记为潜在的垃圾邮件,这意味着审核队列仍然是个好主意。
理论上,这可能符合通过混淆来实现安全性的标准,但在实践中,它是非常出色的。
我从未见过垃圾邮件发送者努力破解这种技术,尽管每隔几个月我会手动输入一个相关主题的垃圾邮件条目,这有点令人不安。

4

1
这真的很聪明。 :) 虽然可能不太实用,因为很容易被破解。 - Sasha Chedygov
这个大概很容易被破解,尽管它做得很巧妙。 - Chris S

4
有些人声称他们的解决方案从未被机器人破解。但问题在于你也无法知道有多少人无法通过“验证码”。网站不能对人类用户变得极其不友好。在互联网上做生意的代价似乎是你必须处理一些手动工作来忽略垃圾邮件。CAPTCHA(或类似系统)会让用户退避三舍,这比根本没有CAPTCHA更糟糕。诚然,StackOverflow拥有非常知识渊博的受众群体,因此可以使用更具创意的解决方案。但对于更普通的网站,你只能使用人们已经习惯的东西,否则你只会引起困惑并失去网站访问者和流量。总的来说,CAPTCHA不应该被调整为阻止所有机器人或其他攻击向量。这会使合法用户面临过于困难的挑战。从简单开始,逐渐增加难度,直到你将垃圾邮件水平控制在某个可管理的水平,但不要再增加了。最后,我想回到基于图像的解决方案:你不需要每次创建一个新图像。你可以预先创建大量图像(也许几千张?),然后随着时间的推移慢慢更换这个集合。例如,每10分钟或每小时过期100张最旧的图像,并用一组新的图像替换它们。对于每个请求,从整个集合中随机选择一个CAPTCHA。当然,这种方法无法抵御有针对性的攻击,但正如在这里多次提到的那样,大多数CAPTCHA都不会。但它足以阻止随机机器人。

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