使用Meteor,我发现即使删除了不安全的软件包,客户端也可以更改Meteor.userId函数。例如,
Meteor.userId=function() {return "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"}
可以使用Meteor.default_connection.userId()
(重定向的函数)完成。我如何确保这一点?
答案 0 :(得分:65)
这是一个很好的问题,因为它显示了Meteor安全模型的工作原理。
这里没有安全问题,因为Meteor 从不信任客户端代码。
在Meteor中,只有服务器决定每个客户端有权访问哪些数据(请参阅Meteor.publish)以及允许每个客户端更改哪些数据(请参阅Meteor.allow)。当客户端向服务器进行身份验证时,服务器会存储用户的ID。在该客户端注销之前,它会将该ID作为Meteor.publish
提供给服务器上的Meteor.allow
和userId
函数。
Meteor还会在客户端上发送用户ID,因为您当然希望根据登录的人员更改客户端的行为方式以及屏幕上的内容。正如您所说,我们无法阻止恶意客户端从任意改变它的任何JavaScript代码来改变它认为用户ID是什么!但这样做并没有给客户端任何新的权限,因为它仍然只是作出安全决策的服务器代码。
您可以使用安全方应用程序尝试此操作:
$ meteor create --example parties
Meteor.userId()
以获取用户ID。Meteor.userId()
。所以现在你假装客户认为它是你的用户。但服务器知道的更好。屏幕上仍然没有派对,您无法更新派对集合以更改该派对信息。
事实上,将客户端用户ID设置为您想要的任何内容都是完全安全的!您可以直接进入帐户系统并致电Meteor.default_connection.setUserId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
。试试吧,你会看到右上角的登录按钮变成动画。那是因为客户端正在调用Meteor.user()
来显示您刚设置的登录用户的电子邮件地址。但是因为您没有以该用户身份登录服务器,所以它不会发布有关该用户的任何信息,而您只是获得了这个用户。
这是一个非常强大的安全模型。您不必担心任何客户端代码,即使在大多数代码所在的大多数应用程序中都存在!只要您编写安全服务器方法,发布函数和允许/拒绝规则,无论客户端尝试做什么,您都会被完全锁定。
答案 1 :(得分:2)
我刚刚使用两个浏览器测试了Meteor,并在每个浏览器之间复制了本地存储Meteor.userId
和Meteor.loginToken
,他们都将我作为同一个人登录。当我退出一个时,我仍然可以在另一个中发布。
我认为这不像现在这样安全。
如果我可以复制这些值并仍然被视为同一个用户,即使我使用的是其他浏览器,那么它根本就不安全。
更新
经过反思......
我想可以在登录时记录用户的IP address。然后,如果用户尝试访问并且IP地址不同,您可以要求他们再次登录。