Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我应该对没有数据库操作的方法使用Meteor方法存根吗?_Javascript_Meteor - Fatal编程技术网

Javascript 我应该对没有数据库操作的方法使用Meteor方法存根吗?

Javascript 我应该对没有数据库操作的方法使用Meteor方法存根吗?,javascript,meteor,Javascript,Meteor,正如@Akshat所解释的,我知道我可以在数据库操作实际发生在服务器上之前使用方法存根来模拟它 我想知道我是否可以也应该使用存根来确保用户有权在不涉及任何数据库操作的情况下执行操作(例如显示编辑按钮) 请注意,我不想使用alanning:roles包,我想了解它是如何工作的,以及是否可以按如下方式完成: 假设我想检查管理员权限。每个用户文档都有一个角色字符串数组字段,我在其中存储用户全局权限,即用户,管理员,超级管理员,等等 我在lib文件夹中声明我的Users集合,可供客户端和服务器使用: l

正如@Akshat所解释的,我知道我可以在数据库操作实际发生在服务器上之前使用方法存根来模拟它

我想知道我是否可以也应该使用存根来确保用户有权在不涉及任何数据库操作的情况下执行操作(例如显示编辑按钮)

请注意,我不想使用alanning:roles包,我想了解它是如何工作的,以及是否可以按如下方式完成:

假设我想检查管理员权限。每个用户文档都有一个
角色
字符串数组字段,我在其中存储用户全局权限,即
用户
管理员
超级管理员
,等等

我在
lib
文件夹中声明我的
Users
集合,可供客户端和服务器使用:

let Users = Meteor.users
export default Users
我创建了一个方法存根,仅用于检查客户端的管理员权限(它位于客户端文件夹中):

在一个服务器文件夹中,我将创建一个真正的方法,该方法调用一个写在下面的内部服务器函数(注意,在这种情况下,我可以将
userId
设置为参数):

现在,假设我的UI上有一个编辑按钮,我会根据
UserIsAdmin
方法的结果来显示它。以下是问题:

  • 如果用户设法更改了角色数组或弄乱了方法,我假设该按钮将一直显示,直到服务器响应方法调用,对吗?但是它在延迟方面没有帮助,UI无论如何都会被加载
  • 同样的情况(用户不是管理员,但在本地修改了他的
    角色
    数组),但我们在加载路由之前检查了方法:将加载路由及其UI,对吗?没有回滚?当然,不会填充UI,因为发布不会返回任何内容
  • 我拒绝允许/拒绝规则中的每个插入/更新/删除,因此我可以考虑用户不能修改自己的文档。如果是这样,是否值得花时间为不执行任何数据库操作的方法编写方法存根?我的意思是,这不是一种保护用户界面的可靠方法(见上面的问题2),数据也不会被发布。除了db操作之外,是否有编写方法存根的情况

  • 我不认为这能给你带来额外的安全感。您已经基于管理员权限隐藏了管理员UI,然后您正在阻止服务器端的假管理员执行任何管理员操作。想必您也没有将管理员数据发布给非管理员

    即使您让用户很难查看管理屏幕,他们仍然可以看到创建它的源代码以及它调用的方法。他们最终可以对管理系统控制的内容进行反向工程

    如果你的管理员用户界面被捆绑并提供给非管理员用户,那么完全隐藏它是完全可能的。常见的模式是在单独的主机或端口上创建第二个管理员应用程序,该主机或端口只能由管理员访问。管理应用程序连接到同一个mongo db,因此可以控制消费者应用程序的用户可以做什么


    您提供给攻击者的一些最大线索是您使用的角色名称(admin、superadmin)。在已发布的meteor代码中搜索“admin”并获得有趣事情发生的线索太容易了。方法名称也很容易识别,因为它们不会被缩小和混淆,请仔细选择它们。

    我认为这在额外的安全性方面并不能给您带来多大好处。您已经基于管理员权限隐藏了管理员UI,然后您正在阻止服务器端的假管理员执行任何管理员操作。想必您也没有将管理员数据发布给非管理员

    即使您让用户很难查看管理屏幕,他们仍然可以看到创建它的源代码以及它调用的方法。他们最终可以对管理系统控制的内容进行反向工程

    如果你的管理员用户界面被捆绑并提供给非管理员用户,那么完全隐藏它是完全可能的。常见的模式是在单独的主机或端口上创建第二个管理员应用程序,该主机或端口只能由管理员访问。管理应用程序连接到同一个mongo db,因此可以控制消费者应用程序的用户可以做什么


    您提供给攻击者的一些最大线索是您使用的角色名称(admin、superadmin)。在已发布的meteor代码中搜索“admin”并获得有趣事情发生的线索太容易了。方法名称也很容易识别,因为它们不会被缩小和混淆,请仔细选择它们。

    您的代码取决于Meteor方法的返回值,但您有客户端和服务器端返回值。幸运的是,很好地定义了您将得到哪一个:

    • 如果在
      Meteor.call()
      中有回调,则
      call
      函数不返回任何内容,回调函数将使用服务器端返回值进行调用
    • 如果
      Meteor.call()
      中没有回调,那么您将同步获得客户端返回值
    无论哪种方式,您都只能看到其中一个返回值。它不像订阅那样,以后会以某种方式同步值。请参见此处的文档:

    回答您的问题:

  • 取决于是否使用回调。如果没有,则显示管理UI,并且不会回滚
  • 与1相同
  • 您应该始终假定用户能够并且愿意修改所有客户端数据。拒绝规则根本不会改变这一点,它们只会停止将这些更改传播到服务器 除了db操作之外,您还可以通过服务器端方法调用执行各种操作,例如使用密钥访问第三方REST API、启动后台操作等

    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)
    };