Security 防止Meteor调用在控制台中循环

Security 防止Meteor调用在控制台中循环,security,meteor,methods,console,Security,Meteor,Methods,Console,我知道,您不能真正阻止用户从控制台调用meteor方法(如果我错了,请纠正我) 我为用户提供了一个简单的正面或反面游戏,用于跟踪他们游戏的统计数据,我为这两种游戏创建的两种方法是guessheads和guessTails。根据每个结果,我只更新这些命令中的统计信息,这样用户就没有更新统计信息的直接方法 统计数据存储在用户的配置文件中,由于以下代码,用户无法对其进行编辑: Meteor.users.deny({ update() { return true; } }); 我的问题是,用户仍然

我知道,您不能真正阻止用户从控制台调用meteor方法(如果我错了,请纠正我)

我为用户提供了一个简单的正面或反面游戏,用于跟踪他们游戏的统计数据,我为这两种游戏创建的两种方法是
guessheads
guessTails
。根据每个结果,我只更新这些命令中的统计信息,这样用户就没有更新统计信息的直接方法

统计数据存储在用户的配置文件中,由于以下代码,用户无法对其进行编辑:

Meteor.users.deny({
  update() { return true; }
});
我的问题是,用户仍然能够从控制台调用
guessHeads
guessTails
命令,如果复制粘贴与在ui中单击heads或tails按钮所需的工作量相同,那么这并不是一个真正的问题


但是如果他们在一个大循环中运行这些命令呢?我怎样才能防止他们这样做,因为目前这是可能的。

我会尝试以下方法:

var throttledUsers = { }; // Outside of your methods but on the server.  I would probably use the module pattern for this.

guessHeads() {
    var currentUser = this.userId;
    if(!throttledUsers[currentUser]) {
        throttledUsers[currentUser] = true;
        //Do your logic.
        Meteor.setTimeout(function() {
            delete throttledUsers[currentUser];
        }, 1000); // Set the throttle timeout to whatever you want.
    } else {
        // Throw an exception or whatever you want.
    }
}

基本上,您在这里所做的是创建一个对象服务器端,用于容纳在最后一秒钟内调用guessHeads或guessTails的用户。然后,超时会将这些用户从对象中删除,并允许他们再次执行guessHeads和guessTails逻辑。

我会尝试以下方法:

var throttledUsers = { }; // Outside of your methods but on the server.  I would probably use the module pattern for this.

guessHeads() {
    var currentUser = this.userId;
    if(!throttledUsers[currentUser]) {
        throttledUsers[currentUser] = true;
        //Do your logic.
        Meteor.setTimeout(function() {
            delete throttledUsers[currentUser];
        }, 1000); // Set the throttle timeout to whatever you want.
    } else {
        // Throw an exception or whatever you want.
    }
}

基本上,您在这里所做的是创建一个对象服务器端,用于容纳在最后一秒钟内调用guessHeads或guessTails的用户。然后超时会将这些用户从对象中删除,并允许他们再次执行guessHeads和guessTails逻辑。

Meteor的
ddp速率限制器
核心包旨在解决此行为


只需添加包,然后使用
类型的
DDPRateLimiter.addRule()
添加一条规则:'method'
guessHeads
guessTails
方法为目标。您可以将对这些方法的调用频率限制为适合您的应用程序需要的任何频率。

Meteor的
ddp速率限制器
核心包旨在解决此问题


只需添加包,然后使用
类型的
DDPRateLimiter.addRule()
添加一条规则:'method'
guessHeads
guessTails
方法为目标。您可以将对这些方法的调用频率限制在适合您的应用程序需要的范围内。

您能详细解释一下这实际上是做什么的吗?好的,在这种情况下,对于on按钮click,我还应该执行Meteor.setTimeout,这样对于手动单击按钮快于一秒(或其他任何时间)的用户,这不会中断?是的,你可能也应该这样做,让他们知道,或者你可以在这段时间内禁用按钮。谢谢,我明天测试时会接受这个解决方案。它不起作用:/不管怎样,用户总是被这个代码限制…你能解释一下它的实际作用吗?好的,那么在这种情况下,对于on按钮单击,我还应该执行Meteor.setTimeout,这样对于手动单击按钮快于一秒(或任何其他时间)的用户,这不会中断?是的,您可能也应该这样做,以便他们知道,或者您可以在该时间段内禁用按钮。谢谢,当我明天测试它时,我会接受这个解决方案。它不起作用:/不管怎样,用户总是被这个代码扼杀…实际上我只是在阅读meteor指南时遇到了这个问题。你应该用它来代替。这段代码应该在客户端上实现吗?实际上我在阅读meteor指南时遇到了这一点。你应该使用这个。这个代码应该在客户端上实现吗?