【问题标题】:Meteor - How safe it is?流星 - 它有多安全?
【发布时间】:2016-08-07 02:10:33
【问题描述】:

我实际上是在使用流星创建我的第一个应用程序,特别是使用 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>

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

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

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

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

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

ty!

【问题讨论】:

  • 这是一个很大的话题。我建议阅读指南的security 部分。
  • 一般来说(非常一般地)你不应该发送他们无权访问的数据,这样如果他们是恶意的,他们只会看到允许看到的数据。您的客户端永远不安全,所以不要相信它不会公开数据、执行验证等。
  • 是的,但请记住:您有一个 client.find() 在客户端运行...我可以放置类似 client.find 的内容(仅我希望的字段)...那就是好的...但是由于 find() 命令将在客户端运行,因此任何人都可以轻松执行诸如 client.find(everything ,包括敏感数据)之类的东西 - 看起来很容易从客户端。我想弄清楚我的理论是否正确。

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


【解决方案1】:

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

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,就像上面的示例一样。

【讨论】:

  • 嗨@aedm!呸!!我阅读了很多关于用户收藏的文章。但是我可以使用不同的集合做同样的事情还是只适用于用户集合?
  • 是的,您可以将相同的技术应用于您的所有收藏,并同样保护它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多