Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Websockety i bezpieczne przekazywanie danych sesji
denis94
post
Post #1





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 8.08.2010
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Witam.
Zaczynam zabawę z websocketami których będę musiał użyć w swoim projekcie. Aktualnie zacząłem naukę od prostego chatu w czasie rzeczywistym. Z samymi websocketami sobie poradziłem, zarówno klient jak i serwer działają prawidłowo, nawiązuje się połączenie a wiadomości na czacie wyświetlają się pozostałym użytkownikom błyskawicznie.
Mam jednak problem a w zasadzie brak pomysłu na to w jaki sposób mogę weryfikować użytkowników. Każdy użytkownik loguje się na stronie swoim loginem i hasłem i tworzona jest przez php zwykła sesja.
Mam więc kilka pytań.

W jaki sposób zrealizować po stronie serwera weryfikację czy wiadomość która dotarła od użytkownika XXX na pewno pochodzi od użytkownika zalogowanego?
W jaki sposób weryfikować jego sesję utworzoną przez zwykłe $_SESSION['login'] ?
W jaki sposób zablokować możliwość łączenia się z serwerem websocketów z domen innych niż moja i uniemożliwić podszywanie się pod zalogowanych użytkowników?

Nie pytałbym gdybym wcześniej nie szukał. Z góry dziekuję.
Go to the top of the page
+Quote Post
by_ikar
post
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Cytat
W jaki sposób zrealizować po stronie serwera weryfikację czy wiadomość która dotarła od użytkownika XXX na pewno pochodzi od użytkownika zalogowanego?


via cookie - tak jak w obrębie całej aplikacji

Cytat
W jaki sposób weryfikować jego sesję utworzoną przez zwykłe $_SESSION['login'] ?


Trzymanie sesji użytkownika gdzieś, gdzie będą twoje webosokety miały dostęp - np redis, memcached, mongo, mysal etc.

Cytat
W jaki sposób zablokować możliwość łączenia się z serwerem websocketów z domen innych niż moja i uniemożliwić podszywanie się pod zalogowanych użytkowników?


Przy połączeniu sprawdzać sesje, jeżeli nie będzie się zgadzać, to rozłączyć połączenie.
Go to the top of the page
+Quote Post
Comandeer
post
Post #3





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


Może to coś pomoże - nie jest to wprawdzie ogólnie o websocketach, a o konkretnym libie, ale IMO da się wyciągnąć z tego sporo: http://faye.jcoglan.com/security.html
Go to the top of the page
+Quote Post
denis94
post
Post #4





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 8.08.2010
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


by_ikar - czy dobrze Cię rozumiem?
Zamiast generować sesję w php za pomocą $_SESSION['login'] mam generować sobie podczas logowania np. jakiś klucz sesji składający się z losowego ciągu i przetrzymywać go w cookie oraz np. w bazie mysql razem z kontami użytkowników.
Następnie gdy użytkownik wejdzie na czat wysyłać websocketem do serwera klucz sesji, a następnie serwer powinien sprawdzić czy przesłany klucz sesji istnieje w bazie i na tej podstawie stwierdzać czy dany użytkownik jest zalogowany?
Czy takie wysyłanie klucza plaintextem do serwera nie jest zbytnio niebezpieczne?

Comandeer - dzięki, zapoznam się ale raczej na początku szukam sposobu na rozwiązanie problemu bez dodatkowych bibliotek i mało cudzych linijek kodu.
Go to the top of the page
+Quote Post
by_ikar
post
Post #5





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Sesja php jest tworzona po stronie serwera a użytkownikowi zostaje utworzone cookie, w którym znajduje się ID sesji. W przypadku domyślnych ustawień, ów ID sesji nie jest niczym innym jak nazwą pliku z zserializowaną tablicą. I chciałbyś uwierzytelnić użytkownika, gdyby sockety miały dostęp do tej sesji z php, którą też mógłbyś sobie deserializować, to wtedy wiedziałbyś czy dany użytkownik jest danym użytkownikiem. Po prostu musisz jakoś współdzielić tą sesje, bo do tego cookie z ID sesji serwer z websocketami będzie miał dostęp, o ile są w tym samym hoście. Jak nie, to musisz utworzyć takie cookie też dla tego hosta gdzie jest serwer websocketów. Jak współdzielić taką sesje ? Sposobów jest wiele. Handler sesji w php może być "nadpisany" poprzez sterowniki różnego rodzaju. Np sterownik redisa, czy memcached, zawsze możesz też napisać jakiś swój własny handler, albo próbować dobrać się do plików sesyjnych tworzonych domyślnie przez php.

Czy to jest bezpieczne? Jeżeli się obawiasz o bezpieczeństwo użyj httpsa, wtedy cała komunikacja będzie szyfrowana. Jeżeli nie chcesz używać httpsa, wciąż jest to w dość bezpieczne (na tym forum nie ma https, a ID sesji leci nie szyfrowane w ciasteczkach).
Go to the top of the page
+Quote Post
lucio1988
post
Post #6





Grupa: Zarejestrowani
Postów: 10
Pomógł: 3
Dołączył: 19.11.2013
Skąd: Białystok

Ostrzeżenie: (0%)
-----


poczytaj o JWT
https://stormpath.com/blog/token-auth-spa/
implementacja w php:
http://www.sitepoint.com/php-authorization...son-web-tokens/
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 09:09