如何阻止来自恶意机器人访问者的 link?

How to block the link from malicious bot visitors?

我正在制作一个活动注册网站。当有人点击 link 时:

<a href="/reserve/10" rel="nofollow">Reserve id=10 event</a>

系统正在为这个访客做十分钟的关于这个事件的 "lock"。在那种情况下,没有人可以在接下来的十分钟内预订此活动。如果当时付款完成,则一切正常,否则事件将再次解锁。我希望这个想法很清楚。

问题:当机器人(google 机器人、恶意机器人或愤怒的客户脚本 :P)访问此页面时,他会看到此 link。然后他进入页面。那么锁就完成了...

另外如果有人访问递归:/reserve/1, /reserve/2, /reserve/3, ...他可以锁定所有事件。


我考虑过为每个事件创建一个随机 md5 字符串。 在这种情况下,每个事件都有(在 id 旁边)唯一代码,例如:1987fjskdfh938hfsdvpowefjosidjf8243

接下来,我可以翻译库,像这样工作:

<a href="/reserve/1987fjskdfh938hfsdvpowefjosidjf8243" rel="nofollow">
    Reserve
</a>

在那种情况下,我可以阻止 "bruteforce" 锁定。 但是 link 仍然对机器人可见。

然后我想输入验证码。这就是解决方案。但是验证码……在可用性和用户体验方面并不是那么好。


我看到很少有网站有这样的预订引擎。他们受到保护吗?也许有一个简单的 ajax / javascript 解决方案来防止机器人将其作为纯文本阅读?我考虑过:

<a href="/registerthisvisitorasbot" id="reserve">Reserve</a>
<script type="text/javascript">
    $('#reserve').click(function(e) {
        e.preventDefault();
        var address = ...; 
        // something not so obvious to follow? 
        // for example: md5(ajaxget(some_php_file.php?salt=1029301))
        window.location('/reserve/' + address);
    });
</script>

但我不确定我应该怎么做才能防止机器人计算它。我的意思是愚蠢的机器人甚至无法跟随 javascript 或jquery 东西,但有时候,有人想破坏一些东西,如果来源很明显,几行代码就可以破坏它。整个事件数据库将被锁定,没有人可以预订。

CRFS + AJAX POST + 每次加载时生成的事件令牌。

总结:不要依赖 GET 请求,尤其是通过 a 个元素。

如果您添加一些事件块速率限制(例如通过 IP)更好。

编辑:(这是一个基本草图)

  1. 将所有 href="..." 替换为 data-reservation-id=ID
  2. a[data-reservation-id]
  3. 的父元素上委托 click
  4. 在回调中,只需对 API
  5. 进行 POST ajax 调用
  6. 在 API 的端点检查速率限制中,例如使用 IP
  7. 如果成功,阻止事件,return 成功,如果不成功,return 错误。

特定 IP 的最大同时保留数

总结:取决于许多简单的机器人在一台主机上运行的事实。限制主机同时预订的数量。

基本场景:

  • 将请求 IP 与预订一起存储
  • 根据预留请求计算未完成预留的 IP。

    SELECT Count(ip) FROM reservations WHERE ip=:request_ip AND status=open;
    
  • 如果数量超过某个阈值,则阻止预订。

(这主要是 中第 4 点的扩展)