Meteor.userId是可变的

时间:2012-11-11 14:06:51

标签: javascript security meteor

使用Meteor,我发现即使删除了不安全的软件包,客户端也可以更改Meteor.userId函数。例如,

Meteor.userId=function() {return "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"}

可以使用Meteor.default_connection.userId()(重定向的函数)完成。我如何确保这一点?

2 个答案:

答案 0 :(得分:65)

这是一个很好的问题,因为它显示了Meteor安全模型的工作原理。

这里没有安全问题,因为Meteor 从不信任客户端代码。

在Meteor中,只有服务器决定每个客户端有权访问哪些数据(请参阅Meteor.publish)以及允许每个客户端更改哪些数据(请参阅Meteor.allow)。当客户端向服务器进行身份验证时,服务器会存储用户的ID。在该客户端注销之前,它会将该ID作为Meteor.publish提供给服务器上的Meteor.allowuserId函数。

Meteor还会在客户端上发送用户ID,因为您当然希望根据登录的人员更改客户端的行为方式以及屏幕上的内容。正如您所说,我们无法阻止恶意客户端从任意改变它的任何JavaScript代码来改变它认为用户ID是什么!但这样做并没有给客户端任何新的权限,因为它仍然只是作出安全决策的服务器代码。

您可以使用安全方应用程序尝试此操作:

  1. 使用$ meteor create --example parties
  2. 制作派对应用
  3. 创建一个用户帐户,然后双击地图即可创建一个聚会。选中此框以使其成为私人派对。
  4. 打开JavaScript控制台并输入Meteor.userId()以获取用户ID。
  5. 退出。聚会将从屏幕上消失,因为服务器不会将其发布给任何其他用户。
  6. 现在,进入控制台并用一个返回所需ID的新函数覆盖Meteor.userId()
  7. 所以现在你假装客户认为它是你的用户。但服务器知道的更好。屏幕上仍然没有派对,您无法更新派对集合以更改该派对信息。

    事实上,将客户端用户ID设置为您想要的任何内容都是完全安全的!您可以直接进入帐户系统并致电Meteor.default_connection.setUserId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");。试试吧,你会看到右上角的登录按钮变成动画。那是因为客户端正在调用Meteor.user()来显示您刚设置的登录用户的电子邮件地址。但是因为您没有以该用户身份登录服务器,所以它不会发布有关该用户的任何信息,而您只是获得了这个用户。

    这是一个非常强大的安全模型。您不必担心任何客户端代码,即使在大多数代码所在的大多数应用程序中都存在!只要您编写安全服务器方法,发布函数和允许/拒绝规则,无论客户端尝试做什么,您都会被完全锁定。

答案 1 :(得分:2)

我刚刚使用两个浏览器测试了Meteor,并在每个浏览器之间复制了本地存储Meteor.userIdMeteor.loginToken,他们都将我作为同一个人登录。当我退出一个时,我仍然可以在另一个中发布。

我认为这不像现在这样安全。

如果我可以复制这些值并仍然被视为同一个用户,即使我使用的是其他浏览器,那么它根本就不安全。


更新

经过反思......

我想可以在登录时记录用户的IP address。然后,如果用户尝试访问并且IP地址不同,您可以要求他们再次登录。