恐怕没有什么灵丹妙药。如果你在阻止时过于小心,你就不会击中他们,如果你不够小心,你最终会阻止来自用户的合法请求。
您可以根据他们是否发送Origin
是否为页眉。浏览器通常会这样,机器人开发人员可能不会,因为他们通常不必这样做(而且作为一个自己写过几个机器人的人,至少我在编码时很懒)。
它们似乎使用HTTP/1.0,而浏览器通常使用1.1(及以上版本)。
他们是发送看起来像合法浏览器的用户代理,还是只发送“libwww perl/5.76”或类似的内容?
我可能会选择多标准阻塞机制。如果它看起来像一个合法的用户代理,但使用HTTP 1.0,并且不发送源标头,那么它可能是一个机器人。您可以更进一步,只有在他们提出一个可疑请求后才能阻止(例如,查看他们试图执行的操作)。
一个高级的想法是交叉引用“在启动AJAX请求之前,这个IP是否有一个常规的页面视图?”或者“该IP是否请求过图像或css/js文件?”,因为机器人很可能不会,除非他们真的想偷偷摸摸或者专门针对你的网站。如果您允许代理服务器缓存这些资源(CloudFlare将自动这样做),那么这可能会出现问题,但要将它们隔离起来可能需要付出太多的努力。