如何避免用户打开无数标签页导致服务器泛滥



我有某种聊天/论坛应用程序,它使用jquery ajax定期轮询(每15秒)来检查新消息。我想知道我是否可以绕过用户试图通过加载几个相同的浏览器实例来"搞笑"的问题,这些实例带有很多选项卡,都指向同一个应用程序。每个选项卡都在发送一个ajax请求,如果几个用户开始做同样的事情,该请求可能会溢出服务器。

我确实将会话、上次访问时间和IP地址存储在一个表中,只要用户不使用同一个浏览器,这个表就可以正常工作。我可以存储一个使用ajax POST或GET请求发送的唯一标识符,但如果一个普通(非滥用)用户刷新他的页面,然后创建一个新的标识符,就会出现问题。

这还不是一个真正的问题,但最好在有人想到这样滥用系统之前抓住它:)知道怎么做吗?

一个选项可以是像这样获取数据:

  • 您的脚本正在准备轮询数据。在执行请求之前,写(使用LocalStorage),一个表示要获取数据的值。localStorage.setItem("last-request-timestamp", new Date().getTime());
  • 轮询数据。你会得到一个结果。将结果写入本地存储:localStorage.setItem("latest-messages", ajax_result);
  • 通过检查localStorage.getItem("last-request-timestamp")的时间是否超过15秒来检查页面是否准备轮询数据。如果是,请转至步骤1。如果没有,请等待15秒,然后再次检查
  • 无论当前页面是否轮询数据,请检查latest-messages变量并更新页面

其他页面当然会共享localStorage数据。如果当前正在获取另一个页面,他们将无法获取数据。如果页面#1关闭,则其他页面中的一个将继续获取数据。

我以前没有使用过LocalStorage,但浏览器支持似乎已经足够不错了。您还应该能够将它用作键值数组:localStorage["last-request-timestamp"]

您只能将字符串存储在localStorage中,但当然可以将其序列化为JSON。

不确定它在javascript中是否可用。您可以检查选项卡是否处于活动状态。而且只做活动选项卡上的ajax?

我也有类似的问题。现在我强制所有用户登录(这意味着我有他们的电子邮件)。此外,我设置了每个帐户的连接限制和每个连接的请求限制,在5次溢出后,我要求用户输入captcha,然后我屏蔽帐户30分钟,并发送带有密码恢复链接的电子邮件。这不是一个明确的解决方案,但目前它对我有效

UPD:

最简单的方法是使用cookie或会话存储。我用饼干。算法很简单:

  1. 用户登录web
  2. 检查此用户是否有任何打开的会话,打开,然后删除其他会话或触发异常或切换到该会话,您就可以决定自己想要的行为
  3. 为用户创建会话id并将其存储在数据库中
  4. 增加特定用户检测打开的会话计数器字段会话,所以现在有一个浏览器在使用也没关系或许多
  5. 更新最后访问标记(我使用microtime(true) + $delay和mysqldecimal(14,4))。发送给用户
  6. 将id发送到客户端

每次请求:

  1. 在$_COOKIE中按传递的id搜索会话
  2. 检查最后一个访问标记。如果它小于microtime(true),则意味着客户端频繁发送请求,所以您自己决定该做什么,增加标记,例如microtime(true) + $delay + $penalty或删除整个会话或触发错误。行为取决于您的应用程序

为什么不抛出Memcached/Redis之类的东西来解决这个问题?缓存一个生存时间为10-15秒的响应,并尽可能避免处理。

最新更新