我刚注意到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
做得好吗?
或者我错过了一些重要的东西?
答案 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
一样。这些是流星中的全局函数。
但是您可以采取简单的步骤来保护您的方法。
CollectionName.find().count()
设置您的收藏集可以接受的数据类型。这将允许您设置集合所采用的特定键及其类型(字符串,布尔值,数组,对象,整数)Collections.reverseOrder()
aldeed:simple-schema
和insecure
架构和允许/拒绝的简单组合应该没问题。
答案 4 :(得分:0)
如你所知,你现在无法阻止从Javascript控制台调用Meteor.call
,我想添加@Stephen和@thatgibbyguy作为建议,请务必检查你的用户{将文档添加到集合中时{1}}。 role
将帮助您防止将垃圾数据插入/更新到集合中。和Simple-Schema
软件包通过控制谁有权编写/读取/更新您的收集文档,确保您的应用程序安全。