javascript - Meteor 中登录尝试的 DDP 速率限制器

标签 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坦率地说,我不明白 CoffeeScript 代码。 有人可以指导我完成这个吗?

最佳答案

首先根据Meteor docs

By default, there are rules added to the DDPRateLimiter that rate limit logins, new user registration and password reset calls to a limit of 5 requests per 10 seconds per session.

如果您想删除或替换默认限制,您应该在服务器端代码中的某个位置调用 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 将 meteor.login 方法限制为 10 秒内调用一次。当您在客户端调用该方法时,您可以使用回调错误对象获取剩余时间。

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

编辑

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

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

关于javascript - Meteor 中登录尝试的 DDP 速率限制器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45078234/

相关文章:

javascript - onClick 事件不会在 iOS 中触发 Instagram 在 App 浏览器中 Meteor React JS Web App

templates - Meteor:在用数据渲染模板后调用函数

javascript - 如何更改 Meteor 模板中的 CSS 属性?

javascript - 使用 jquery anchor 链接到多个类而不是 id

javascript - 通过 Angular 中的函数返回文件的内容

javascript - 通过 Twilio npm 包发送短信 - 错误找不到 - 错误 : Cannot find module './webhooks'

mongodb - 使用 cURL 上传文件

Meteor:从另一个助手访问模板助手(或变量)

javascript - loadFromJSON 不包括 fabric js 中的附加属性

javascript - 如何在 Python 中存储从 Javascript 动态生成的 HTML 表单元素?