检测用户是否为没有验证码或使用者的人

Ped*_*ito 8 javascript php ajax session captcha

我有一个网站,我正在为用户提供电子邮件加密,我正在试图弄清楚是否有办法检测用户是人还是机器人.我一直在挖掘PHP中的$ _SESSION,但它很容易绕过,我对captcha,useragent登录解决方案也不感兴趣,对我需要什么的想法?

在SO中还有其他与此非常相似的问题,但我找不到任何直接答案......

非常欢迎任何帮助,谢谢大家!

jch*_*hes 18

这是一个很难的问题,从机器人防御和可用性的角度来看,我所知道的任何解决方案都不会100%完美.如果您的攻击者确实在您的网站上使用机器人,他们可能会.如果你把事情做得足够远,使计算机程序访问你网站上的任何东西都不切实际,那么很可能没有人愿意,但你可以取得良好的平衡.

我对此的观点部分是作为一名网络开发人员,但从另一方面来看更是如此,为全世界的客户编写了大量的网络爬虫程序.并非所有机器人都有恶意,并且可以用于从表单提交自动化到填充医生办公地址数据库或分析股票市场数据.如果您的网站从可用性角度进行了精心设计,则不需要为用户"简化"的机器人,但有些情况下您可能无法计划特殊需求.

当然有些人确实有恶意,你肯定希望尽可能地保护你的网站.几乎没有网站无法以某种方式自动化.大多数网站都不是很难,但这里有一些想法,从本页的其他答案或评论,以及我写的(非恶意)机器人的经验.

机器人的类型

首先我要提一下,我会把机器人放入两个不同的类别:

  1. 通用爬虫,索引器或机器人
  2. 专用机器人,专门为您的网站执行某项任务

通常,通用机器人会像搜索引擎的索引器,或者可能是一些黑客的脚本,它们寻找要提交的表单,使用字典攻击来搜索易受攻击的URL,或类似的东西.他们还可以攻击"引擎网站",例如Wordpress博客.如果您的网站使用良好的密码等正确保护,这些通常不会给您带来太大的风险(除非您使用Wordpress,在这种情况下您必须跟上最新版本和安全更新) .

特殊用途的"个性化"机器人是我写的那种.专门为您的网站制作的机器人可能会非常像您网站的人类用户,包括在表单提交,设置Cookie等之间插入时间延迟,因此很难检测到它们.在大多数情况下,这是我在这个答案的其余部分所讨论的那种.

验证码

Captchas可能是确保用户是人形的最常用方法,通常它们很难自动绕行.但是,如果您在用户创建帐户时只需要将验证码作为一次性操作,例如,人们很容易通过它,然后将其闪亮的新帐户凭据提供给机器人以自动使用系统.

我记得几年前读过一个非常精细的系统来"自动化"破坏热门游戏网站上的验证码:建立了一个单独的网站,从游戏网站加载验证码,并将它们呈现给用户,在那里他们基本上是人群 - 采购.第二个站点上的用户将获得每个正确验证码的某种奖励,并且站点的所有者能够使用他们的众包验证码数据在游戏站点上自动执行任务.

一般来说,使用一个好的验证码系统可以很好地保证一件事:某个地方有人输入验证码文本.之前和之后会发生什么取决于您需要验证验证码的频率,以及制作机器人的人员的确定程度.

手机/信用卡验证

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

像Facebook和Craigslist这样的网站已经开始使用手机验证来防止机器人发送垃圾邮件.例如,要在Facebook上创建应用程序,您必须记录一个电话号码,通过短信或自动电话确认.除非您的攻击者能够访问大量活动电话号码,否则这可能是验证人员创建帐户的有效方式,并且他只创建了有限数量的帐户(一个适用于大多数人).

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

其他[效率较低]的解决方案

日志分析

分析您的请求日志通常会显示机器人重复执行相同的操作,或者有时使用字典攻击来查找站点配置中的漏洞.因此,日志会告诉您事后是否由机器人或人做出请求.这可能对您有用,也可能没有用,但如果请求是通过手机或信用卡验证帐户进行的,则可以锁定与违规请求相关联的帐户,以防止进一步滥用.

数学/其他问题

数学问题或其他问题可以通过快速googlewolfram alpha搜索来解答,这可以由机器人自动完成.有些问题会比其他问题更难,但是大型搜索公司在这里反对你,使他们的引擎更好地理解这样的问题,反过来使这个问题变得不那么可行,以验证用户是否是人.

隐藏的表单字段

一些站点采用一种机制,其中诸如鼠标点击"提交"按钮时的坐标等参数通过javascript添加到表单提交中.在大多数情况下,这些非常容易伪造,但是如果你在日志中看到使用相同坐标的大量请求,那么它们很可能是机器人(尽管智能机器人可以轻松地为每个请求提供不同的坐标).

Javascript Cookies

由于大多数机器人不加载或执行javascript,因此使用javascript而不是set-cookieHTTP标头设置的cookie 将使大多数潜在的机器人制造商的生活稍微困难一些.但是,一旦开发人员弄清楚如何生成javascript生成的相同值,也不会阻止机器人手动设置cookie.

IP地址

仅IP地址不会告诉您用户是否是人.有些网站使用IP地址尝试检测机器人,而且一个简单的机器人可能会显示为来自同一IP的一堆请求.但IP地址很便宜,使用亚马逊的EC2服务或类似的云服务,您可以生成服务器并将其用作代理.或者产生10或100并将它们全部用作代理.

UserAgent字符串

这很容易在爬虫中操作,你不能指望它标记一个试图不被检测到的机器人.将UserAgent设置为主要浏览器之一发送的相同字符串很容易,甚至可以在几个不同的浏览器之间轮换.

复杂的标记

我写过机器人的最困难的网站包括框架内帧内的帧....每页大约10层深,每个帧src是相同的基本控制器页面,但是有不同的参数来执行哪些操作.行动的顺序非常重要,因此很难保持所有正在发生的事情,但最终(大约一周后)我的机器人工作,所以虽然这可能会阻止一些机器人制造商,但它不会有用所有.并且可能会使您的网站难以维护数十亿次.

免责声明和结论

并非所有机器人都"糟糕".我制作的大多数抓取器/机器人都是为那些希望在网站上自动执行某些进程的用户而设置的,例如数据输入,这些操作过于繁琐,无法手动完成.因此,轻松完成繁琐的任务!或者,为您的用户提供API.可能是阻止某人为您的网站编写机器人的最简单方法之一是提供API访问.如果您提供API,那么很少有人会为此创建一个爬虫.您可以使用API​​密钥来控制某人使用它的程度.

为了防止垃圾邮件发送者,通过手机号码或信用卡进行验证码和帐户验证的某些组合可能是最有效的方法.添加一些日志记录分析以识别和禁用任何恶意个性化机器人,您应该处于良好的状态.