[php] rozpoznanie użytkownika w skrypcie

0

jak skrypt może rozpoznać osobę zalogowaną? przykładowo na forum
w ciasteczkach jest zaszyfrowane w md5 haslo i login? i podczas przeglądania forum ciągle je wysyła żeby sie zindyfikować? chcę po prostu zrozumieć ten mechanizm rospoznawania użytkownika

0

po zalogowaniu sprawdza dane i tworzy sesję z wszystkimi danymi widocznymi tylko po stronie serwera
w ciasteczku jest tylko identyfikator sesji

0

dzięki Mógłby ktos mi ktoś dać link do ort! artykułu na temat tworzenia takich ciasteczek? :d

0

Przykladowy mechanizm dziala tak (po stronie serwera):

if (ZazadanoWylogowania)
{
  if (IstniejeSesja)
  {
    UsunSesje();
  }
  if (IstniejaTajneDaneWCookie)
  {
    UsunCookie();
  }
}

//Dane logowania wyslane bezposrednio
//Najbezpieczniejsze, bo wyslane przed chwila
if (WyslanoDaneLogowania)
{
  if (DaneLogowaniaPasuja)
  {
    if (UzytkownikChceByGoZapamietac)
    {
      UstawTajneDaneWCookie();
    }
    JestZalogowany();
  }
}
//Dane trzymane w obecnej sesji
//Bezpieczne, bo no niedawnym zalogowaniu
else if (IstniejeSesja)
{
  if (DaneSesjiPasuja)
  {
    JestZalogowany();
  }
  else
  {
    UsunDaneSesji();
  }
}
//Dane trzymane w ciasteczkach
//Malo bezpieczne, ale wygodne
else if (IstniejaTajneDaneWCookie)
{
  if (DaneCookiePasuja)
  {
    JestZalogowany();
  }
  else
  {
    UsunTajneDaneZCookie();
  }
}

if (CzyJestZalogowany)
{
  if (!IstniejeSesja)
  {
    UstawSesje();
  }
  Napisz('Zalogowany!');
}
else
{
  Napisz('Zaloguj sie!');
}

Odpowiadajac na pierwsze pytanie: co jest trzymane w cookie? Wybor danych nie jest taki prosty - jak trzymasz tam login otwartym tekstem, ktos niepowolany moze go poznac i wykrasc. Moze tez skopiowac sobie plik cookie nawet bez jego interpretowania. Niektorzy trzymaja tam na przyklad md5(browser_agent_name, password, login) oraz id uzytkownika. Wybor bezpiecznego rozwiazania zalezy od doswiadczenia programisty.

0

Mechanizm sesji w PHP umożliwia zmianę ID sesji, więc można przy logowaniu robić coś takiego:

$realm = 'Logowanie do mojego forum'; //Realm - po prostu opis do czego służy sesja. Można pominąć.
$login = $_POST['login']; //Login w formularzu
$passwd = $_POST['passwd']; //Hasło w formularzu
$agent = $_SERVER['HTTP_USER_AGENT']; //Przeglądarka clienta
$ip = $_SERVER['REMOTE_ADDR']; //Pobieramy IP klienta
$host = gethostbyaddr($_SERVER['REMOTE_ADDR']); //Pobieramy host na podstawie IP
$sep = '|'; //Znak oddzielający te dane. Może być puste - i tak wszystko idzie na przemiał dla MD5
session_id(MD5($agent.$sep.$host.$sep.$ip.$sep.$passwd.$sep.$login.$sep.$realm)); //Przestawienie czegokolwiek w mieszance powoduje zmianę wartości sesji
session_name(MD5($realm)); //W przypadku kiedy na serwerze są też inne skrypty, które używają sesji PHP.
session_start(); //Zaczynamy zabawę
//Dalej obsługa $_SESSION...

Oczywiście można pójść na łatwiznę i nie ustawiać session_name i session_id. Wtedy skrypt wygeneruje je automatycznie (nie polecam).

0

Dzięki bardzo mi pomogliście, ale mam trochę niekonwencjonalny problem. Otóż robię aplikacje sieciową wykorzystując plugin, który może być zaimplementowany na stronie jak flash z małymi ograniczeniami. Plugin w ogóle nie korzysta z sesji do komunikacji może wykorzystać javascript? pobierając wartości ze zmiennych i uruchamiać funkcje plugin potrafi też pobierać zawartości stron php bez wczytywania ich bezpośrednio w przeglądarce i tu zaczynają się schody jak pobieram zawartość z poszczególnych plików z serwisu nie mogę sprawdzić sesji

Chodzi mi o bezpieczeństwo takich sesji, więc mam pytanie. Czy mogę zawartość sesji wygenerować zaraz po uruchomieniu strony i umieścić w zmiennych Java script? Tak żeby plugin, czyli moja aplikacja mogła ją pobrać a później jak będę chciał pobrać zawartość poszczególnych stron serwisu to w zmiennych będę ten indyfikator przedstawiał przykładowo tak

GET "http://10.10.20.1/~sesja/start.php?id=12&hash=md5"

Czy dobrze kombinuję? Czy raczej nie będzie to zbyt bezpieczne?

0

Można. Tylko że jak...? Ten plugin flasha nie działa chyba na jakiś specjalnych uprawnieniach, więc powinien normalnie poddawać się identyfikacji. Ew. można na pierwszym ogniu podać mu w FlashVars wartość funkcji session_id (używamy tego po session_start(), który powinien być na początku), wtedy nie musiałby obsługiwać ciastek, ponieważ numer sesji zapisany byłby każdorazowo w zmiennej $_GET['PHPSESSID']. Linki musiałyby wyglądać tak: http://10.10.20.1/blabla/strona.php?PHPSESSID=session_id(). Tak btw. to czy ten plugin flasha nie jest zwykłą implementacją AJAX? Bo coś mi tu nie halo.

// flash wysyła ciastka przeglądarki, więc sesja na ciastkach obowiązuje - Ł

0

A jak to jest z wykradzeniem takiej sesji i podanie się za jej właściciela? Czy sesje są na pewno bezpieczne?

0

Sesja jest przypisana też do adresu IP delikwenta, więc posiadanie numeru SID to nie wszystko, a podszycie się pod konkretny numer jest prawie niemożliwe.

0
Demonical Monk napisał(a)

Sesja jest przypisana też do adresu IP delikwenta, więc posiadanie numeru SID to nie wszystko, a podszycie się pod konkretny numer jest prawie niemożliwe.

a jesli ktoś ma zmienne IP? to sesja traci też ważność? bo zauważyłem że niekoniecznie jesli zmieniam proxy

0

I tak 'gaśnie' przy każdym zamknięciu przeglądarki, bo cookie jest sesyjne. Chyba ze napiszesz jakiś własny system, który potrzyma to trochę dłużej i oprzesz go o same cookies.

1 użytkowników online, w tym zalogowanych: 0, gości: 1