流星登录尝试的 DDP 速率限制器
DDP Rate limiter on login attempts in meteor
我正在尝试对从客户端到服务器的登录尝试次数设置 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 了解了这一点,坦率地说,我不理解咖啡脚本代码。
有人可以指导我解决这个问题吗?
首先根据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
})
}
这将限制 meteor.login
方法使用 DDP 连接 ID 在 10 秒内调用一次。当您在客户端调用该方法时,您可以使用回调错误对象获取剩余时间。
就我个人而言,我使用与 themeteorchef guide 略有不同的方法进行速率限制。我建议您也这样做,因为当您使用更多限制方法构建应用程序时,实现起来要容易得多,而且对我来说,它更具可读性。它是使用 ES6 语法编写的。我建议阅读一些相关内容并开始使用它(您不必安装其他软件包等)。我相信你会很快喜欢它。
编辑
我们发现在另一种方法中使用包装 Meteor.loginWithPassword()
方法可能会导致以纯文本形式发送密码时出现安全问题。帐户包附带 Accounts._hashPassword(password)
方法,该方法 returns 我们密码的散列版本。我们应该在调用 meteor.login
方法时使用它。可以像下面这样完成
Meteor.call('meteor.login', username, Accounts._hashPassword(password), function (err) {
//asyncCallback
})
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);
我正在尝试对从客户端到服务器的登录尝试次数设置 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 了解了这一点,坦率地说,我不理解咖啡脚本代码。
有人可以指导我解决这个问题吗?
首先根据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
})
}
这将限制 meteor.login
方法使用 DDP 连接 ID 在 10 秒内调用一次。当您在客户端调用该方法时,您可以使用回调错误对象获取剩余时间。
就我个人而言,我使用与 themeteorchef guide 略有不同的方法进行速率限制。我建议您也这样做,因为当您使用更多限制方法构建应用程序时,实现起来要容易得多,而且对我来说,它更具可读性。它是使用 ES6 语法编写的。我建议阅读一些相关内容并开始使用它(您不必安装其他软件包等)。我相信你会很快喜欢它。
编辑
我们发现在另一种方法中使用包装 Meteor.loginWithPassword()
方法可能会导致以纯文本形式发送密码时出现安全问题。帐户包附带 Accounts._hashPassword(password)
方法,该方法 returns 我们密码的散列版本。我们应该在调用 meteor.login
方法时使用它。可以像下面这样完成
Meteor.call('meteor.login', username, Accounts._hashPassword(password), function (err) {
//asyncCallback
})
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);