流星中登录尝试的DDP速率限制器

时间:2017-07-13 10:38:11

标签: javascript meteor meteor-blaze ddp

我正在尝试对从客户端进入服务器的登录尝试次数设置DDP速率限制器。我已经阅读了官方文档,但我无法验证它是否真的有效。

我添加了包:ddp-rate-limiter

我的服务器代码是:

Meteor.startup(function() {

    var preventBruteForeLogin= {

        type: 'method',
        name: 'Meteor.loginWithPassword'
    }

    DDPRateLimiter.addRule(preventBruteForeLogin, 1, 2000);
    DDPRateLimiter.setErrorMessage("slow down");
});

我对上述内容的理解是它在Meteor.loginWithPassword方法上添加了一个限速规则,它只允许每2秒进行一次尝试。但是,鉴于文档和网上其他地方提供的信息很少,我无法弄清楚它是否真的有效或者我做错了。我也经历了MC's blog,坦率地说我不懂咖啡脚本代码。 有人可以指导我完成这个吗?

2 个答案:

答案 0 :(得分:2)

首先根据Meteor docs

  

默认情况下,DDPRateLimiter添加了规则,限制登录,新用户注册和密码重置调用每个会话每10秒限制5个请求。

如果要删除或替换默认限制,请在服务器端代码的某处调用Accounts.removeDefaultRateLimit()

接下来你应该创建类似于下面的方法

注意:您应该只将哈希密码从客户端传递到服务器端

Meteor.methods({
  'meteor.login' ({ username, password }) {
    Meteor.loginWithPassword({ user: username, password })
  }
})

然后在您的服务器端,您应该限制刚刚创建的方法。

if (Meteor.isServer) {
  DDPRateLimiter.setErrorMessage(({ timeToReset }) => {
    const time = Math.ceil(timeToReset / 1000)
    return 'Try again after ' + time + ' seconds.'
  })

  DDPRateLimiter.addRule({
    type: 'method',
    name: 'meteor.login',
    connectionId () {
      return true
    },
    numRequests: 1,
    timeInterval: 10000
  })
}

这个将使用DDP连接ID在10秒内将meteor.login方法限制为一个呼叫。当您在客户端调用该方法时,您可以使用回调错误对象获得剩余时间。

就个人而言,我使用themeteorchef guide稍微改变的方法进行速率限制。我建议你这样做,因为当你用更多的方法来构建应用程序时,它更容易实现,对我而言,它更具可读性。它是使用ES6语法编写的。我建议您阅读一下它并开始使用它(您不必安装其他软件包等)。我相信你会很快喜欢它。

修改

我们发现在另一种方法中使用包装Meteor.loginWithPassword()方法可能会导致将密码作为纯文本发送时出现安全问题。帐户包附带Accounts._hashPassword(password)方法,该方法返回密码的哈希版本。我们应该在调用meteor.login方法时使用它。它可以像下面那样完成

Meteor.call('meteor.login', username, Accounts._hashPassword(password), function (err) {
  //asyncCallback
})

答案 1 :(得分:-1)

Meteor.loginWithPassword 是客户端...你不能在服务器端调用它

来自meteor官方文档的简单解决方案。

// Define a rule that matches login attempts by non-admin users.
const loginRule = {
  userId(userId) {
    const user = Meteor.users.findOne(userId);
    return user && user.type !== 'admin';
  },

  type: 'method',
  name: 'login'
};

// Add the rule, allowing up to 5 messages every 1000 milliseconds.
DDPRateLimiter.addRule(loginRule, 5, 1000);