一个流星教程谜题,客户端授权安全吗?

时间:2014-01-12 19:33:53

标签: meteor

我完成了本教程,并试图找出授权的工作原理:

https://www.openshift.com/blogs/day-15-meteor-building-a-web-app-from-scratch-in-meteor

我看到客户端代码写得很好,并且通过调用

来处理登录用户的权限
if(Meteor.userId())

但据我所知,在epollserver.js的服务器端代码处理客户端授权。

我尝试创建一个喜欢for循环但是失败的问题的脚本:)所以我想知道我是否遗漏了关于博客的一些内容,关于metamagics在流星中的工作方式或是否教程实际上导致了不安全的代码?

3 个答案:

答案 0 :(得分:2)

Meteor具有内置帐户功能,因此它有一个名为accounts-base的登录包,可以为您处理此问题。

代码在后台,而不在主项目文件中。您可以在此处查看包裹的内容:https://github.com/meteor/meteor/tree/devel/packages/accounts-base

Meteor在处理安全性方面略有不同。你正在使用的教程没有提到太多,也许这就是问题的原因。

稍微提到了insecure包。在meteor中,您不能只在数据库中更新字段而没有相应的.allow规则(文档:http://docs.meteor.com/#allow)。

如果保留默认情况下安装的不安全软件包,则可以根据需要编辑集合。这就是本教程建议删除它的原因。

允许规则并发布

您可以指定一条规则,告诉meteor只允许某些用户更改数据库。

同样,当谈到autopublish时,您可以控制从服务器向客户端发送的数据库数据。

结合起来,这两者使得流星的安全性与传统的Web应用程序相同。你有一个可以看到html和js的浏览器,但是当它涉及到它可以看到的数据或它可以更新的数据时,它将以安全的方式进行控制。

答案 1 :(得分:1)

在客户端,您可以使用Meteor.userId()来管理已登录用户或匿名用户的显示。 事实上,你可以认为它不安全,但事实上,如果你仔细考虑你的服务器端代码就足够了。我来解释一下:

在meteor Js中,您通过发布/订阅管理集合,并通过Meteor.call直接进行网络调用。因此,您必须在服务器端保护两者。

对于第一个,您必须删除不安全和自动发布。 然后在集合上使用allow / deny来管理谁可以插入/更新/删除数据。 然后在您的发布功能中,只在服务器端,您必须添加:

if (!this.userId) return this.error(new Meteor.Error(403, 'unauthorized access'));

对于第二个(Meteor.call),您只需添加所有必需的Meteor.methods(在服务器端):

if (!Meteor.userId()) throw new Meteor.Error(403, 'unauthorized access');

有了这些东西,你的应用程序是“安全的”。是的,用户可以破解您的客户端代码以尝试显示仅适用于已登录用户的模板,但事实上,该用户将无法检索任何数据,因此是安全的!

另外,不要忘记将服务器和客户端代码拆分到不同的文件夹(服务器和客户端),否则客户端将下载所有代码。这不安全! 希望它能帮助你理解Meteor Js。

答案 2 :(得分:0)

实际上,该教程确实导致了不安全的代码,因为我设法在没有登录的情况下通过JS控制台添加了一个问题,我最初的预感是代码缺少服务器端检查是正确的

我怀疑在if(Meteor.userId())中还有三个epollserver.js可以解决这个问题,这是一个基本的授权编码失败,没有观察到咒语首先保护服务器,然后在必要时从客户端保护“