如何保护Meteor服务器免受客户端上的无限循环影响?

时间:2015-01-09 20:35:33

标签: meteor infinite-loop denial-of-service ddp

我遇到客户端无限循环导致Meteor服务器崩溃的情况。无限循环是我将修复的错误,而不是这个问题的主题。我担心的是恶意用户可能会创建自己的无限循环并使Meteor服务器崩溃。

有问题的无限循环是反复拨打Meteor.subscribe(...)Meteor.call(...)。看起来这些请求正在服务器上排队到达失能的程度,即使客户的意图是放弃它们。有没有办法告诉服务器该请求已被放弃并将其从队列中删除?

我认为这不会保护服务器免受客户端的影响而无需放弃数千个连续请求,因此如果有人对此问题有答案,那么该问题将取代此问题。如何限制单个客户端可以提出的请求数量?

在这些APM图表中,您可以看到无限循环如何影响性能。我是在大约13:17开始的,并且在13:25应用程序崩溃了(由Heroku终止超过其内存配额)。

Meteor APM charts - kadira.io - client infinite loop causes server crash

1 个答案:

答案 0 :(得分:1)

调用Meteor.subscribe时,将在服务器上执行Meteor.publish功能。因此,您可以决定发布功能不提供数据。

这取决于您是否希望用户登录或不提供数据。如果您希望用户登录,则可以创建一个集合,该集合使用所使用的用户ID注册对发布功能的任何调用(即任何客户端订阅请求)。您会在记录的用户尝试订阅时询问此集合,并检查此用户是否最近发出了多个请求。如果此客户端命中您定义的请求配额,则只能返回null。

您可以使用https://github.com/gadicc/meteor-headers包并注册IP地址,对未登录的用户执行相同的操作。

您可以在客户端meteor.call()重复调用的服务器方法中执行相同的操作。

我认为检查此数据库(由于只有最近的连接必须保留在数据库中才能保持较小)并决定是否提供数据,每次提供数据所需的时间会更少。

我希望这会有所帮助。