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

How to prevent invoking 'Meteor.call' from JavaScript Console?

本文关键字:Meteor call 调用 何防止 JavaScript 控制台      更新时间:2023-09-26

我刚刚注意到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做得足够好吗?还是我错过了重要的东西?

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

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

这不仅仅是流星的问题。我认为所有此类应用程序都需要潜在地防止其数据损坏,即使通过合法用户也是如此

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

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

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

由于 k1

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

作用。

正如@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(还是来自客户端。

一般来说,从您的方法进行检查和数据操作是一种不错的方法。允许/拒绝一开始很好,但是当您的集合变得更重并且您的边缘情况扩展时,就变得非常难以维护。

您无法从控制台阻止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

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

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

Alanning:角色包