Meteor:如何防止客户端访问方法

时间:2015-08-28 08:25:28

标签: javascript node.js mongodb methods meteor

所有流星方法都可以从客户端和服务器端以相同的方式调用。

让我们说用户知道或可以预测服务器上的所有方法名称,然后他就可以调用它们并根据需要使用它的结果。

例如: 执行跨域http请求和返回响应的方法可用于通过调用大量数据Meteor.call(httpLoad, "google.com");来重载服务器,或者如果客户端知道文档_id,则可以使用从mongo加载数据的方法来访问数据库文档Meteor.call(getUserData, "_jh9d3nd9sn3js");

那么,如何避免这种情况,可能有更好的方法来存储仅服务器的功能而不是Meteor.methods({...})

4 个答案:

答案 0 :(得分:5)

Meteor方法旨在从客户端访问,如果您不想这样,您只需要在服务器上定义一个普通的javascript函数。一个非常基本的例子是:

server/server.js

someFunction = function(params) {
    console.log('hello');
}

只要它在服务器文件夹中,就无法从客户端访问该功能。

对于coffeescript用户,每个文件在技术上都是一个单独的范围,因此您必须使用@定义全局变量,例如

@someFunction = (params) ->
    console.log 'hello'

或者如果要将函数作用于包:

share.someFunction = (params) ->
    console.log 'hello'

如果您的方法需要从客户端访问,但仅适用于管理员用户,则需要在流星方法定义的开头添加这些检查:

Meteor.methods({
    'someMethod': function(params) {
        var user = Meteor.user();
        if (user && (user.isAdmin === true)) {
            // Do something
        } else {
            throw new Meteor.Error(403, 'Forbidden');
        }
    }
});

我不会担保这个例子的安全性 - 它只是一个例子 - 但希望它可以让你知道如何保护你的方法。

编辑:注意到使用if (Meteor.isServer) { ... }条件提及的其他答案。请注意,如果您在客户端上也可以访问 inside 方法,则用户仍然可以看到您的服务器代码,即使他们无法运行它。这可能是也可能不是您的安全问题 - 如果您在可以从客户端访问其代码的方法中对任何第三方API凭据或任何类型的敏感数据进行硬编码,请务必小心。如果您不需要客户端上的方法,那么最好只使用普通的JS函数。如果您使用isServer条件包装整个Meteor.methods调用,则代码将仅在服务器上,但仍可从客户端调用。

答案 1 :(得分:4)

正如其他答案所述,您的方法始终可以从客户端访问(按设计)。但是,有一个简单的解决方法来检查呼叫是来自客户端还是来自服务器。如果你做了

if ( this.connection == null )
如果从服务器调用该方法,

return true。像这样你可以将方法体执行限制为'安全'调用。

答案 2 :(得分:0)

我认为此页面解释了它:http://meteortips.com/first-meteor-tutorial/methods/

我在引用:

“更安全的方法是将这些函数移动到isServer条件,这意味着:

数据库代码将在服务器的可信环境中执行。 用户将无法在控制台内使用这些功能,因为用户无法直接访问服务器。

在isServer条件内,写下以下内容:

Meteor.methods({
   // methods go here
});

这是我们用来创建方法的代码块。“

等等。我希望这会有所帮助。

答案 3 :(得分:0)

通过适当的应用程序设计,您无需关心请求是通过Web UI还是通过控制台窗口中输入的内容。

基本上,不要在Meteor.methods中放置通用的,滥用滥用功能,实施合理的访问控制,以及限制和/或记录可能存在问题的任何内容。

Meteor.methods中定义的任何服务器端功能都可以通过this.userid访问当前用户ID。此用户标识由Meteor提供,而不是客户端API参数。

由于Meteor Method服务器端代码知道登录状态和用户ID,因此它可以在决定执行用户要求执行的操作之前执行所需的所有检查和速率限制。

你如何评价限额?我最近没有找到这个模块。在基本Meteor中,您将为服务器端可访问的用户操作添加Mongo集合。在通过Meteor方法到达的每个请求上插入带时间戳,用户ID特定的数据。在完成服务器方法代码中的请求之前,请执行Mongo查找在相关时间段内从此用户ID发生的操作数量。这是一项小工作并且会产生一些开销,但是通过服务器范围的下划线式去抖的速率限制的替代方案留下了攻击者滥用和拒绝服务的功能。