如何阻止恶意僵尸网站访问者的链接?

时间:2015-01-27 11:19:01

标签: javascript hyperlink block bots nofollow

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

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

系统正在进行锁定&#34;在这个活动上,这个访客十分钟。在这种情况下,没有其他人可以在接下来的十分钟内保留此事件。如果付款在该时间内完成,则一切正常,否则事件将再次解锁。我希望这个想法很清楚。

问题:当bot(谷歌机器人,恶意机器人或愤怒的客户脚本:P)访问此页面时,他会看到此链接。然后他进入了页面。锁定完成......

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


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

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

1987fjskdfh938hfsdvpowefjosidjf8243

在这种情况下,我可以防止&#34;暴力&#34;锁定。但机器人仍然可以看到该链接。

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


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

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

但是我不知道我该怎么做以防止机器人计算它。我的意思是愚蠢的机器人甚至无法遵循javascript或jquery的东西,但有时候,有人想破坏某些东西,如果来源很明显,可以用几行代码来破解它。整个事件数据库将被锁定,没有任何预留选项。

2 个答案:

答案 0 :(得分:3)

每次加载时都会生成CRFS + AJAX POST + EVENT TOKEN。

摘要:不要依赖GET请求,特别是通过a元素。

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

编辑:(这是基本草图)

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

答案 1 :(得分:1)

特定于IP的最大同时预订

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

基本观点:

  • 将请求的IP与预订一起存储
  • 在预订请求中,计算未完成预订的IP。

    SELECT Count(ip) FROM reservations WHERE ip=:request_ip AND status=open;
    
  • 如果该数字高于某个阈值,请阻止预订。

(这主要是avetist's excellent answer中给出的第4点的扩展)