1

我实际上是在使用流星创建我的第一个应用程序,特别是使用 Angular 2。我有使用 Angular 1 和 2 的经验,所以基于它。我有些担心...

让我们想象一下这种情况......我的数据存储在 MongoDb 上:

收藏:客户

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

现在,在我的流星客户端文件夹中,我有这个结构......

收集clients.ts(服务器文件夹)

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

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

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

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

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

<li *ngFor="#item of clients">
  {{client.name}}
</li>

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

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

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

所以,我的问题是:从这个意义上说,流星有多安全?我的担忧正确吗?流星是否能够保护我的数据,保护收藏品的名称?我知道我可以在 find() 上指定不给我带来那些敏感数据,但是由于 find() 可能不在服务器端运行,所以可以很容易地即时修改它,不是吗?

无论如何......我会很感激关于流星在这个意义上是如何安全(或不安全)的解释。

泰!

4

1 回答 1

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

此示例仅发布当前登录用户客户端的nameandaddress字段,而不发布其passwordor fullCreditCardNumber

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

  • 默认情况下它只发布一个文档:登录的用户。如果你Meteor.users.find().fetch()在浏览器控制台中输入,你只会看到当前登录的用户的数据,客户端无法获取整个 MongoDBusers集合。执行此操作的正确方法是限制函数中已发布文档的数量Meteor.publish请参阅上面的示例,或Meteor 发布和订阅教程中的 10.9 。

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

于 2016-04-15T11:31:40.753 回答