如何防止从 JavaScript 控制台调用 'Meteor.call'
How to prevent invoking 'Meteor.call' from JavaScript Console?
我刚刚注意到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()
一样。这些是流星中的全局函数。
但是,您可以采取一些简单的步骤来保护您的方法。
- 使用
aldeed:simple-schema
设置集合可以接受的数据类型。这将允许您设置集合采用的特定键以及它们的类型(字符串、布尔值、数组、对象、整数(https://github.com/aldeed/meteor-simple-schema - 确保只有登录用户才能从您的方法进行更新。或者设置全局允许/拒绝规则。https://www.meteor.com/tutorials/blaze/security-with-methods&&https://www.discovermeteor.com/blog/allow-deny-a-security-primer/
- 删除包
insecure
和autopublish
架构和允许/拒绝的简单组合应该可以很好地满足您的需求。
正如您现在所知,您不能真正阻止从 Javascript 控制台调用Meteor.call
,我想添加什么作为建议@Stephen和@thatgibbyguy,请务必在将文档添加到集合时检查用户的role
。 Simple-Schema
将帮助您防止在集合中插入/更新垃圾数据。alanning:roles
包通过控制谁有权编写/读取/更新您的集合文档,肯定会使您的应用程序安全。
Alanning:角色包
- Meteor.call()回调未向模板返回值
- 调试器在Meteor.call(可能是客户端/服务器调试)之后停止
- 假设:Meteor.call()首先尝试在客户端环境中运行,这是真的吗
- Meteor.call赢得'构建后无法工作
- 在客户端上从 Meteor.call 获取未定义,但在服务器上变量包含数据
- Iron router on Action 使用 Meteor.call 抛出 writeHead 不是一个函数
- Meteor.call从服务器返回未定义到客户端
- 如何防止从 JavaScript 控制台调用 'Meteor.call'
- Meteor.call(..) 会导致刷新页面
- Meteor:Meteor.call() 从内部观察回调不执行
- Meteor.call回调未执行,并且它'如果我不这样做,它会被默默地忽略'Don’我不去拿东西
- Meteor.call获取要在对象中设置的服务器时间'的属性
- Meteor.call'加载'参数
- 为什么无法识别 Meteor.call()
- Meteor方法成功更新了数据库,但向Meteor.call返回500个错误
- Meteor.call() -它可以被中止(在它完成之前停止)
- 为什么流星更新记录而不运行"Meteor.call"更新
- 为什么在客户端中Meteor.call()返回undefined
- 如何在客户端对Meteor.call()返回值
- Object's数据传递给Meteor.call时丢失