这是一个难题,从防止机器人攻击和易用性的角度来看,我所知道的解决方案没有一个是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密钥来控制某人使用它的程度。
为了防止垃圾邮件发送者,某种组合的验证码和通过手机号或信用卡验证帐户的方法可能是最有效的方法。添加一些日志分析功能以识别和禁用任何恶意个性化机器人,您应该处于非常良好的状态。