Javascript 我应该对没有数据库操作的方法使用Meteor方法存根吗?
正如@Akshat所解释的,我知道我可以在数据库操作实际发生在服务器上之前使用方法存根来模拟它 我想知道我是否可以也应该使用存根来确保用户有权在不涉及任何数据库操作的情况下执行操作(例如显示编辑按钮) 请注意,我不想使用alanning:roles包,我想了解它是如何工作的,以及是否可以按如下方式完成: 假设我想检查管理员权限。每个用户文档都有一个Javascript 我应该对没有数据库操作的方法使用Meteor方法存根吗?,javascript,meteor,Javascript,Meteor,正如@Akshat所解释的,我知道我可以在数据库操作实际发生在服务器上之前使用方法存根来模拟它 我想知道我是否可以也应该使用存根来确保用户有权在不涉及任何数据库操作的情况下执行操作(例如显示编辑按钮) 请注意,我不想使用alanning:roles包,我想了解它是如何工作的,以及是否可以按如下方式完成: 假设我想检查管理员权限。每个用户文档都有一个角色字符串数组字段,我在其中存储用户全局权限,即用户,管理员,超级管理员,等等 我在lib文件夹中声明我的Users集合,可供客户端和服务器使用: l
角色
字符串数组字段,我在其中存储用户全局权限,即用户
,管理员
,超级管理员
,等等
我在lib
文件夹中声明我的Users
集合,可供客户端和服务器使用:
let Users = Meteor.users
export default Users
我创建了一个方法存根,仅用于检查客户端的管理员权限(它位于客户端文件夹中):
在一个服务器文件夹中,我将创建一个真正的方法,该方法调用一个写在下面的内部服务器函数(注意,在这种情况下,我可以将userId
设置为参数):
现在,假设我的UI上有一个编辑按钮,我会根据UserIsAdmin
方法的结果来显示它。以下是问题:
角色
数组),但我们在加载路由之前检查了方法:将加载路由及其UI,对吗?没有回滚?当然,不会填充UI,因为发布不会返回任何内容我不认为这能给你带来额外的安全感。您已经基于管理员权限隐藏了管理员UI,然后您正在阻止服务器端的假管理员执行任何管理员操作。想必您也没有将管理员数据发布给非管理员 即使您让用户很难查看管理屏幕,他们仍然可以看到创建它的源代码以及它调用的方法。他们最终可以对管理系统控制的内容进行反向工程 如果你的管理员用户界面被捆绑并提供给非管理员用户,那么完全隐藏它是完全可能的。常见的模式是在单独的主机或端口上创建第二个管理员应用程序,该主机或端口只能由管理员访问。管理应用程序连接到同一个mongo db,因此可以控制消费者应用程序的用户可以做什么
您提供给攻击者的一些最大线索是您使用的角色名称(admin、superadmin)。在已发布的meteor代码中搜索“admin”并获得有趣事情发生的线索太容易了。方法名称也很容易识别,因为它们不会被缩小和混淆,请仔细选择它们。我认为这在额外的安全性方面并不能给您带来多大好处。您已经基于管理员权限隐藏了管理员UI,然后您正在阻止服务器端的假管理员执行任何管理员操作。想必您也没有将管理员数据发布给非管理员 即使您让用户很难查看管理屏幕,他们仍然可以看到创建它的源代码以及它调用的方法。他们最终可以对管理系统控制的内容进行反向工程 如果你的管理员用户界面被捆绑并提供给非管理员用户,那么完全隐藏它是完全可能的。常见的模式是在单独的主机或端口上创建第二个管理员应用程序,该主机或端口只能由管理员访问。管理应用程序连接到同一个mongo db,因此可以控制消费者应用程序的用户可以做什么
您提供给攻击者的一些最大线索是您使用的角色名称(admin、superadmin)。在已发布的meteor代码中搜索“admin”并获得有趣事情发生的线索太容易了。方法名称也很容易识别,因为它们不会被缩小和混淆,请仔细选择它们。您的代码取决于Meteor方法的返回值,但您有客户端和服务器端返回值。幸运的是,很好地定义了您将得到哪一个:
- 如果在
中有回调,则Meteor.call()
函数不返回任何内容,回调函数将使用服务器端返回值进行调用call
- 如果
中没有回调,那么您将同步获得客户端返回值Meteor.call()
Meteor.methods({
UserIsAdmin = function () {
console.log(this.isSimulation) //Will be true
let user = Users.findOne({_id: Meteor.userId()})
return !!(user && user.roles && user.roles.indexOf('admin') != -1)
}
});
import Users from '/imports/user/lib/user_collection.js'
Meteor.methods({
UserIsAdmin = function () {
console.log(this.isSimulation) //Will be false
return Users.isAdmin()
}
});
Users.isAdmin = function (userId=Meteor.userId()) {
var user = Users.findOne({_id: userId})
return !!(user && user.roles && user.roles.indexOf('admin') != -1)
};