Google reCAPTCHA v2是如何在幕后运作的?

318

本文涉及Google ReCaptcha v2(而非最新版本)

最近,谷歌推出了一种简化的"验证码"验证系统(视频),使用户只需点击即可通过"验证码"。

但是,它如何仅凭一个点击就区分机器人和人类?

根据此答案的说法(假设实现类似),首先"recaptcha"生成一个隐藏密钥并将其附加到隐藏输入元素上,并懒惰地呈现一个复选框(不是实际的复选框,而是

)以及具有相同密钥的异步请求(XHR),当单击时,发送到Google后端服务器将其标记为有效的验证密钥(即在提交表单时需要验证的密钥)。

但是为什么机器人无法自动进行该点击(至少基于浏览器的机器人无法)?

这可能是如何工作的?


1
可能类似于他们向人类发送简单的验证码,向机器人发送困难的验证码。 - mukunda
1
我理解的方式是 - 仍然存在验证码,但除非您发出可疑请求 - 否则您永远不必解决它。 - Kelm
10
抱歉,我只能翻译中文到其他语言。如果您需要我翻译一段中文文本,请提供该文本。 - TechLife
@大家等一下,为什么我们要在这里浪费时间!当我们访问一个启用了验证码的网站时,我们可以将这些数据离线保存!为什么我们不反向工程它呢?如果是SWF对象,我们可以反编译它,如果是JavaScript那就更简单了。请做点工作吧,我想要对一些网站进行垃圾信息发送。 - TechLife
14
@TechLife 确实!似乎已经迁移到 https://github.com/neuroradiology/InsideReCaptcha 了?提醒自己:始终fork这些东西。 - Ciro Santilli OurBigBook.com
显示剩余3条评论
5个回答

209

这只是猜测,但基于谷歌提到他们使用的“风险分析引擎” (http://googleonlinesecurity.blogspot.com/2014/12/are-you-robot-introducing-no-captcha.html)

我会认为它会观察您点击之前的行为方式、光标在前往复选框时的移动方式(有机轨迹/加速度)、点击哪个部分的复选框(随机位置或每次都是正中心)、浏览器指纹、Google cookies和内容、与您的指纹或账户相关联的点击位置历史记录等。

在这样一种连续学习模式检测引擎下,相当难以伪造“有机”的行为方式,使其欺骗该引擎。在不确定的情况下,它仍然会提示您匹配实际的CAPTCHA字符串。


77
看起来是正确的,这应该能解释为什么我在PSVita上总是需要用摇杆输入字符串。它不像普通鼠标那样移动。 - Domino
3
我在想,如果有足够大量的记录下来的有机行为数据,谷歌会做出何种反应。 - Markus Malkusch
16
鼠标移动绝对不会对此产生影响。将光标放在复选框出现的位置上。在不移动光标的情况下导航到网站。单击复选框即可通过。 - Derek 朕會功夫
3
@Derek,我认为那不是任何证明。Cookie、IP 和许多其他因素可能会导致它们在返回鼠标移动之前让你通过。我不想测试它,但如果你使用新的电脑和 IP 地址并且完全不使用鼠标,我愿意打赌它肯定会失败。 - Caimen
15
请注意,您也可以切换到该选项卡并按空格键。 - JSideris
显示剩余13条评论

79
一篇新论文发布了,其中包含对reCAPTCHA进行的多项测试:

https://www.blackhat.com/docs/asia-16/materials/asia-16-Sivakorn-Im-Not-a-Human-Breaking-the-Google-reCAPTCHA-wp.pdf

一些亮点:

  • 通过浏览带有Google资源的网站,保持cookie活跃+9天,然后只需点击复选框即可通过reCAPTCHA;
  • 没有基于IP请求的限制;
  • 浏览器的用户代理必须是真实的,并且Google会对您的环境进行测试以确保它与用户代理匹配;
  • Google会测试浏览器是否能够渲染画布;
  • 屏幕分辨率和鼠标事件不会影响结果;

Google已经修复了cookie漏洞,并可能基于IP限制某些行为。

另一个有趣的发现是,Google在JavaScript中运行一个VM,混淆了大部分reCAPTCHA代码和行为。这个VM被称为botguard,并用于保护除reCAPTCHA之外的其他服务:

https://github.com/neuroradiology/InsideReCaptcha

更新2017年

最近一篇论文(8月份)发表在WOOT 2017上,成功解决了noCAPTCHA reCAPTCHA音频挑战的85%准确率:

http://uncaptcha.cs.umd.edu/papers/uncaptcha_woot17.pdf

2018年更新

Google推出了reCAPTCHA v3,看起来像是一个“预测人类得分引擎”,根据网站进行校准。它可以安装在网站不同页面上(就像Google Analytics脚本一样),帮助reCAPTCHA和网站所有者了解人类与机器人的行为模式,在填写reCAPTCHA之前。

https://www.google.com/recaptcha/intro/v3beta.html


4
鼠标事件不会影响结果。有趣的是,我认为(并且我相信很多人也这么认为),鼠标事件是影响结果的主要因素。我认为在移动设备上,用户不会使用复选框,而是被要求选择所有相似的图片,因为在触摸屏上无法进行鼠标移动。然而,重新查看介绍博客文章后,似乎不是这样的情况。也许选择图片是替代输入扭曲的文本,而不是替代勾选框。你(或任何人)知道reCAPTCHA是否允许在移动设备上简单地勾选一个框吗? - Nateowami
1
鼠标事件确实会影响结果。如果您按下“Tab”和“Enter”来选择复选框,它将显示图像验证码供您根据某个标准进行选择。 - mbomb007
2
@mbomb007 鼠标事件可能会影响结果,但按下 TabEnter 键不一定每次都能显示图片验证码。大多数情况下,按下 TabEnter 是被接受的。 - Manish Ojha

29

我的机器人已经成功通过了ReCaptcha测试。

这是我的解决方案:

让你的机器人执行以下步骤:

首先编写一个人工鼠标移动函数,以类似B样条曲线的方式移动鼠标(请向我索取源代码)。这是最重要的一个步骤。

为了获得更好的结果,还可以使用像https://www.purevpn.com这样的VPN。

对于每个ReCaptcha,请执行以下步骤:

  1. 如果使用VPN,请先切换IP

  2. 清除所有浏览器Cookie

  3. 清除所有浏览器缓存

  4. 随机设置以下其中一种Useragents:

    a. Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)

    b. Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0

5 使用人工鼠标移动函数将鼠标从一个随机点移动到“我不是机器人”图像中,每次都在不同的10x10随机范围内进行移动。

  1. 然后以随机延迟单击:

    WM_LBUTTONDOWN

    WM_LBUTTONUP

  2. 截取图片验证码的屏幕截图

  3. 将截图发送到

    http://www.deathbycaptcha.com

    https://2captcha.com

并让它们去解决验证码。

  1. 在接收到来自验证码解决程序的点击坐标之后,使用你的人工鼠标移动函数移动并单击ReCaptcha图像

  2. 使用你的人工鼠标移动函数移动并单击ReCaptcha验证按钮

在75%的尝试中,Recaptcha都会被解决
谷歌好棒啊!
汤姆

2
为什么需要"Human Mouse Move Function"呢?它看起来在实现你的目标上是多余的。 - barbolo
11
“Human Mouse Move”功能是最重要的点。谷歌在验证码中检测鼠标速度、鼠标路径、鼠标按下和放开事件、点击位置、鼠标进入验证码等信息,并通过JavaScript将这些信息发送到谷歌数据库中,其中包含数百万真实的人类鼠标移动轨迹。在解释所有这些捕获的信息后,只有当谷歌算法确认是人类操作时,验证码才会被标记为已解决。 - Ingo
4
请检查这篇官方的Google博客文章:https://security.googleblog.com/2014/12/are-you-robot-introducing-no-captcha.html 谷歌表示:“为了应对这个问题,去年我们为reCAPTCHA开发了一个高级风险分析后端,该后端会综合考虑用户在CAPTCHA之前、期间和之后的整个交互过程,以确定该用户是否为人类。” - Ingo
8
第八步使用外部API,由人类代替您解决验证码,机器人不会解决任何问题。 - Andrea Lazzarotto
19
只有我这样想,还是其他人也觉得机器人编写者使用Stack Overflow来帮助解决(并辩论!)reCAPTCHA问题既令人不安又令人着迷? - Ogre Psalm33
显示剩余13条评论

3

由于这不是公开技术,所以我可以猜测一下。谷歌表示它是通过组合之前、期间和之后的信息来区分人类和机器人。但我更感兴趣的是最后一个复选框的点击。

假设POST数据(已解决的验证码)有一个名为指纹的字段,它是从用户行为计算出来的字符串。我认为可能还有一个关于该复选框位置的字段。我猜测此复选框位于由谷歌后端随机生成并由我的站点公钥加密的坐标系统中。因此,机器人可能会“猜测/计算”出有关此框的位置,但当站点所有者使用私钥进行GET查询以验证用户身份时,谷歌将解密坐标系统并确定用户是否在正确的位置单击。因此,在仅由谷歌和站点所有者拥有的随机坐标系统中,只有一个可能的正确点击位置(带有一些偏移量,它是一个正方形框)。


如果浏览器足够好以实际显示框并检测点击,那么为什么黑客机器人不能做同样的事情呢?但是,我可以将复选框的位置设置为非常精确的位置(小数点后),因此如果检测到具有相同小数位的单击,则意味着是一个机器人,它没有费心在单击位置上添加随机小数。但是,这仍然不是绝对可靠的。 - Domino
谷歌据说正在使用一种“学习”算法,以便如果具有相同特征的某些客户似乎采取了相同的一般路径和一般时间到达那里,并且每天发生了10万次,那么它们可能不是合法的。 - Allison
1
在模拟点击正方形区域方面应该相对容易。无论 Google 在发送数据前如何加密都没关系。 - Eugene C

1
请记住,谷歌也会与 reCaptcha 一起使用。
Canvas fingerprinting 

实现无需使用cookie即可唯一识别用户/浏览器!


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