Meteor.userId是可变的

Zwa*_*ade 22 javascript security meteor

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

Meteor.userId=function() {return "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"}
Run Code Online (Sandbox Code Playgroud)

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

deb*_*lis 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.

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