22

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

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

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

4

2 回答 2

65

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

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

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

Meteor 还会将用户 ID 发送到客户端,因为您当然想根据登录者更改客户端的行为方式和屏幕上的内容。正如您所说,我们无法阻止流氓客户端任意更改它的任何 JavaScript 代码都可以更改它认为的用户 ID!但是这样做并没有给客户端任何新的权限,因为仍然只有服务器代码做出安全决策。

您可以使用安全方应用程序进行尝试:

  1. 制作派对应用程序$ meteor create --example parties
  2. 创建一个用户帐户并双击地图以创建一个派对。选中该框以使其成为私人聚会。
  3. 打开 JavaScript 控制台并键入Meteor.userId()以获取您的用户 ID。
  4. 登出。该聚会将从屏幕上消失,因为服务器不会将其发布给任何其他用户。
  5. 现在,进入控制台并Meteor.userId()使用返回所需 ID 的新函数进行覆盖。

所以现在你已经假装客户端认为它是你的用户。但是服务器知道得更好。屏幕上仍然没有派对,您无法更新派对收藏以更改该派对信息。

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

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

于 2012-11-11T20:12:10.747 回答
2

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

我认为这并不像人们所说的那样安全。

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


更新

经过反思...

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

于 2013-07-14T22:39:45.940 回答