关于安全性:实用的非基于图像的CAPTCHA方法?

Practical non-image based CAPTCHA approaches?

看起来我们将为堆栈溢出添加captcha支持。这对于防止僵尸、垃圾邮件发送者和其他恶意脚本化活动是必要的。我们只希望人类在这里发布或编辑东西!

我们将使用javascript(jquery)captcha作为第一道防线:

http://docs.jquery.com/tutorials:safer_contact_forms_without_captchas

这种方法的优点是,对大多数人来说,验证码永远不会被看到!

但是,对于禁用了javascript的人,我们仍然需要一个回退,这就是它变得棘手的地方。

我为ASP.NET编写了一个传统的验证码控件,我们可以重用它。

CaptchaImage

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

我见过……

  • ASCII文本验证码:\/\/(_)\/\/
  • 数学难题:7减去3乘以2是多少?
  • 小问题:什么味道更好,蟾蜍或冰棒?

也许我只是在这里倾斜的风车,但我想有一个资源密集度较低,非基于图像的

思想?


我最喜欢的验证码:

Captcha


我开发的一种方法似乎非常有效(尽管我可能没有你那么多评论垃圾),就是有一个隐藏的字段并用一个伪造的值填充它,例如:

1
<input type="hidden" name="antispam" value="lalalala" />

然后我有一段javascript,它用页面加载的秒数每秒更新一次值:

1
2
3
4
5
6
7
8
9
10
11
12
13
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,我就让它通过。

1
2
3
4
5
6
7
If AntiSpam = A Integer
    If AntiSpam >= 10
        Comment = Approved
    Else
        Comment = Spam
Else
    Comment = Spam

理论是:

  • 垃圾邮件机器人程序将不支持javascript,并将提交它看到的内容。
  • 如果bot支持javascript,它将立即提交表单
  • 在发布之前,评论者至少已经阅读了一些页面。

这个方法的缺点是它需要javascript,如果您没有启用javascript,您的评论将被标记为垃圾邮件,但是,我确实检查了标记为垃圾邮件的评论,所以这不是问题。

对评论的回应

@mrass类比:服务器端方法听起来是一个很好的主意,与在JavaScript中执行完全相同。好电话。

@阿维:我知道这个方法很容易受到直接攻击,正如我在博客上提到的。然而,它将保护您的普通垃圾邮件机器人盲目提交垃圾的任何形式,它可以找到。


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

只是一个想法。


The advantage of this approach is that, for most people, the CAPTCHA won't ever be visible!

我喜欢这个想法,难道我们没有任何方法可以直接进入代表系统吗?我的意思是,任何一个有100个代表的人都可能是人。所以如果他们有代表,你甚至不必费心做任何关于验证码的事情。

那么,如果他们没有,那么发送它,我相信它不会花那么多的帖子达到100和社区将立即潜水在任何人似乎是与攻击性标签垃圾邮件,为什么不添加一个"报告垃圾邮件"链接,在200下载模式?获得其中3个,Spambot成就解锁,再见;)

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


蜜罐验证码怎么样?


避免任何时候最糟糕的捕获。

Trivia is OK, but you'll have to write each of them :-(

一定要有人来写。

你可以用recaptcha打印单词的方式来做一些琐碎的问题。它提供了两个词,一个知道答案,另一个不知道答案-在第二个答案足够多之后,它现在也知道答案了。问两个小问题:

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

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

当然,这可能需要与其他技术相结合,例如计时器或计算机密。问题需要轮转/撤销,因此为了保持问题的供应,您可以特别添加:

输入您明显的问题:

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

现在,为了让运行StackOverflow游戏机器人的人放慢速度,您可以按IP地址旋转问题-这样相同的IP地址就不会得到相同的问题,直到所有问题都解决为止。这会减慢建立已知问题字典的速度,迫使机器人的人类所有者回答你所有的琐事问题。


在当前的概念化中,captcha被破坏,并且常常很容易被绕过。现有的解决方案都不能有效地工作-Gmail最多只能成功20%。

事实上,情况比这糟糕得多,因为统计数据只使用OCR,而且还有其他方法可以解决这一问题——例如,Captcha代理和Captcha农场。我最近在OWASP上做了一个关于这个主题的演讲,但是PPT还没有上线…

虽然Captcha无法以任何形式提供实际的保护,但如果您想要阻止垃圾车的随意驾驶,它可能足以满足您的需要。但这并不能阻止半专业的垃圾邮件发送者。

通常,对于具有任何保护价值的资源的站点,您需要一种三方面的方法:

  • 仅限制来自已验证用户的响应,不允许匿名发布。
  • 最小化(而不是防止)来自认证用户的垃圾帖子-例如基于声誉的。一个人类的调停者也可以在这里帮助你,但是你还有其他的问题——即淹没(甚至淹没)调停者,一些网站更喜欢开放……
  • 使用服务器端的启发式逻辑来识别类似垃圾邮件的行为,或者更好的非人类行为。

Captcha可以在第二个方面帮上一点忙,仅仅是因为它改变了经济性——如果其他方面都到位了,就不再需要费心突破Captcha(最低成本,但仍然是成本)来成功处理如此少量的垃圾邮件了。

再说一次,不是所有的垃圾邮件(和其他垃圾)都是由计算机生成的-使用Captcha代理或农场,坏人可以有真正的人向你垃圾邮件。

Captcha代理是指他们将您的图像提供给其他网站(如色情、游戏等)的用户。

Captcha农场有许多廉价劳动力(印度、远东等)来解决这些问题…通常每解决1000个captchas需要2-4美元。最近在易趣上看到了这个帖子…


我在朋友的网站上见过一次。他以20美元的价格把它卖了。这是ASCII艺术!

http://thephpro.com/products/captcha/

1
2
3
4
5
6
7
  .oooooo.         oooooooo
 d8P'  `Y8b       dP"""""""
888      888     d88888b.  
888      888 V       `Y88b '
888      888           ]88  
`88b    d88'     o.   .88P  
 `Y8bood8P'      `8bd88P'


So, CAPTCHA is mandatory for all users
except moderators. [1]

真是太蠢了。所以会有用户可以编辑网站上的任何帖子,但没有验证码就不能发布?如果你有足够的代表投反对票,你有足够的代表没有验证码发布。如果必须的话,把它调高。此外,还有许多垃圾邮件检测方法,你可以使用没有图像识别,所以它甚至为未注册的用户,它将永远没有必要填写这些上帝遗弃的验证码表格。


不过,要确保这不是谷歌能回答的问题。这也显示了一个问题——操作顺序!


如何利用社区本身来反复检查这里的每个人都是人,比如像信任网一样的东西?为了找到一个真正值得信任的人来启动网络,我建议使用这个验证码来确保他绝对是100%的人。

RapidShare Captcha-Riemann假说http://codekiephire.eu/kram//uuuRapidShareu Captcha2.jpg

当然,他很可能会忙于准备菲尔兹的奖牌演讲来帮助我们建立信任网,但是…


阿西拉是有史以来最可爱的船长。


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

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

等。

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

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

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


我一直在使用以下简单的技术,这不是万无一失的。如果有人真的想绕过这一点,那么很容易就能看到源代码(即不适合Google Captcha),但它会愚弄大多数僵尸。

添加2个或多个这样的表单域:

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

然后使用CSS隐藏它们:

1
2
3
.hideme {
    display: none;
}

在提交时,检查这些表单域中是否包含任何数据,如果这些数据确实未能通过表单发布。其理由是机器人程序将读取HTML并尝试填充每个表单字段,而人类不会看到输入字段并将其单独保留。

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


虽然我们都应该知道基本的数学知识,但数学难题可能会引起一些混乱。在你的例子中,我确信有些人会用"8"而不是"1"来回答。

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

例如,ssdfatwerweajhcasdakkoghefdhrffghlfgdhowfgh

在这种情况下,"堆栈"就是验证码。这个想法显然有许多不同之处。

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

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


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

你得说哪一个是猫或狗,机器不能这样做。http://research.microsoft.com/asirra/

是一个凉爽的。


尽管开始了类似的讨论:

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

一个更好的验证码控制(看马-没有图像!)

你可以在我们的建筑检查搜索中看到它的作用。

您可以查看源代码并看到验证码只是HTML。


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

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

这样做是为了让有人自定义程序一个机器人到你的网站,这可能不值得努力。如果他们这样做了,你只需改变问题。


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

我更喜欢可以在服务器端执行的bot检测方法。由于您有有效的用户(多亏了OpenID),您可以阻止那些不"行为"的用户,您只需要识别bot的模式并将其与典型用户的模式匹配,然后计算差异。

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

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

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

当然,这些参考大多指向视频游戏机器人检测,但这是因为这正是我们小组题为"机器人战争:机器人识别的游戏中探索。这本书没有出版,也没有什么,只是一个学校项目。如果你感兴趣,我可以发电子邮件。但事实是,即使它是基于视频游戏机器人检测的,您也可以将其归纳到Web上,因为有一个用户附加到了使用模式上。

我同意Musigenesis的这种方法,因为它是我在我的网站上使用的方法,并且工作得很好。不可见的验证码过程是阻止大多数脚本的一种不错的方法,但这仍然不能阻止脚本编写器对您的方法进行反向工程,并"伪造"您在javascript中寻找的值。

我会说,最好的方法是:1)建立一个用户,这样当他们不好的时候你可以阻止;2)识别一个算法,检测典型模式与非典型模式的网站使用;3)相应地阻止该用户。


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

避免OCR的第一个想法

一个对用户有隐藏部分的验证码,但完整的图像是两个代码在一起的,所以OCR程序和验证码场读取包含可见部分和隐藏部分的图像,尝试对两者进行解码,但未能提交…-我已经准备好修复那个问题并在线工作。

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

第二个让它更容易的想法

一个包含许多单词的页面,人类必须选择正确的单词。我也创造了这个,很简单。这些词是clicable图像,用户必须点击右边的一个。

网址:http://www.planethost.gr/manywords.gif

第三个想法,没有图像

与上一个相同,但带有分隔符和文本或小图标。用户必须只点击一个正确的DIV/LETTER/IMAGE,无论是什么。

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

最后的想法-我称之为ciclecaptcha

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

http://www.planethost.gr/ciclecaptcha.gif网站

欢迎批评。


最好的验证码!也许你需要像这样的东西注册,以保持riff抽奖。


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

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

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


Very simple arithmetic is good. Blind people will be able to answer. (But as Jarod said, beware of operator precedence.) I gather someone could write a parser, but it makes the spamming more costly.

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

  • 随机散粒和可能支持它们的人类散粒;以及
  • 僵尸创建游戏栈溢出
  • 使用简单的算法,您可以击退威胁1,但不能击退威胁2。


    简单的文本听起来不错。贿赂社区来做这项工作!如果你像我一样相信,那么rep points衡量用户帮助站点成功的承诺,那么提供信誉点来帮助保护站点不受垃圾邮件发送者的伤害是完全合理的。

    一个简单的问题和一组正确的答案的每一个贡献提供+10的声誉。这个问题应该适当地远离(编辑距离)所有现有的问题,如果人们不能回答它,声誉(和问题)应该逐渐消失。假设正确答案的失败率超过20%,那么提交者在每个错误答案中损失一个信誉点,最多15个。所以如果你提交了一个错误的问题,你现在得到+10,但最终你会得到-5。或者让一个样本的用户投票决定验证码问题是否是一个好的问题是有意义的。

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


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

    • ASCII文本验证码:/(u)//
    • 数学难题:7减去3乘以2是多少?
    • 小问题:什么味道更好,蟾蜍或冰棒?

    除了在页面的CSS隐藏部分放置完全相同的验证码之外——蜜罐创意。这样,你就有了一个地方,你期望得到正确的答案,而另一个地方,答案应该是不变的。


    我用一个简单的"留空这个字段:"字段获得了令人惊讶的好结果。机器人程序似乎可以填充所有内容,特别是当你将字段命名为"url"时。再加上严格的裁判检查,我还没有让机器人通过。

    请不要忘记这里的无障碍性。很多使用屏幕阅读器的人都无法使用Captchas。简单的数学问题,或者非常琐碎的琐事(我喜欢"天空是什么颜色"的问题)对视力受损的用户更友好。


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

    Captcha

    有可能有人构建语法检查器来绕过这个问题,但是绕过验证码要做的工作要多得多。不过,你有一个相关的验证码的想法。


    1)人类解决方案

    这里提到的所有解决方案都被人类解决方法所规避。一个专业的spambot可以保持数百个连接,当它无法自己解决captcha时,它会将屏幕截图传递给远程人类解决方案。

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

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

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

    投票最多的答案是:

    • *"理论是:
      • 垃圾邮件机器人程序将不支持javascript,并将提交它看到的内容。
      • 如果bot支持javascript,它将立即提交表单
      • 评论人在发布""之前至少阅读了部分页面。*

    以及蜜罐答案和这条线索中的大多数答案都是明显错误的。我敢说他们是注定要受害的方法

    大多数Spambot都是通过本地和远程的javascript浏览器(补丁和管理)工作的,这些浏览器来自不同的IP(不同的国家),它们非常聪明,可以绕过蜂蜜陷阱和蜜罐。

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

    3)概念上的新方法

    对不起,我把这部分删掉了


    对服务器的加密nonce进行Ajax查询。服务器返回包含nonce的JSON响应,并设置包含nonce值的cookie。在javascript中计算nonce的sha1散列,将值复制到隐藏字段中。当用户发布表单时,他们现在用nonce值发送cookie。计算cookie中nonce的sha1散列值,与隐藏字段中的值进行比较,并验证您在过去15分钟内生成了nonce(memcached适用于此)。如果所有的检查都通过了,请发表评论。

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

    理论上,这可以通过默默无闻来证明安全性,但在实践中,这是极好的。

    我从来没有见过一个垃圾邮件发送者试图打破这一技术,尽管可能每隔几个月我就会收到一个手工输入的关于主题的垃圾邮件条目,这有点奇怪。


    有人还建议使用Raphael JavaScript库,它显然可以让您在所有流行的浏览器中使用客户机:

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

    …但这对我的


    这里有一些解决方案,claimed从来没有破碎的机器人。我认为《冰与那些问题,你也永远不会知道许多人们不去处理过去的"验证码"或。

    一个网站massively不能成为用户友好的人。它似乎是做业务的收购价格(在互联网上,你有两个问题与一些垃圾邮件档案工作手册。验证码(或类似的系统),把用户的资料。验证码是比不全。

    admittedly stackoverflow,有一个非常knowledgeable受众,所以很多有创造性的解决方案,可以使用。但更多的选矿厂的网站,你可以使用什么真的是人们都只使用两个或其他的,只是因为你会失去他们的网站和混乱的交通。在一般情况下,验证码不应该停止对全被调谐的机器人,或其他的攻击向量。这让我太难的挑战为合法用户。开始了,使它更容易和难,直到你有限量的垃圾邮件somewhat manageable A级,但不多。

    鸭,终于,我想回来,两个图像为基础的解决方案:你不需要创建一个新的图像的每一个小时。你可以预先create a number of大他们(也许几千?)然后变慢,这在时间上。例如,《expire 100 oldest Images每10分钟或一小时和replace看到他们有一个新的酮。对于每一个请求,选择一randomly captcha从整体上。

    酸性,这不会为0.8 A为导向的攻击,但在这里是上述很多次之前,必须验证码不会。它将足以阻止它的两个随机的机器人,但。


    我不得不承认,我没有对抗音标的经验,也不知道它们有多复杂。也就是说,我在jquery文章中没有看到任何不能完全在服务器上完成的事情。

    要重新表述jquery文章中的摘要,请执行以下操作:

  • 在服务器上生成联系人表单时…
  • 抓住当前时间。
  • 将这个时间戳加上一个秘密词组合起来,生成一个32个字符的"哈希",并将其作为cookie存储在访问者的浏览器中。
  • 将哈希或"令牌"时间戳存储在隐藏的表单标记中。
  • 当表单被回发时,时间戳的值将与存储在cookie中的32个字符的"token"进行比较。
  • 如果信息不匹配或丢失,或者时间戳太旧,请停止执行请求…
  • 另一种选择是,如果您想使用传统的图像验证码,而不必在每次请求时生成它们,那么就可以在脱机状态下预先生成它们。然后您只需要随机选择一个与每个表单一起显示。


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

    启用javascript:检查发布时间减去加载时间是否大于HumanisPeryFastReader。

    禁用javascript:HTTP请求开始的时间减去HTTP响应结束的时间(存储在会话或隐藏字段中)大于HumanisPeryFastReader加上NetworkLatency时间2。

    在这两种情况下,如果返回true,则重定向到图像验证码。这意味着大多数时候,人们不必使用图像验证码,除非他们是非常快的读者或垃圾邮件机器人设置为延迟响应。

    请注意,如果使用隐藏字段,我将为它使用随机ID名称,以防bot检测到它正被用作验证码并尝试修改该值。

    另一种完全不同的方法(仅适用于javascript)是使用jquery sortable函数来允许用户对一些图像进行排序。也许是一个3x3的小拼图。


    这一个使用1px块生成看起来像图像但纯HTML/CSS的图像。有关示例,请参见此处的链接:http://www.nujij.nl/registeren.2051061.lynkx?_ showinpopup=真


    基于CSS的验证码怎么样?

    1
    2
    3
    4
    5
    <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>

    显示"abcde"。当然,使用定制的机器人仍然很容易。


    回顾一下大学赞助并帮助数字化书籍。

    We generate and check the distorted images, so you don't need to run costly image generation programs.


    验证码滤波器的理论思想。向用户提出一个问题,服务器可以以某种方式回答这个问题,而用户也可以回答这个问题。共享答案成为用户和服务器都知道的一种公钥。

    堆栈溢出相关示例:

    用户XYZ有多少信誉点?

    提示:在屏幕的侧面查看此信息,或者按照此链接操作。可以从已知的堆栈溢出用户中随机抽取该用户。

    更一般的例子:你住在哪里?你住的地方星期六九点的天气怎么样?提示:使用雅虎天气和提供湿度和一般条件。

    然后用户输入答案

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

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

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

    问题的类型可能会有所不同。但是,这个想法是,您需要对一些事实的组合进行处理,即一个人必须查找这些事实,而服务器则可以进行琐碎的查找。这个过程是由两部分组成的对话,需要一定程度的相互理解。这是一种反向转弯试验。有人证明它能提供一个可计算的数据块,但要产生可计算的数据需要人的知识。

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

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

    也许数据库可以由bot填充,但bot需要一些智能来将相关事实组合在一起。服务器端的数据库或查找表可以系统地删除明显的类似垃圾邮件的属性。

    我确信在实现中有缺陷和细节需要解决。但这个概念似乎是合理的。用户提供了服务器可以查找的事实组合,但是服务器可以控制应该请求的组合类型。这些组合可以是随机的,服务器可以使用各种策略来查找共享的答案。真正的好处是,您要求用户在他们的答案中提供某种类型的剖析和他们自己的启示。这使得僵尸程序更难系统化。许多计算机开始在许多服务器和验证码表单上使用相同的答案,例如

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

    这样,整个网络就可以对这种响应进行分析,并将其用于阻止僵尸程序,从而有效地使经过几次迭代后的自动化变得一文不值。

    当我更多地思考这个问题时,执行一个基本的阅读理解测试来评论博客文章会很有趣。博客文章结束后,作者可以向读者提出问题。这个问题对于每个博客文章都是独一无二的,而且它还有一个额外的好处,那就是要求用户在评论之前实际阅读。你可以在文章的末尾用存储在服务器端的答案来写这个简单的问题,然后用一组无意义的问题来盐化数据库。

    这篇文章讨论过紫色验证码技术吗?服务器端应答(错误,否)

    这是关于Captchas的帖子吗?服务器端回答(正确,是)

    这是关于迈克尔杰克逊的帖子吗?服务器端应答(错误,否)

    以随机顺序提出几个问题,使顺序具有重要意义似乎很有用。例如,上面的内容将=否、是、否。改变顺序,将一些无意义的问题混合起来,回答"否"和"是"。


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


    mixtriot.com使用一个ascii艺术验证码(不确定这是否是第三方工具)。

    1
    2
    3
    4
    5
    6
    7
     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


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

    如果你的站点很受欢迎(比如stackoverflow),并且喜欢编码的人会挂在上面(比如stackoverflow),那么很有可能有人会把"破解验证码"作为一个挑战,用一些简单的javascript+greasemonkey很容易获胜。

    因此,例如,一个隐藏的彩色字母方法建议在线程的某个地方(一个很酷的想法,想法,实际上),可以很容易地通过对以下示例行的简单分析来打破:

    1
    2
    3
    4
    5
    6
    7
    8
    9
     <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>

    同上,解析这很容易:

    1
    3 + 4 = ?

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

    同样,如果你有一系列的问题(what color is an orange?how many dwarves surround snowwhite?),除非你有成千上千的问题,你可以选择其中的30个,使问题答案散列,并使脚本bot重新加载页面,直到找到30个问题中的一个。


    Please call xxxxx xxxxxxx, and let's have a talk about the weather in your place.

    但是,现在太快了,而且太注重利润,即使是与我们选择的服务提供商打一通电话,对服务提供商来说也太贵了(时间是宝贵的)。

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

    悲伤的时光…


    如果你做了一个有不同颜色字母的验证码,并且要求用户只输入特定颜色的字母,那该怎么办?


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


    在我的博客上,我不接受评论,除非javascript打开,然后通过Ajax发布。它将所有机器人都拒之门外。我唯一收到的垃圾邮件来自人类垃圾邮件发送者(他们通常从网站复制和粘贴一些文本来生成评论)。

    如果必须使用非javascript版本,请执行以下操作:

    以下字符串[y]中[x]的[some operation]

    如果给定一个足够复杂的用regex无法解决的[x]和[y],就很难编写一个解析器。

    计算[狗,危险,可跳舞,猫]中的短单词数=2

    [狗,危险,可跳舞,灾难]中最短的词是什么=狗

    [鱼、米、箱、堆垛溢出]中以x结尾的单词是什么=箱

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

    所有这些都可以很容易地在服务器端完成;如果选项数量足够大并且频繁地旋转,那么很难获得所有选项,而且决不能每天给同一个用户一次以上的相同类型或其他类型的选项。


    如果您希望使用基于ASCII的方法,请看一下集成figlet。您可以制作一些自定义字体,并对每个字符进行一些字体选择随机化,以增加entrophy。字距调整使文本在视觉上更令人满意,并且对于bot来说,逆向工程有点困难。

    例如:

    1
    2
    3
    4
        ______           __     ____               _____          
       / __/ /____ _____/ /__  / __ \_  _____ ____/ _/ /__ _    __
      _\ \/ __/ _ `/ __/  '_/ / /_/ / |/ / -_) __/ _/ / _ \ |/|/ /
     /___/\__/\_,_/\__/_/\_\  \____/|___/\__/_/ /_//_/\___/__,__/

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


    这将是每次注册而不是每次发布,对吗?因为即使使用jquery自动化,这也会扼杀站点。


    如果您在过去倾向于使用问答解决方案,我会向用户提供一个下拉列表,其中包含3-5个随机问题,用户可以从中进行选择,然后回答以证明他们是人类。列表在每次页面加载时的排序不同。


    您是否曾经计划为StackOverflow提供一个API,允许以编程方式操作问题/答案?如果是这样的话,基于captcha的保护将如何适应这种情况?

    通过Atom联合feeds提供丰富的只读界面,人们可以创建一些有趣的智能客户端/工具,用于组织和搜索StackOverflow的大量内容;我可以看到,除了Web界面之外,还具有提问和/或回答问题、投票和极其有用的功能。L.(尽管这可能不符合基于广告的收入模式。)

    我更希望看到stackoverflow使用启发式监视方法,试图检测恶意活动并阻止有问题的用户,但可以理解使用captcha可能是一种更简单的方法,您的发布数据即将发布。


    我编写了一个PHP类,可以让您选择使用某类验证码问题(数学、命名、对立、完成),或者随机化使用的类型。这些问题大多数讲英语的孩子都能回答。例如:

  • 数学:2+5=
  • 命名:图片中的动物是___
  • 对立面:快乐的对立面是__
  • 完成:一头牛去___

  • 即使有了rep,仍然应该有某种类型的capcha,以防止恶意脚本攻击。


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

    另一个想法是制作一个这样的ASCII图像(从门户游戏结束序列):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
                                 .,---.
                               ,/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$;   .::,
                             .,    ..

    给用户一些选择,比如:是一个,谎言,心碎,蛋糕。


    如何使用样式化的HTML元素(如div)显示captchas?从矩形区域构建字母很容易,而且很难对其进行分析。


    修复语法错误captcha:

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

    括号和引号是随机删除的。

    僵尸可以自动检查语法错误,但他们不知道如何修复这些错误!


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

    我的所有解决方案都适用于中小型网站(就像本主题中的大多数解决方案一样)这意味着他们可以阻止垃圾邮件机器人发帖,除非他们为你的网站制定了一个特定的解决方案(当你大的时候)。

    我发现一个很好的解决方案是垃圾邮件机器人在你发布文章48小时前不会访问你的文章。由于新闻网站上的一篇文章在发布48小时后获得了大部分的浏览量,它允许未注册的用户在不输入验证码的情况下发表评论。

    我看到的另一个不错的验证码系统是由WebDesignBeach制造的。您有多个对象,必须将一个对象拖放到特定区域中。很有创意,不是吗?


    我相信大多数的页面的建立与控制(按钮、链接等),支mouseovers。

    • 而不是表现Images)和两种类型的用户问的内容,问的两个移动用户的鼠标在任何控制(取二阶随机控制(在任何按钮或链接。)
    • 适用于色彩和两个控制(一些随机的在线色)(小老鼠在JavaScript做的把戏)。
    • 然后让用户输入两种色彩,他/她看到网上有老鼠。

    这只是个不同的方法,在没有实际上用于实现这一方法。但这是不可能的。


    Ajax的奇特的验证码是基于图像的,除非你有两个拖科技滴基于形识别的信,而不是typlng /数包含在图像。


    我在运行一段时间的phpbb 2.0站点上发现了大量垃圾邮件问题(该站点现在已升级)。我在PBPBB论坛上安装了一个自定义的captcha mod,在一段时间内运行良好。我发现真正的解决方案是[在帐户创建页面上]将其与其他"必需"字段相结合。我补充说:地点和职业(平凡,但很容易知道)。机器人从未尝试填写这些,仍然假设验证码是每次尝试的失败点。


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

    1.给出单词或声音。"将鼠标移到屏幕左上角,单击橙色按钮"或单击此处,然后单击此处"(需要多步骤响应)任务完成后问题就解决了。选择已经在页面上的对象,让它们单击。至少完成两个操作。

    希望这有帮助。


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

    如果您像现在这样将表单放在内容页上,将无法工作,但是您可以显示/隐藏基于Noscript的特殊提交页的链接。对这样一小部分用户来说是一个小小的不安。


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

    Nobot控制(AjaxControlToolkit的一部分)。

    NoBot can be tested by violating any of the above techniques: posting back quickly, posting back many times, or disabling JavaScript in the browser.

    演示:

    http://www.asp.net/ajax/ajaxcontroltoolkit/samples/nobot/nobot.aspx


    在任何基于问题的验证码中都要注意文化偏见。

    智力测验中的偏倚


    你看过瓦吉斯吗?

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


    如果没有一个真正的验证码作为你的第一道防线,你是否仍然容易受到垃圾邮件发送者编写浏览器脚本的攻击(使用vb和ie很简单)?例如,加载页面、浏览DOM、单击提交按钮、重复…


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


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

    它也可以轻松地进行文本到数字的转换。

    似乎在so的渲染中有某种缺陷,因为它只在发布时显示第一个链接,即使预览工作正常。第二个链接是-转到谷歌,搜索"1*42"


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

    我知道这些都是用PHP编写的,但我相信你们聪明的人可以通过构建把它移植到你们最喜欢的语言上。


    显示九个随机的几何图形,并要求用户选择两个正方形或两个圆之类的图形,怎么样?应该很容易写,也很容易使用。

    没有什么比你不能正确阅读文本更糟糕的了…


    @罗布

    What about a honeypot captcha?
    Wow, so simple! Looks good! Although they have highlighted the accessibility issue.. Do you think that this would be a problem at SO? I personally find it hard to imagine developers/programmers that have difficulty reading the screen to the point where they need a screen reader?

    < /块引用>

    有些开发人员不仅是法律盲,而且是100%盲。手杖和帮手狗。我希望这个网站能以合理的方式支持他们。

    然而,有了蜜罐验证码,你也可以放置一个隐藏的DIV,告诉他们把字段留空。如果他们确实填写了错误消息,您也可以将其放入错误消息中,因此我不确定问题的可访问性到底有多大。当然不是很好,但可能更糟。


    我想他们正在研究节流。只需为500+rep的用户禁用captcha,并为攻击者重置rep,就更有意义了。


    @兰斯

    Who says you have to create all the images on the server with each request? Maybe you could have a static list of images or pull them from Flickr. I like the"click on the kitten" CAPTCHA idea. http://www.thepcspy.com/kittenauth.

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

    这实际上也是一个难题,因为要面对一系列的挑战是非常困难的。


    @PC1OAD1etter我还注意到在完成我的帖子之后。然而,它只是一个想法,而不是实际的实现。改变字体或使用不同的颜色而不是粗体/斜体很容易解决可用性问题。


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

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


    回答原始问题:

    • ASCII是坏的:我必须眯着眼睛才能找到"哇"。这是正确的吗?它可以是"VVOV"或其他什么东西;
    • 非常简单的算术很好。盲人可以回答。(但正如Jarod所说,当心运算符优先级。)我认为有人可以编写一个解析器,但这会使垃圾邮件的成本更高。
    • 琐事没问题,但你得把它们写下来:-(

    我看过动物的照片[是什么?]对漫画的投票使用了一张照片,上面写着一个人物的名字[输入名字]。不可能解析,对盲人不好。

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

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


    我有几个解决方案,一个需要JavaScript,另一个不需要。两者都比7+4更难被击败,但他们并不像《重述》那样难在海报上看到。我提出了这些解决方案,因为我需要一个Appengine的验证码,它提供了一个更受限制的环境。

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


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

    人们在注册时发送小额付款,确认后可以返回。你不能回到你花在找出验证码上的时间。


    你试过http://sblam.com/en.html吗?据我所知,它是验证码的一个很好的选择,而且对用户来说是完全透明的。


    音频怎么样?提供一个音频样本,其中有一个声音在说什么。让用户输入他听到的内容。他认为这也可能是一种良好的效果。

    作为一个额外的好处,这可以帮助语音识别器创建封闭的字幕,就像recaptcha帮助扫描书籍一样。

    可能很蠢…我刚想到这个主意。


    把它绑在聊天室里是做验证码的一种有趣的方式。一种活生生的图灵测试。很明显,这取决于有人在网上问问题。


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

    例子:"从-s=hihiuhi@ewfwef.cfwe提取域名"

    用python回答:"返回=等"

    其他子站点的类似领域特定知识。

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

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

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


    我有一个vbulletin论坛,里面有很多垃圾邮件。添加一个额外的规则可以解决所有问题;让人们输入单词的大写字母。由于我们的网站名为"trefpuntmagic",他们必须输入"tpm"。我知道这不是动态的,如果一个垃圾邮件制造者真的想垃圾邮件我们的网站,他们可以使周围的工作,但我们只是许多vbulletin论坛的目标之一,这是一个简单的解决办法。


    这是我的验证码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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?路易斯安吉特

    要查看操作,请单击"添加注释"。


    在仇恨的想法时,我看到了一个关于该视频的人(《冰视频关于如何使用人类的两个通带的两个游戏Images)建立一个验证码系统。一个这样的系统可以使用两个带Images(可能为一些其他用途),然后使用统计(两个选择:suitable标签使用的验证码。

    说的形象在大于90%的人会认为《形象和"猫"或"skyscraper"。一个可能是目前图像要求的最明显特征的图像,将是支配你的形象。

    这是我们显示出了SO,但有人会找到它有趣的想法:)


    我真的很喜欢这个方法用于在线验证码本网站:http:/ / / / www.thatwebguyblog.com后被忘却的_ _ timesaver _ Photoshop _ droplets # commenting _ AA


    把它扔出去。我的一个联系表格上有一个简单的数学问题

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

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


    我喜欢"大ROM网络"中使用的验证码:链接文本

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


    只使用ASP.NET Ajax NoBot怎么样?这对我来说似乎很管用。这不是令人敬畏的伟大,而是体面的。


    令人困惑的一件事是,谷歌,显然是世界上拥有最多CS博士学位的公司,如何打破他们的验证码,似乎什么都不做。


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

    这将减少服务器上的处理和通过线路传递的数据量。


    我们的表单垃圾邮件在实现了前面提到的蜜罐验证码方法后被大幅削减。我相信自实施以来我们一直没有收到任何信息。


    我想定制的验证码是你最好的选择。这样,它需要一个专门针对的bot/script来破解它。这个努力因素应该减少尝试的次数。毕竟人类是懒惰的


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

    (适当地给单词上色)


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

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

    =)


    把一个数学问题作为一个图像贴出来,为了清晰起见,可能要用偏执的方式。

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

    1
    (2+5)*2

    我知道排除僵尸的一种方法是将密钥存储在用户的cookie中,如果密钥或cookie不存在,则假定它们是僵尸,忽略它们或返回图像验证码。这也是防止为机器人程序创建大量会话/跟踪的一个非常好的方法,因为这些会话/跟踪会给您的数据库增加很多噪声,或者增加系统性能的开销。


    这些javascript解决方案中有很多能与屏幕阅读器一起工作吗?图像减去一个有意义的alt属性可能会破坏wcag。


    我认为我们必须假设这个网站将定期受到目标攻击,而不仅仅是一般的漂流机器人。如果它成为程序员搜索的第一个热门话题,它会引来很多麻烦。

    对我来说,这意味着任何验证码系统都不能从重复的问题列表中提取,人类可以手动将这些问题输入机器人程序,而且机器人程序无法访问这些问题。


    验证码检查你是人还是电脑。问题是在那之后,计算机需要判断你是否是人类。

    所以解决方案是让一个用户填写一个验证码,让下一个用户检查它。问题当然是时差。


    检查一下是否启用了javascript怎么样?

    任何使用此网站的人都肯定会启用它。据人们所说,Spambots不会启用javascript。


    Mollom是另一个可能感兴趣的Askimet类型服务。来自写Drupal/Run Acquia的人。


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

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


    我推荐一些小问题。并不是每个人都能理解字母的ASCII表示,而且多个运算的数学问题会变得混乱。


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

    这给用户带来了"要么/要么"的需求——要么你必须启用javascript,要么你必须登录到你选择的IM服务。虽然它可能不像上面的其他一些解决方案那样灵活,但它对绝大多数用户都有效。

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

    赞成的意见:

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

    欺骗:

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