1

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

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

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

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

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


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

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

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

在那种情况下,我可以防止“蛮力”锁定。但该链接仍然对机器人可见。

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


我看到很少有预订引擎像这样工作的网站。他们受到保护吗?也许有一个简单的 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 的东西,但有时,有人想要破坏某些东西,如果来源很明显,几行代码就可以破解它。整个事件数据库将被锁定,没有人可以预订。

4

2 回答 2

3

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

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

如果您添加一些事件阻止速率限制(例如通过 IP),效果会更好。

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

  1. 全部替换href="..."data-reservation-id=ID
  2. click在父元素上委托a[data-reservation-id]
  3. 在回调中,只需对 API 进行 POST ajax 调用
  4. 例如,在 API 的端点检查速率限制中使用 IP
  5. 如果OK,则阻止事件并返回OK,如果不是则返回错误。
于 2015-01-27T11:20:55.000 回答
1

IP 特定的最大同时保留

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

基本截图:

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

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

(这主要是对Avetist 出色答案中第 4 点的扩展)

于 2015-01-27T11:58:40.983 回答