检测用户是否为人类而无需使用验证码或用户代理

8
我有一个网站,为用户提供电子邮件加密服务,并尝试找出一种方法来检测用户是否是人还是机器人。我在探索PHP中的 $_SESSION,但很容易被绕过,我也对验证码、useragent或登录解决方案不感兴趣。你有什么建议吗?SO上有其他类似的问题,但我找不到直接的答案...
非常欢迎您提供帮助,谢谢大家!

13
我所有的网站都要求提交DNA样本才能注册。挡住了垃圾邮件机器人! - Timothy Strimple
2
您的使用描述过于不具体。一种通用(但不是万无一失)的方法是将原始表单的请求时间与提交时间进行比较。机器人会立即完成,而人类需要几秒钟的时间。 - mario
@mario 这听起来不是一个很好的主意。假设我试图向您发送垃圾邮件,并发现您的表单因为它们是即时提交而拒绝了我的机器人提交。对于机器人来说,实现随机延迟计时器将非常容易。 - Jared Ng
1
@Jared Ng:肯定可以想出一种解决方法(我并不自诩能理解垃圾邮件发送者的思维),但我认为垃圾邮件机器人往往会选择最简单的路径。可能有些垃圾邮件机器人会针对特定网站,但我怀疑通用的垃圾邮件机器人只是尽可能快地尝试许多网站。因此,延迟技术将阻止大部分机会主义垃圾邮件发送者。 - Mike
可能是检测“隐形”网络爬虫的重复问题。 - Jacco
6个回答

24
这是一个难题,从防止机器人攻击和易用性的角度来看,我所知道的解决方案没有一个是100%完美的。如果攻击者真的决心在您的网站上使用机器人,他们可能会成功。如果您采取措施让计算机程序无法访问您网站上的任何内容,那么人类也不会想要访问,但是您可以取得良好的平衡。
我的观点部分来源于作为网络开发人员的角度,更多地来自于另一方面的经历,为世界各地的客户编写了众多的网络爬虫程序。并非所有机器人都有恶意意图,它们可以用于自动化表单提交、填充医生办公地址数据库或分析股票市场数据等事情。如果您的网站在易用性方面设计良好,则不应该需要"使用户更轻松的"机器人,但是有时存在您无法预测的特殊需求。
当然,也有一些人具有恶意意图,您肯定希望尽可能保护您的网站。实际上几乎没有网站是无法以某种方式进行自动化的。大多数网站根本不难,但以下是我能想到的一些想法,包括其他答案或本页上的评论,以及我编写(非恶意)机器人的经验。
机器人的类型
首先,我应该提到有两种不同的类别可以将机器人分类:
一般用途的爬虫、索引器或机器人
专门为您的网站制作的特殊目的机器人
通常,一般用途的机器人是像搜索引擎的索引器,或者可能是某些黑客脚本,寻找要提交的表单,使用字典攻击来搜索易受攻击的URL,或类似的内容。它们还可以攻击"引擎站点",如WordPress博客。如果你的网站有良好的密码等安全保护措施,这些通常不会对你构成太大的风险(除非您确实使用WordPress,在这种情况下,您必须跟上最新版本和安全更新)。
而针对特定目的的机器人则就需要根据不同情况进行具体分析和防范。在本回答的其余部分中,我讨论的大多数都是这种机器人。
验证码
验证码是确保用户是人类的最常见方法,通常很难自动绕过。但是,如果您仅在用户创建帐户时要求一次输入验证码,例如,对于人类来说很容易通过它,然后将他们闪亮新的帐户凭据交给机器人自动使用系统。

我记得几年前,有一种相当复杂的系统可以“自动化”破解流行游戏网站上的验证码:建立了一个独立的网站,从游戏网站加载验证码,并将其呈现给用户参与众包。第二个网站的用户每解决一个正确的验证码都会得到某种奖励,而网站的所有者则能够利用他们通过众包获得的验证码数据自动化进行游戏网站的任务。

通常使用好的验证码系统可以保证一个事情:某处有一个人输入了验证码文本。在这之前和之后发生的事情取决于您对验证码验证频率的要求以及制作机器人的人的决心。

手机/信用卡验证

如果您不想使用验证码,则这种验证类型可能会对除最坚决的机器人编写者外的所有人都非常有效。虽然(就像验证码一样)它无法阻止已经验证过的用户创建和使用机器人,但您可以验证人类创建的帐户,并在滥用时阻止该电话号码/信用卡被用于创建另一个帐户。

Facebook和Craigslist等网站开始使用手机验证来防止机器人垃圾邮件。例如,为了在Facebook上创建应用程序,您必须在记录中拥有一个电话号码,通过短信或自动电话确认。除非您的攻击者可以访问大量活跃的电话号码,否则这可能是验证人类创建帐户以及他仅为大多数人创建有限数量帐户(一个)的有效方法。

信用卡也可用于确认人类正在执行操作并限制单个人类可以创建的帐户数量。

其他[效果较差]解决方案

日志分析

分析您的请求日志通常会揭示重复执行相同操作的机器人,或者有时使用字典攻击来查找您网站配置中的漏洞。因此,日志将告诉您该请求是由机器人还是人类发出的。这可能对您有用,但如果请求是在经过手机或信用卡验证的帐户上进行的,则可以锁定与有害请求相关联的帐户以防止进一步滥用。

数学/其他问题

可以通过快速的谷歌沃尔夫拉姆阿尔法搜索来回答数学问题或其他问题,这可以由机器人自动化执行。有些问题会比其他问题更难,但是大型搜索公司正在与您对抗,在理解此类问题方面让其引擎变得更好,从而使这成为用于验证用户是否为人类的不太可行的选项。

隐藏表单字段

一些网站采用一种机制,通过JavaScript将鼠标单击“提交”按钮时的坐标等参数添加到表单提交中。在大多数情况下很容易伪造这些参数,但是如果您在日志中看到一堆使用相同坐标的请求,那么它们很可能是机器人(尽管聪明的机器人可以轻松地为每个请求提供不同的坐标)。
JavaScript Cookies:由于大多数机器人不会加载或执行JavaScript,因此使用JavaScript设置Cookie而不是使用“set-cookie”HTTP头部将使大多数想成为机器人制作者的人生活略微困难。但并不难以防止开发人员找出如何生成与JavaScript生成相同值的cookie,并手动设置cookie。
IP地址:仅使用IP地址无法告诉您用户是否为人类。一些网站使用IP地址来尝试检测机器人,简单的机器人确实可能显示为来自同一IP的请求。但是IP地址很便宜,使用Amazon的EC2服务或类似的云服务,您可以生成一个服务器并将其用作代理。或者生成10个或100个并将它们全部用作代理。
UserAgent字符串:爬虫程序中易于操纵,无法指望它标记试图不被检测到的机器人。将UserAgent设置为一个主要浏览器发送的相同字符串很容易,并且甚至可以在几个不同的浏览器之间轮换。
复杂的标记:我曾经为一个由框架组成的网站编写过最困难的机器人,每个页面都包括几层嵌套的框架……大约有10个层次,在每个页面上,每个框架的“src”都是相同的基础控制器页面,但具有执行哪些操作的不同参数。操作的顺序很重要,所以很难搞清楚正在发生的一切,但最终(经过一周左右)我的机器人起作用了,因此,虽然这可能会阻止某些机器人制造商,但对所有机器人制造商都没有用处。而且它可能会使您的网站难以维护。
免责声明和结论:并非所有机器人都是“坏的”。我制作的大多数爬虫/机器人都是为了帮助用户自动化一些在网站上进行的过程,例如数据输入,这些过程手动完成太繁琐。因此,让繁琐的任务变得简单!或者,为您的用户提供API。可能阻止某人为您的网站编写机器人的最简单方法之一是提供API访问。如果提供了API,则某人创建爬虫的可能性要小得多。您可以使用API密钥来控制某人使用它的程度。
为了防止垃圾邮件发送者,某种组合的验证码和通过手机号或信用卡验证帐户的方法可能是最有效的方法。添加一些日志分析功能以识别和禁用任何恶意个性化机器人,您应该处于非常良好的状态。

3

我曾经看到/使用过一个用书写数字进行简单算数问题的方法,例如:

请回答以下问题以证明您是人类: “两加四等于多少?”

还有类似的需要阅读的简单问题:

“什么是人类最好的朋友?”

您可以提供无尽的问题,如果试图访问的人不熟悉主题,那么这个方法对于所有读者都是可访问的等等。


5
这也是一种验证码,只不过不是基于图像的验证码。 - Mchl
1
如果你将验证码定义为区分人类和机器的认知任务(我承认这是一个非常合理的定义),那么对于OP问题的任何解决方案都将是一个验证码。 - Michael Lorton
@Malvolio 不一定。强制登录是解决 OP 问题的一种方法,不需要用户思考。 - Jared Ng
3
"它(turtles all the way down)就是这样。" 如何让用户在不思考的情况下创建登录信息,以及如何确定登录信息不是由机器人制造的? - Michael Lorton
3
@Malvolio: 采用老派方式。告诉他们亲自携带申请表,并由两位证人陪同;) - Mchl
显示剩余4条评论

3

公司使用验证码或登录的原因是有道理的。尽管验证码不太美观,但它们目前是区分机器人最准确、最少干扰用户的最佳方式。如果登录方案对您无效,恐怕唯一现实可行的解决方案就是使用验证码。


3
我最喜欢的方法是向“用户”展示一张猫或狗的图片,并问:“这是猫还是狗?”没有人会答错,电脑则有可能正确识别60%(因此您需要运行它多次)。有一个项目可以提供大量猫和狗的图片-此外,所有动物都可供领养,因此如果用户喜欢宠物,则可以领养它。
这是微软公司的一个项目,这让我感到认知失调,就像我发现Harry Reid喜欢Zydeco音乐或George Bush吸毒一样。哦,等等...

我会关注无障碍问题。这对于盲人或使用文本浏览器的人如何工作?不过,我确实喜欢宠物领养的想法。 - Mike

2
如果用户需要填写表单,蜜罐字段很容易实现,并且可以相当有效,但没有什么是完美的。在表单中创建一个或多个隐藏字段,如果它们在提交表单时包含任何内容,则拒绝该表单。垃圾邮件机器人通常会尝试填写所有内容。
您需要注意辅助功能。对于使用标准浏览器(字段不可见)的用户,隐藏字段可能不会被填写,但那些使用屏幕阅读器的用户可能会看到该字段。请确保正确标记它,以便这些用户不会填写它。例如,“请通过将此字段留空来帮助我们防止垃圾邮件”。另外,如果您拒绝了该表单,请务必提供有用的错误信息,以防已由人填写。

0
我建议获取Growmap反垃圾机器人WordPress插件,并查看您可以从中借用的代码或只是使用相同的技术。 我发现这个插件对于限制我的WordPress站点上的自动化垃圾邮件非常有效,我已经开始为我的ASP.NET站点调整相同的技术。
唯一无法处理的是人类复制和粘贴垃圾邮件。

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