流星 - 它有多安全?

时间:2016-04-15 07:59:32

标签: angularjs meteor angular angular-meteor angular2-meteor

我实际上正在使用meteor创建我的第一个应用程序,特别是使用角度2.我已经体验过Angular 1和2,所以基于它。我有一些值得关注的问题......

让我们想象一下这个场景......我的数据存储在MongoDb上:

收藏:客户

for(int i = 0; i < n; i++)
{
    mm.push_back(std::make_shared<double>(3.14 * i));
};

现在,在我的meteor客户端文件夹中,我已经进行了这次穿刺......

collection clients.ts(服务器文件夹)

{
 name : "Happy client",
 password : "Something non encrypted",
 fullCrediCardNumber : "0000 0000 0000 0000"
}

组件client.ts(不是服务器文件夹)

export var Clients = new Mongo.Collection('clients');

..和最后:用于呈现它的html页面,但只显示客户端的名称:

import {Clients} from '../collections/clients.ts';

class MyClients {
clients: Array<Object>;
constructor(zone: NgZone) {
    this.clients = Clients.find();
    }
}

好到目前为止。但我担心的是:角度1&amp; 2个应用程序组件或控制器或指令在客户端运行,而不是在服务器端运行。

我设置我的html只是为了显示客户端的名称。但是因为它是HTML渲染,可能有一些技巧很容易将一些代码注入角度的HTML渲染中以显示我的所有字段。

或者可以很容易地进入控制台并键入一些命令以显示数据库集合中的整个对象。

所以,我的问题是:在这个意义上,流星的安全性如何?我的担忧是否正确?流星是否能够保护我的数据,保护集合的名称?我知道我可以在find()上指定不给我带来那些敏感数据,但是因为find()可能不在服务器端运行,所以可以很容易地动态修改它,不是吗?

无论如何......在这种意义上,我会理解关于流星如何安全(或不安全)的解释。

ty!

1 个答案:

答案 0 :(得分:2)

您可以通过简单地不在服务器端发布任何敏感数据来保护数据。

Meteor.publish("my-clients", function () {
  return Clients.find({
    contractorId: this.userId   // Publish only the current user's clients
  }, {
    name: 1,    // Publish only the fields you want the browser to know of
    phoneNumber: 1 
  });
});

此示例仅发布当前登录用户客户端的nameaddress字段,但不会发布其passwordfullCreditCardNumber

另一个很好的例子是Meteor.users集合。在服务器上,它包含所有用户的所有用户数据,登录凭据,配置文件等。但它也可以在客户端访问。 Meteor为保护这个非常敏感的集合做了两件重要的事情:

  • 默认情况下,它只发布一个文档:登录的用户。如果在浏览器控制台中键入Meteor.users.find().fetch(),您将只看到当前登录用户的数据,并且无法使用客户端获取整个MongoDB users集合。正确的方法是限制Meteor.publish功能中已发布文档的数量。请参阅上面的示例,或Meteor publish and subscribe tutorial中的10.9。

  • 不会发布整个用户文档。例如,OAuth登录凭据和密码哈希不是,您将无法在客户端集合中找到它们。您可以随时选择发布文档的哪个部分,一种简单的方法是使用MongoDB projections,如上例所示。