Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Websockety i bezpieczne przekazywanie danych sesji
Forum PHP.pl > Forum > PHP
denis94
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ę.
by_ikar
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.
Comandeer
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
denis94
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.
by_ikar
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).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.