2012-11-11 28 views
22

Chơi xung quanh với Meteor, tôi đã thấy rằng ngay cả với gói không an toàn được gỡ bỏ, máy khách cũng có thể thay đổi hàm Meteor.userId. Ví dụ:Meteor.userId có thể thay đổi

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

có thể được thực hiện với Meteor.default_connection.userId() (chức năng được chuyển hướng). Làm cách nào để tôi bảo mật điều này?

Trả lời

65

Đây là một câu hỏi tuyệt vời vì nó cho thấy cách hoạt động của mô hình bảo mật Meteor.

Không có vấn đề bảo mật ở đây vì Meteor không bao giờ tin cậy mã máy khách.

Trong Meteor, chỉ máy chủ quyết định dữ liệu mà mỗi khách hàng có quyền truy cập (xem Meteor.publish) và dữ liệu nào mà mỗi khách hàng được phép thay đổi (xem Meteor.allow). Khi một khách hàng xác thực với máy chủ, máy chủ lưu trữ ID của người dùng. Cho đến khi khách hàng đó đăng xuất, nó cung cấp ID đó cho các hàm Meteor.publishMeteor.allow của bạn trên máy chủ dưới dạng userId.

Meteor cũng gửi ID người dùng xuống máy khách, vì tất nhiên bạn muốn thay đổi cách ứng xử của khách hàng và nội dung trên màn hình dựa trên người đã đăng nhập. Và như bạn nói, chúng tôi không thể ngăn chặn sự lừa đảo khách hàng tự ý thay đổi bất kỳ mã JavaScript nào của nó để thay đổi những gì nó nghĩ rằng ID người dùng là! Nhưng làm điều đó không cung cấp cho khách hàng bất kỳ quyền mới nào, bởi vì nó vẫn chỉ là mã máy chủ đưa ra các quyết định bảo mật.

Bạn có thể thử điều này bằng cách sử dụng các ứng dụng bên an toàn:

  1. Thực hiện một ứng dụng bên với $ meteor create --example parties
  2. Tạo một tài khoản người dùng và nhấn đúp chuột vào bản đồ để tạo ra một bữa tiệc. Chọn hộp để biến nó thành một bữa tiệc riêng tư.
  3. Mở bảng điều khiển JavaScript và nhập Meteor.userId() để nhận ID người dùng của bạn.
  4. Đăng xuất. Bên sẽ biến mất khỏi màn hình vì máy chủ sẽ không xuất bản nó cho bất kỳ người dùng nào khác.
  5. Bây giờ, hãy vào bảng điều khiển và ghi đè Meteor.userId() bằng hàm mới trả về ID bạn muốn.

Vì vậy, bây giờ bạn đã giả mạo khách hàng nghĩ rằng đó là người dùng của bạn. Nhưng máy chủ biết rõ hơn. Sẽ không có một bên nào trên màn hình và bạn không thể cập nhật bộ sưu tập của Bên để thay đổi thông tin của bên đó.

Thực tế, hoàn toàn an toàn khi đặt ID người dùng ứng dụng thành bất kỳ thứ gì bạn muốn! Bạn có thể truy cập ngay vào hệ thống tài khoản và gọi Meteor.default_connection.setUserId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");. Hãy thử nó, và bạn sẽ thấy rằng nút đăng nhập ở góc trên bên phải biến thành một hình ảnh động. Đó là bởi vì khách hàng đang gọi Meteor.user() để hiển thị địa chỉ email của người dùng đã đăng nhập mà bạn vừa đặt. Nhưng vì bạn chưa đăng nhập vào máy chủ với tư cách người dùng đó, nó không xuất bản bất kỳ thông tin nào về người dùng đó và bạn chỉ nhận được spinny.

Đây là mô hình bảo mật rất mạnh. Bạn không phải lo lắng về bất kỳ mã khách hàng nào, mặc dù trong hầu hết các ứng dụng, nơi hầu hết mã nguồn đều hoạt động! Miễn là bạn viết các phương thức máy chủ bảo mật, xuất bản các hàm và cho phép/từ chối các quy tắc, bạn hoàn toàn bị khóa xuống bất kể khách hàng cố gắng làm gì.

2

Tôi vừa kiểm tra Meteor bằng hai trình duyệt và sao chép bộ nhớ cục bộ Meteor.userIdMeteor.loginToken giữa mỗi trình duyệt và cả hai đều đăng nhập tôi với tư cách cùng một người. Khi tôi đăng xuất khỏi một người, tôi vẫn có thể xuất bản ở người khác.

Tôi không nghĩ rằng điều này là an toàn như đang được thực hiện.

Nếu tôi có thể sao chép các giá trị này và vẫn được xem là cùng một người dùng, ngay cả khi tôi đang sử dụng một trình duyệt khác, thì nó hoàn toàn không an toàn.


Cập nhật

Sau khi phản ánh ...

Tôi cho rằng nó sẽ có thể đăng nhập các IP address của người dùng khi họ đăng nhập. Sau đó, nếu người dùng cố gắng truy cập và địa chỉ IP không giống nhau, bạn có thể yêu cầu họ đăng nhập lại.

+1

'loginToken' đại diện cho" chìa khóa cho vương quốc "cho tài khoản tương ứng (cho toàn bộ thời gian của mã thông báo, 90 ngày theo mặc định). Vì vậy, bảo vệ mã thông báo là chìa khóa, bởi vì nếu nó bị rò rỉ, bất kỳ ai cũng có thể xác thực kết nối DDP với máy chủ/tài khoản đó (xem gói [ddp-login] (https://www.npmjs.org/package/ddp-login) npm , ví dụ). – vsivsi

+0

Vì vậy, về cơ bản, bạn đang nói rằng nếu ai đó có quyền truy cập vật lý vào máy tính của bạn để sao chép id đăng nhập và mã thông báo của bạn rằng * tất cả các phiên cược bị tắt *. Chúng ta có thể làm gì về điều này? Điều này cũng không an toàn khi ai đó sao chép các khóa ssh của bạn nếu họ có máy tính của bạn, nhưng SSH được coi là thực sự an toàn ... Vì vậy, hãy mã hóa máy tính của bạn. :) – trusktr

Các vấn đề liên quan