Meteor如何安全?

时间:2014-11-02 06:14:59

标签: meteor

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

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

1 个答案:

答案 0 :(得分:2)

是的,但前提是该方法无法检查其输入和上下文。幸运的是,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演讲,并详细介绍这些观点。