Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Bezpieczna sesja
-ttdd-
post
Post #1





Goście







Przeglądając temat http://forum.php.pl/index.php?s=&showt...st&p=971557 natrafiłem na post !*!, a dokładniej chodzi mi o bezpieczeństwo sesji.

Mam na swojej stronie przy logowaniu do panelu administracyjnego coś takiego (po poprawnym wpisaniu danych):
  1. $_SESSION['admin_logged'] = true;

Do tej pory wydawało mi się to w miarę bezpieczne, ale po przejrzeniu w.w tematu zacząłem mieć wątpliwości.

Tak sprawdzam czy administrator jest zalogowany i jeśli tak wyświetlam odpowiednią stronę:
  1. if (!isset($_SESSION['admin_logged'])) {

Czy taki sposób jest bezpieczny?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
greycoffey
post
Post #2





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Złe podejście do tematu. Generalnie domyślna implementacja sesji w PHP jest dobra, ale dla celów edukacyjnych warto napisać własną - poczytaj o session_set_save_handler, jak stworzysz odpowiednie funkcje i zlaczysz je w tej funkcji, możesz korzysta z własnej implementacji jak z domyślnej (operacje na $_SESSION, funkcje session_start(), session_destroy() etc.).

Po pierwsze, opierasz się na istniejącej sesji, zamiast stworzyć własną, co wprowadza niezły bajzel.
Po drugie, hashujesz hash (w 99% przypadków session_id() zwraca ci md5() jakiegoś pseudolosowego ciągu).
Po trzecie, tworzysz sztywne pola. We własnej implementacji najlepsze według mnie będzie struktura (taki pseudosql bo nie chce ci mieszac pewnych instrukcji dostępnych tylko w PgSQL):
  1. Tabela sessions:
  2. sessionid | unikalny ciąg w bazie o stałej ilości znaków, najlepiej hash losowego numeru, ten hash wysyłasz użytkownikowi w COOKIE
  3. internalid | wewnętrzne id, klucz obcy do sessions_values(internalid), unikalny, AUTO_INCREMENT, TO wewnętrzne id którym posługujesz się w relacjach bazodanowych
  4. useragent | przechowujesz useragenta którego będziesz sprawdział w funkcji open() sesji
  5. ip | jak wyżej
  6. lastaction | timestamp ostatniego żądania, jeżeli większy od obecnego o X sekund (proponowałbym 1800), niszczy sesje (a co za tym idzie dane sesyjne w pobocznej tabeli)
  7.  
  8. Tabela session_values:
  9. internalid | już wyjaśnione
  10. KEY | klucz danej sesyjnej, unikalny dla danego internalid (możesz dać w bazie klucz na internalid oraz KEY RAZEM lub sprawdzać z poziomu PHP)
  11. value | wartość danej sesyjnej

Po czwarte, w miejscu ? chodziło pewnie o sprawdzenie czy funkcja zwraca 0 czy więcej rekordów. mysql_num_rows.
We wspomnianej na początku funkcji zobacz "Example #2".

EDIT: 2^8 post ;]

Ten post edytował greycoffey 26.06.2012, 12:57:36
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 21.08.2025 - 00:49