【问题标题】:Meteor.userId is changeableMeteor.userId 是可变的
【发布时间】:2012-10-31 04:12:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript security meteor


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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


      更新

      经过反思……

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

      【讨论】:

      • loginToken 代表相应账户的“王国之钥”(通证的生命周期,默认为 90 天)。所以保护令牌是关键,因为如果它泄漏,任何人都可以验证与该服务器/帐户的 DDP 连接(例如,参见 ddp-login npm 包)。
      • 所以基本上,您的意思是,如果有人可以物理访问您的计算机以复制您的登录 ID 和令牌,那么 所有赌注都已关闭。我们实际上能做些什么呢?这就像有人在拥有您的计算机时复制您的 ssh 密钥一样不安全,但是 SSH 被认为是非常安全的……所以,加密您的计算机。 :)
      猜你喜欢
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      相关资源
      最近更新 更多