【问题标题】:How is Meteor secure?Meteor 的安全性如何?
【发布时间】:2014-12-29 01:37:02
【问题描述】:

文档建议使用 Meteor.methods 创建安全的方法。

用户是否可以在浏览器的控制台中编写代码,以允许用户绕过安全性并将任意数据发送到服务器数据库 (MongoDB)?如果没有,为什么不呢?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    是的,但前提是该方法无法检查其输入和上下文。幸运的是,meteor 提供了使这项任务非常简单的工具。让我们看一个我用来回答this question 的示例方法。 sendMessage 是一种让用户在聊天室中发送消息的方法:

    Meteor.methods({
      sendMessage: function(message, roomId) {
        check(message, String);
        check(roomId, String);
    
        if (!this.user)
          throw new Meteor.Error(401, 'You must be logged in.');
    
        if (_.isEmpty(message))
          throw new Meteor.Error(403, 'Message must not be empty.');
    
        var room = Rooms.findOne(roomId);
    
        if (!room)
          throw new Meteor.Error(404, 'Room not found.');
    
        if (!_.contains(room.members, this.userId))
          throw new Meteor.Error(403, 'You are not in the room.');
    
        return Messages.insert({
          userId: this.userId,
          roomId: roomId,
          message: message
        });
      }
    });
    

    以下是验证:

    • 使用check 确保输入的类型正确(防止注入攻击)。
    • 确保用户已登录(请参阅accounts api)。
    • 确保消息格式正确。
    • 确保房间存在。
    • 确保当前用户确实在房间内。

    将此与 sendMessage 的幼稚实现进行对比:

    Meteor.methods({
      sendMessage: function(message, roomId) {
        return Messages.insert({
          userId: this.userId,
          roomId: roomId,
          message: message
        });
      }
    });
    

    在这里,任何连接的客户端都可以打开终端并开始将消息注入任何聊天室。更糟糕的是,message 可能是一个对象并对其他客户端造成各种意想不到的后果。

    没有免费的安全午餐 - 您应该验证一切并假设最坏的情况。但是,如果您努力,您实际上可以生成高度安全的方法。

    我强烈建议您查看 Emily Stark 的 Meteor Meets Mallory 演讲,其中她更详细地介绍了这些要点。

    【讨论】:

    • 酷,谢谢。我看到方法 itself 是如何安全的,但是用户是否可以通过覆盖 Meteor 对象(或类似对象)来绕过这些检查,然后创建没有这些检查的任意方法?也许用户可以从页面内部(初始)手动请求页面并修改脚本,然后也许在 iframe 中使用修改后的代码运行它?或者也许使用仔细覆盖的方法在当前环境中运行它?这是可能的,还是在服务器端有什么东西可以确保这是不可能的?
    • Meteor 的编写假设客户端代码可能被完全破坏。无论客户端发生什么,所有数据库突变都必须通过服务器(假设不安全的包已被删除)。例如,客户端可以重新实现一个方法,但这并不重要,因为meteor 只将客户端方法视为模拟——真正的方法必须在服务器上运行才能产生任何副作用。除非攻击者获得对服务器本身的访问权限,否则服务器方法不会受到攻击。
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2014-12-07
    • 2015-03-04
    • 2019-04-03
    相关资源
    最近更新 更多