meteor:如何防止客户访问方法
所有的meteor方法都可以从客户端和服务器端调用。
比方说,用户知道或可以预测服务器上的所有方法名称,然后他可以调用它们并使用它的结果,但他想要的。
例如:执行跨域http请求和返回响应的方法可以用来通过调用大量数据来重载服务器Meteor.call(httpLoad, "google.com");
,或者从mongo加载数据的方法可以用来访问数据库文件,如果客户端知道文件_id Meteor.call(getUserData, "_jh9d3nd9sn3js");
。
那么,如何避免这种情况,可能存在一个比Meteor.methods({...})
更好的存储仅限服务器的函数的方法呢?
meteor的方法被devise为从客户端访问,如果你不想这样做,你只需要在服务器上定义一个正常的JavaScript函数。 一个非常基本的例子是:
server/server.js
:
someFunction = function(params) { console.log('hello'); }
只要它在服务器文件夹中,该function就不能从客户端访问。
对于coffeescript用户来说,每个文件在技术上都是一个单独的范围,所以你必须用@
来定义一个全局variables,例如
@someFunction = (params) -> console.log 'hello'
或者如果你想将函数的范围限定在一个包中:
share.someFunction = (params) -> console.log 'hello'
如果您的方法需要从客户端访问,但仅适用于说pipe理员用户,则需要在meteor方法定义开始时添加这些检查:
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) { ... }
有条件的其他答案。 请注意,如果您在客户端也可访问的内部方法中执行此操作,那么即使用户无法运行,用户仍然可以看到您的服务器代码。 这对您来说可能是安全问题,也可能不是安全问题 – 如果您对代码可以从客户端访问的方法中的任何第三方API凭证或任何types的敏感数据进行硬编码,基本上应该小心。 如果你不需要客户端的方法,最好是使用普通的JS函数。 如果用isServer条件包装整个Meteor.methods调用,代码将只在服务器上,但仍可以从客户端调用。
正如其他答案中所述,您的方法将始终可以从客户端访问(每个devise)。 但是,有一个简单的解决方法来检查来电是从客户端还是从服务器。 如果你做了
if ( this.connection == null )
如果从服务器调用方法,这将return true
。 就像你可以限制方法体执行到'安全'的调用。
我认为这个网页解释它: http : //meteortips.com/first-meteor-tutorial/methods/
我引用:
“更安全的方法是将这些function移动到isServer条件,这意味着:
数据库代码将在服务器的可信赖环境中执行。 用户将无法在控制台中使用这些function,因为用户无法直接访问服务器。
在isServer条件内,编写以下内容:
Meteor.methods({ // methods go here });
这是我们将用来创build我们的方法的代码块。“
等等。 我希望这有帮助。
通过适当的应用程序devise,您不应该在意是通过Web UI还是通过在控制台窗口中键入的内容。
基本上,不要在Meteor.methods中使用通用的滥用值得的function,实施合理的访问控制,并限制和/或logging任何可能成为问题的东西。
在Meteor.methods中定义的任何服务器端函数都可以通过this.userid
访问当前的用户ID。 此用户标识由Meteor提供,不是客户端API参数。
由于Meteor Method服务器端代码知道login状态和用户标识,因此可以在决定执行用户要求的事情之前进行所有检查和速率限制。
你如何评价限制? 最近我还没有找过这个模块。 在基本的Meteor中,您只需要添加一个Mongo集合,用于只能访问服务器端的用户操作。 在通过Meteor方法到达的每个请求上插入时间戳,用户标识的特定数据。 在服务器方法代码中完成一个请求之前,做一个Mongo查找在这个用户相关期间发生了多less这样的操作。 这是一个小小的工作,会产生一些开销,但是通过服务器范围的下划线式去抖动的速率限制的替代方法给攻击者留下了滥用和拒绝服务的function。