Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wylogowanie Uzytkownik ze wzgledu na ilosc sesji
Forum PHP.pl > Forum > PHP
mikowski
Witam,
troche sie zblokowalem. Mam nastepujacy przypadek uzycia :
- user loguje sie na strone z kompa 1 (ustawiamy sesje i cookie etc.)
- ten sam user dokonuje proby zalogowania na strone tyle ze z kompa 2

Jak wykryc taki przypadek i wygasic sesje (wylogowac) tego usera z strony otwartej na kompie 1 i pozostawic sesje na kompie 2 ?

Pozdrawiam
wookieb
Session handler który zapisuje sesje do bazy. Dodajesz do niego dodatkowe pole "login" W ktory,m trzymasz id badz login zalogowanego na ta sesje uzytkownika. Przy probie zalogowania z innego kompa usuwasz pierwsza sesje z tym samym loginem i voila.
pyro
Albo prościej -> stworzyć dodatkową kolumnę `logged_ip` i przy logowaniu zapisawać do niej IP użytkownika -> $_SERVER['REMOTE_ADDR'];

i teraz w skrypcie:

  1. <?php
  2. // zakładajac, że $logged_ip to kolumna pobrana z bazy z ostatnim IP zalogowanego usera
  3. if($logged_ip != $_SERVER['REMOTE_ADDR'])
  4. {
  5. // wylogowanie
  6. }
  7. ?>
wookieb
Przecież drugi komputer może mieć inne ip.
pyro
@wookieb, nie wiem czy my się dobrze zrozumieliśmy, ale mój przykład właśnie ilutruje taki przypadek smile.gif
wookieb
Racja przepraszam sad.gif Ale teraz to stwarza problem jeżeli 2 kompy są w jednej sieci biggrin.gif i reprezentowane są przez to samo ip smile.gif
pyro
Myślę, że podświadomie autorowi tematu chodziło o sytuację, gdzie są dwie oddzielne sieci, ale tego nie wiem. Ma dwa rozwiązania, które w zupełności wystarczy, niech sobie wybierze winksmiley.jpg

// ADD

Jeszcze jedna możliwość: dodatkowa kolumna z PHPSESSID i porównywanie go analogicznie jak z moim ostatnim przykładem
batman
Cytat(wookieb @ 26.05.2009, 09:50:19 ) *
Racja przepraszam sad.gif Ale teraz to stwarza problem jeżeli 2 kompy są w jednej sieci biggrin.gif i reprezentowane są przez to samo ip smile.gif

Da się wyciągnąć ip komputera, a nie sieci. Ja się nie spotkałem z sytuacją, w której dwie różne osoby miały ten sam IP na dwóch różnych komputerach w tym samym czasie.
Poszukaj w necie informacji o nagłówkach:
FORWARDED
FORWARDED_FOR
FORWARDED_FOR_IP
HTTP_FORWARDED
HTTP_FORWARDED_FOR
HTTP_FORWARDED_FOR_IP
X_FORWARDED
X_FORWARDED_FOR
HTTP_X_FORWARDED
HTTP_X_FORWARDED_FOR
CLIENT_IP
HTTP_CLIENT_IP
VIA
HTTP_VIA
HTTP_PROXY_CONNECTION

Któryś z nich będzie zawierał właściwe IP.
pyro
@batman, osobiście jestem za NAT'em. Mam 3 komputery i jak zamierzasz wyciągnąć IP mojego komputera z tej sieci winksmiley.jpg? Nie ma zbytnio możliwości... widoczne będzie tylko IP sieci.
batman
Jak już pisałem, nie spotkałem się z taką sytuacją, by nie można było wyciągnąć konkretnego IP. Nie mam teraz jak tego udowodnić, więc nie będę się upierał.
wookieb
Pamiętam o tych zmiennych ale chociażby takie X_FORWARDED_FOR nie jest dostępne domyślnie (o ile dobrze pamiętam) i o takie coś trzeba prosić administratora serwera. Poprawcie mnie jeżeli się mylę.

Nie jestem pewien, czy wyciągnie to adresy ip za NAT-em ale jeżeli tak to nadal sprawia to możliwość posiadania tych samych ip. Login jest o tyle unikalny, że nie zależy od komputera dlatego jest najbardziej uniwersalny.

//EDIT Tak jak myślałem, nie wszędzie to działa.
http://wookieb.pl/test_ip.php
  1. <?php
  2. $keys=array('FORWARDED',
  3. 'FORWARDED_FOR',
  4. 'FORWARDED_FOR_IP',
  5. 'HTTP_FORWARDED',
  6. 'HTTP_FORWARDED_FOR',
  7. 'HTTP_FORWARDED_FOR_IP',
  8. 'X_FORWARDED',
  9. 'X_FORWARDED_FOR',
  10. 'HTTP_X_FORWARDED',
  11. 'HTTP_X_FORWARDED_FOR',
  12. 'CLIENT_IP',
  13. 'HTTP_CLIENT_IP',
  14. 'VIA',
  15. 'HTTP_VIA',
  16. 'HTTP_PROXY_CONNECTION');
  17.  
  18.  
  19. foreach($keys as $key)
  20. {    
  21.    if(isset($_SERVER[$key]))
  22.    {
  23.        echo $key.': '.$_SERVER[$key].'<br/>';
  24.    }
  25.    else echo '$_SERVER[''.$key.''] = brak<br/>';
  26.    
  27.    if(isset($_ENV[$key]))
  28.    {
  29.        echo $key.': '.$_ENV[$key].'<br/>';
  30.    }
  31.    else echo '$_ENV[''.$key.''] = brak<br/>';
  32. }
  33. ?>


//EDIT Argument ZYX'a mówi wszystko
zegarek84
Zawsze można dorzucić jeszcze jeden warunek – USERAGENT przeglądarki internetowej – wtedy wyloguje nie tylko korzystając z innego komputera ale też z innej przeglądarki – oczywiście wszystkie te warunki połączyć - pomińmy sytuację że ktoś poustawia w przeglądarkach te same nagłówki ;p

pozatym przechowując paskey sesji to wcześniej zaniczyścić go np. czasem logowania (zapamiętać to także w bazie) - wtedy oba komputery na pewno będą miały różne paskey'e a jeden nieaktualny winksmiley.jpg
Zyx
Opieranie zabezpieczeń sesji na adresie IP innym niż REMOTE_ADDR to zagrożenie dla bezpieczeństwa (przypomnę, że parę dziur w phpBB polegało właśnie na użyciu X_FORWARDED_FOR i podobnych wynalazków). Dlaczego? REMOTE_ADDR to adres, z którego serwer otrzymał żądanie HTTP i na który będzie odsyłać odpowiedź. X_FORWARDED_FOR i podobne to zwykłe nagłówki HTTP, które nie muszą być ustawione lub może być w nich dosłownie cokolwiek, nawet coś bezsensownego. Zawartość takiego nagłówka można prosto zmanipulować i wykorzystać go do oszukania systemu zabezpieczeń na nim bazującego.
batman
Wszystkie nagłówki można zmodyfikować, więc ślepe poleganie na danych pochodzących od użytkownika jest co najmniej głupie.
Za każdym razem należy sprawdzić, czy mamy do czynienia z adresem IP.

~Zyx Twoje twierdzenie jest równie odkrywcze jak stwierdzenie, że niefiltrowane dane $_GET lub $_POST są niebezpieczne.
wookieb
Cytat(batman @ 26.05.2009, 10:33:26 ) *
~Zyx Twoje twierdzenie jest równie odkrywcze jak stwierdzenie, że niefiltrowane dane $_GET lub $_POST są niebezpieczne.


Uwierz znajdzie się stado osób, które są pewne tego że dane te (REMOTE_ADDR, X_FORWARDED_FOR) są zaufane. Dla ciebie takie stwierdzenie może nie jest odkrywcze ale dla innych jak najbardziej. Dlatego też taki komentarz jest zbędny.
batman
Jeśli ktoś nie zna podstaw bezpieczeństwa, to już nie mój problem. Przecież nie będę odpowiadał na pytanie i dodawał do tego wypracowania na 30 stron, zawierającego wszystkie aspekty poruszanej sprawy, od bezpieczeństwa zaczynając, na taktowaniu procesora kończąc.

Koniec OT.
freeon
Cytat(mikowski @ 26.05.2009, 09:28:15 ) *
Witam,
troche sie zblokowalem. Mam nastepujacy przypadek uzycia :
- user loguje sie na strone z kompa 1 (ustawiamy sesje i cookie etc.)
- ten sam user dokonuje proby zalogowania na strone tyle ze z kompa 2

Jak wykryc taki przypadek i wygasic sesje (wylogowac) tego usera z strony otwartej na kompie 1 i pozostawic sesje na kompie 2 ?

Pozdrawiam


Robisz to w ten sposób ze w momencie logowania generujesz sobie losowy ciag znakow i zapisujesz sobie w bazie danych w tabeli users i w sesji ta wratosc. Potem tylko zostaje sprawdzenie czy wartosc w sesji jest taka sama jak w bazie danych jesli nie niszczysz sesje
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.