2012-11-11 5 views
22

Podczas zabawy z Meteororem odkryłem, że nawet po usunięciu niezabezpieczonego pakietu klient może zmienić funkcję Meteor.userId. Na przykład:Meteor.userId można zmienić

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

jak można zrobić z Meteor.default_connection.userId() (funkcja przekierowania). Jak mogę to zabezpieczyć?

Odpowiedz

65

To jest świetne pytanie, ponieważ pokazuje, w jaki sposób działa system zabezpieczeń Meteor.

Nie ma tutaj problemu z bezpieczeństwem, ponieważ Meteor nigdy nie jest Ufa kodu klienta.

W systemie Meteor tylko serwer decyduje, do których danych każdy klient ma dostęp (patrz Meteor.publish) i jakie dane każdy klient może zmienić (patrz Meteor.allow). Gdy klient uwierzytelnia się na serwerze, serwer przechowuje identyfikator użytkownika. Do czasu wylogowania się klienta, ten identyfikator dla twoich Meteor.publish i Meteor.allow funkcjonuje na serwerze jako userId.

Meteor również wysyła ID użytkownika na kliencie, ponieważ oczywiście chcesz zmienić zachowanie klienta i to, co jest na ekranie w zależności od tego, kto jest zalogowany. A jak mówisz, nie możemy powstrzymać łotra klient zmienia dowolnie kod JavaScript, aby zmienić to, co według niego jest identyfikatorem użytkownika! Ale wykonanie tej czynności nie daje klientowi żadnych nowych uprawnień, ponieważ to tylko kod serwera podejmuje decyzje dotyczące bezpieczeństwa.

Można spróbować tego z użyciem bezpiecznego stosowania stron:

  1. Złóż aplikację stronom $ meteor create --example parties
  2. Utwórz konto użytkownika i kliknij dwukrotnie na mapę, aby stworzyć partię. Zaznacz to pole, aby było stroną prywatną.
  3. Otwórz konsolę JavaScript i wpisz Meteor.userId(), aby uzyskać identyfikator użytkownika.
  4. Wyloguj się. Strona zniknie z ekranu, ponieważ serwer nie opublikuje go dla żadnego innego użytkownika.
  5. Teraz przejdź do konsoli i nadpisaj Meteor.userId() z nową funkcją, która zwraca żądany ID.

Więc teraz sfałszowałeś klienta, by pomyśleć, że to twój użytkownik. Ale serwer wie lepiej. Na ekranie nadal nie będzie imprezy i nie można zaktualizować kolekcji Stron, aby zmienić informacje o tej stronie.

W rzeczywistości całkowicie bezpieczne jest ustawienie identyfikatora użytkownika klienta na dowolne! Możesz sięgnąć do systemu kont i zadzwonić pod numer Meteor.default_connection.setUserId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");. Spróbuj, a zobaczysz, że przycisk logowania w prawym górnym rogu zamienia się w animację. Dzieje się tak, ponieważ klient wywołuje Meteor.user(), aby wyświetlić adres e-mail zalogowanego użytkownika, który właśnie ustawiłeś. Ale ponieważ nie zalogowałeś się na serwerze jako ten użytkownik, nie publikuje on żadnych informacji o tym użytkowniku i po prostu dostajesz spiny.

To bardzo silny model bezpieczeństwa. Nie musisz się martwić o żaden kod klienta, mimo że w większości aplikacji znajduje się większość kodu! Tak długo, jak piszesz metody bezpiecznego serwera, publikujesz funkcje i akceptujesz/odmawiasz zasady, jesteś całkowicie zablokowany, bez względu na to, co klient próbuje zrobić.

2

Właśnie przetestowałem Meteor za pomocą dwóch przeglądarek i skopiowałem lokalny magazyn Meteor.userId i Meteor.loginToken między każdą przeglądarką i oboje zalogowali mnie jako tę samą osobę. Kiedy wylogowałem się z jednego, wciąż byłem w stanie publikować w innym.

Nie sądzę, że jest to tak bezpieczne, jak się wydaje.

Jeśli mogę skopiować te wartości i nadal być postrzeganym jako ten sam użytkownik, nawet jeśli używam innej przeglądarki, to w ogóle nie jest to bezpieczne.


Aktualizacja

Po namyśle ...

Przypuszczam, że byłoby to możliwe do logowania IP address użytkownika, kiedy zalogować. Jeśli użytkownik spróbuje uzyskać dostęp, a adres IP nie jest taki sam, możesz poprosić go o ponowne zalogowanie.

+1

"LoginToken" oznacza "klucze do królestwa" dla odpowiedniego konta (przez cały okres istnienia tokena, domyślnie 90 dni). Zatem zabezpieczenie tokena jest kluczowe, ponieważ jeśli wycieknie, każdy może uwierzytelnić połączenie DDP z tym serwerem/kontem (patrz pakiet npm [ddp-login] (https://www.npmjs.org/package/ddp-login) , na przykład). – vsivsi

+0

W zasadzie mówisz, że jeśli ktoś ma fizyczny dostęp do twojego komputera, aby skopiować swój login i token, że * wszystkie zakłady są wyłączone *. Co możemy w tej sprawie zrobić? Jest to równie niebezpieczne, jak ktoś, kto kopiuje klucze ssh, jeśli ma komputer, a mimo to SSH jest naprawdę bezpieczny ... Więc zaszyfruj komputer. :) – trusktr

Powiązane problemy