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
po zalogowaniu sprawdza dane i tworzy sesję z wszystkimi danymi widocznymi tylko po stronie serwera
w ciasteczku jest tylko identyfikator sesji
dzięki Mógłby ktos mi ktoś dać link do ort! artykułu na temat tworzenia takich ciasteczek? :d
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.
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).
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?
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 - Ł
A jak to jest z wykradzeniem takiej sesji i podanie się za jej właściciela? Czy sesje są na pewno bezpieczne?
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.
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
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.