2016-04-15 86 views
1

我实际上是在使用流星来创建我的第一个应用程序,特别是使用角度2.我已经使用过Angular 1和2,所以基于它。我有一些问题的关注......流星 - 它有多安全?

让我们想象一下这个场景......我的存储数据有关MongoDB:

收藏:客户

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

现在,我的流星客户端文件夹,我“这已经... struncture

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

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

合作mponent 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> 

好为止。但我担心的是:在应用程序中,组件或控制器或指令在客户端而不是服务器端运行。

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

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

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

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

ty!

+1

这是一个很大的话题。我建议阅读本指南的[security](http://guide.meteor.com/security.html)部分。 –

+2

一般来说(非常普遍),你不应该发送他们没有访问的数据,这样如果他们是恶意的,他们只能看到允许看到的数据。你的客户端是不安全的,所以不要相信它不公开数据,执行验证等。 – ste2425

+0

是的,但要记住:你有一个client.find()运行在客户端...我可以把像client.find(只有我希望的字段)...没关系......但是因为find()命令将在客户端运行,所以任何人都可以轻松执行诸如client.find之类的东西(包括敏感数据) - 从客户端执行直接的find()MongoDB命令看起来非常简单。我试图弄清楚我的理论是否正确。 –

回答

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.users.find().fetch()到浏览器控制台,您只能看到当前登录在用户的数据中,并且客户端无法获取整个MongoDB集合。这样做的正确方法是限制您的Meteor.publish函数中已发布文档的数量。看到我上面的例子,或在Meteor publish and subscribe tutorial 10.9。

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

+0

嗨@aedm! ty!我阅读了许多关于用户收藏的文章。但是,我可以使用不同的集合来做同样的事,还是只适用于用户集合? –

+0

是的,您可以将相同的技巧应用到您的所有藏品中,并保护它们。 – aedm