7

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

以客户为例:

// client
...

Meteor.call('insertProduct', productInfo);

...

这是服务器部分:

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

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

但是,如果他们再多尝试一点,他们会Meteor.call()从开发者工具的资源选项卡中发现客户端的 JavaScript 中有。

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

所以我想知道我们如何才能防止这种最终活动?是否Meteor.call做得足够好?或者我错过了一些重要的东西?

4

5 回答 5

2

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

于 2016-02-01T02:55:34.620 回答
2

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

这不仅仅是 Meteor 的问题。我认为所有此类应用程序都需要潜在地保护其数据免受损坏,即使是通过合法用户

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

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

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

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

于 2016-04-27T01:51:28.307 回答
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) 还是来自客户端。

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

于 2016-02-01T17:50:28.260 回答
0

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

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

  1. 用于aldeed:simple-schema设置您的集合可以接受的数据类型。这将允许您设置集合采用的特定键及其类型(字符串、布尔值、数组、对象、整数)https://github.com/aldeed/meteor-simple-schema
  2. 确保只有登录用户才能从您的方法更新。或设置全局允许/拒绝规则。https://www.meteor.com/tutorials/blaze/security-with-methods && https://www.discovermeteor.com/blog/allow-deny-a-security-primer/
  3. 删除包裹insecureautopublish

架构和允许/拒绝的简单组合应该可以满足您的需求。

于 2016-02-01T03:25:54.070 回答
0

正如您现在所知道的,您不能真正阻止Meteor.call来自 Javascript 控制台的调用,我想通过@Stephen 和@thatgibbyguy 添加作为建议的内容,请务必role在将文档添加到集合中时检查您的用户。Simple-Schema将帮助您防止将垃圾数据插入/更新到集合中。和alanning:rolespackage 通过控制谁有权写入/读取/更新您的集合文档,无疑使您的应用程序安全。

Alanning:角色包

于 2016-02-01T05:03:12.567 回答