如何防止调用Meteor.call'从JavaScript控制台?

时间:2016-02-01 02:17:02

标签: javascript meteor meteor-methods

我刚注意到Meteor.call,这个概念阻止用户调用集合的插入,更新,删除方法,仍然可以从JavaScript控制台调用。

对于客户的例子:

// client
...

Meteor.call('insertProduct', productInfo);

...

这是服务器部分:

// server
Meteor.methods({
    insertProduct: function( productInfo ){
       Product.insert(...);
    }
})

好的,我知道人们无法直接从他们的JavaScript控制台调用Product.insert()。

但是如果他们再多尝试一下,他们就可以在开发人员工具资源标签的客户端JavaScript中找到Meteor.call()

现在他们可以尝试从他们的控制台调用Meteor.call,然后尝试猜测productInfo的属性应该是什么。

所以我想知道我们怎么能阻止这个最后的活动? Meteor.call做得好吗? 或者我错过了一些重要的东西?

5 个答案:

答案 0 :(得分:2)

Meteor.call是一个全局函数,就像window.alert()一样。不幸的是,你无法阻止用户调用Meteor.call。但是,您可以验证数据模式以及用户发送内容的实际数据。我建议https://github.com/aldeed/meteor-simple-schema(aldeed:simple-schema作为流星包名称),以确保您不会在项目中获取垃圾数据。

答案 1 :(得分:2)

正如其他人所指出的,“Meteor.call”肯定可以在控制台中使用。这里的一个微妙问题是,流星应用程序的合法用户可能会在服务器上做坏事。因此,即使在服务器上检查用户是否合法,它本身并不能保证数据受到保护。

这不仅仅是Meteor的问题。我认为所有这些应用都需要有可能防止数据损坏,即使是通过合法用户

保护此类损坏的一种方法是使用IIFE(立即调用函数表达式)

将模块包裹在IIFE中。在闭包内部保留一个私有变量,该变量存储唯一的一次性使用密钥(k1)。该密钥需要使用另一个路径放置在那里 - 可能是通过确保集合观察器在启动时在客户端中被触发。人们也可以在这里使用其他策略。我们的想法是从服务器中获取k1的值并将其存放在私有变量中

然后每次从代码中调用Meteor.call时,将k1作为参数之一传递。服务器依次检查k1对于该浏览器连接是否合法

由于k1存储在IIFE调用的闭包中的私有变量中,因此浏览器控制台上的某个人很难确定k1的值。因此,即使可以从浏览器控制台调用“Meteor.call”,也不会造成任何伤害。这种方法应该是数据损坏的一个很好的威慑

答案 2 :(得分:1)

正如@Faysal所提到的,您有几种方法可以确保您的通话合法。一个简单的步骤是实现alanning:roles并在您的方法中执行角色检查,如下所示:

Meteor.methods({
    methodName: function() {
        if (!Roles.userIsInRole(this.userId, 'admin')) {
            throw new Meteor.Error(403, 'not authorized);
        } else { yourcode });

这样,只有管理员用户才能调用该方法。

请注意,您还可以从方法中检查this.connection,并确定呼叫是来自服务器(this.connection === false)还是来自客户端。

一般来说,从方法中进行检查和数据操作是一个很好的方法。允许/拒绝是很好的开始,但是当你的收藏变得更重并且边缘情况扩大时,变得非常难以维护。

答案 3 :(得分:0)

您无法从控制台阻止Comparator,就像您无法从控制台阻止Meteor.call一样。这些是流星中的全局函数。

但是您可以采取简单的步骤来保护您的方法。

  1. 使用CollectionName.find().count()设置您的收藏集可以接受的数据类型。这将允许您设置集合所采用的特定键及其类型(字符串,布尔值,数组,对象,整数)Collections.reverseOrder()
  2. 确保只有已登录的用户才能从您的方法更新。或者设置全局允许/拒绝规则。 https://github.com/aldeed/meteor-simple-schema&& https://www.meteor.com/tutorials/blaze/security-with-methods
  3. 删除包aldeed:simple-schemainsecure
  4. 架构和允许/拒绝的简单组合应该没问题。

答案 4 :(得分:0)

如你所知,你现在无法阻止从Javascript控制台调用Meteor.call,我想添加@Stephen和@thatgibbyguy作为建议,请务必检查你的用户{将文档添加到集合中时{1}}。 role将帮助您防止将垃圾数据插入/更新到集合中。和Simple-Schema软件包通过控制谁有权编写/读取/更新您的收集文档,确保您的应用程序安全。

Alanning:roles Package