Javascript 如何使用来自AJAX请求的响应故意刷新或崩溃浏览器选项卡

Javascript 如何使用来自AJAX请求的响应故意刷新或崩溃浏览器选项卡,javascript,php,ajax,google-chrome,safari,Javascript,Php,Ajax,Google Chrome,Safari,昨天,我们将代码推送到了生产环境,其中包括一个轮询机制(通过Javascript中的setInterval()),该机制每15秒发出一个AJAX请求,以使客户端与服务器保持最新。虽然今天任何时候只有大约450人在使用我们的网站,但似乎我们的许多用户在不使用我们的网站时仍然保持网站的开放状态。比如,很多用户 在一个星期天的12小时内,我们已经有效地对自己进行了DDoS攻击。大约有3500人在浏览器上打开了我们的网站,这意味着每秒有200个请求到达这个PHP端点。当KeepAlive为5时,这触发了

昨天,我们将代码推送到了生产环境,其中包括一个轮询机制(通过Javascript中的
setInterval()
),该机制每15秒发出一个AJAX请求,以使客户端与服务器保持最新。虽然今天任何时候只有大约450人在使用我们的网站,但似乎我们的许多用户在不使用我们的网站时仍然保持网站的开放状态。比如,很多用户

在一个星期天的12小时内,我们已经有效地对自己进行了DDoS攻击。大约有3500人在浏览器上打开了我们的网站,这意味着每秒有200个请求到达这个PHP端点。当KeepAlive为5时,这触发了我们的Apache服务器快速达到其MaxClients限制,从而阻塞了新连接的建立,导致现有用户出现随机错误等。我们提高了该限制并毫无问题地降低了KeepAlive时间,但当我们更改
setInterval()时,真正的修复出现在一小时后也可以考虑<代码>文档。VisuBIILITY = =“可见”,这样后备标签不会轮询我们的服务器。(如果您现在想知道,我们将转向静默推送通知,而不是轮询,甚至比我们计划的更早)

该修复程序应该适用于新用户,但它留给我们的3500名用户仍然在他们的计算机上打开我们的网站,他们的错误代码不分青红皂白地向我们发出请求,即使他们不使用该网站。我们需要他们尽快获取新代码以停止DDoS,或者诱导他们的选项卡冻结,以便停止来自浏览器的web请求。我们在Chrome和Safari上测试了一些想法,但没有一个奏效

第一个是通过PHP的
标题(“refresh:0”)诱导页面刷新。我们尝试在端点中包含这方面的几个变体,但AJAX请求的响应头似乎不能引起页面刷新。我们还尝试使用HTML
echo''响应请求
但这也不起作用,可能是因为AJAX请求需要的是JSON,而不是HTML,并且更改响应的内容类型是不够的

第二种方法是使用数据重载对此端点的响应,从而使页面崩溃。我们尝试在响应中添加多个
bin2hex(openssl\u random\u pseudo\u bytes(5000000))
s作为变量写入浏览器中的本地存储。这确实使浏览器冻结并使用了高达1GB的RAM,但即使界面完全没有响应,选项卡也没有“崩溃”,web请求继续发出,因此这种方法也不起作用

更新:我们尝试的第三件事是在他们正在访问的PHP文件中执行
睡眠(999999)
。由于浏览器最多只能同时向给定域发出6个请求,因此我们认为,一旦这些客户端向端点发出6个请求,就不会发出进一步的请求,因为这6个请求将无限期地挂起。我们试着将其推到生产环境中,但结果并不顺利:在30秒内,Apache的负载甚至比以前更重,因为现在请求堆积如山,无法完成。因此,我们必须重新启动Apache(这反过来取消了所有挂起的请求,使我们返回到之前的状态)。我们认为使用浏览器最多只能同时向一个域发出6个请求这一事实可能会有一些变化,但我们不确定如何使用这一事实


我们还可以尝试什么呢?

我建议推出一个新版本的网站,并为ajax请求更改url。之后,您可以向.htaccess添加重写规则,使旧的ajax url返回404,而不是由PHP应用程序处理。 这应该可以缓解压力。
祝你好运

我建议为ajax请求推送一个新版本的网站,并更改url。之后,您可以向.htaccess添加重写规则,使旧的ajax url返回404,而不是由PHP应用程序处理。 这应该可以缓解压力。 祝你好运

(我太新了,无法发表评论,所以我必须将此作为答案)

通常在服务器级别而不是应用程序级别处理请求至少要便宜一个数量级。考虑到应用程序可能会访问数据库、恢复会话、执行一系列路由等操作,然后才能拒绝请求

我仍然建议不要使用有问题的url。 如果返回的是HTTP 410而不是404 如果添加缓存控制头,可能会说服浏览器提供缓存结果,而不是实际调用

缓存控制:公共,最大年龄=31536000

当然,这假设您在轮询机制中使用了而没有使用cache-buster参数。如果每个url都是新的和唯一的,缓存将无法保存您。

(我太新了,无法评论,所以我必须将此作为答案)

通常在服务器级别而不是应用程序级别处理请求至少要便宜一个数量级。考虑到应用程序可能会访问数据库、恢复会话、执行一系列路由等操作,然后才能拒绝请求

我仍然建议不要使用有问题的url。 如果返回的是HTTP 410而不是404 如果添加缓存控制头,可能会说服浏览器提供缓存结果,而不是实际调用

缓存控制:公共,最大年龄=31536000


当然,这假设您在轮询机制中使用了而没有使用cache-buster参数。如果每个url都是新的和唯一的,缓存将无法保存您。

如果您需要持续的实时更新,请不要使用AJAX!说真的,你在这里自找麻烦,你已经经历过了。而将客户端浏览器作为“解决方案”进行崩溃根本就没有做到。相反,您应该使用