Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ocena, opinia] Zabezpieczenia sesji MySQL
Forum PHP.pl > Inne > Oceny
Johnas
Witam, stworzyłem baze danych o nazwie "Session", w której dodałem kolumny:
id - liczba porządkowa auto increment,
name - nazwa sesji
times - ostatni czas wykonywania działań
filename - plik w którym się znajdujemy (index.php, config.php)
user - id użytkownika (0 - gość, powyższe liczby to identyfikatory konta)
ip - ip na którym została utworzona sesja.

I napisałem kod PHP:
  1. $session_id = session_id();
  2. $timeSession = $config["TimeSession"];
  3. $session_ip = get_ip(false);
  4. $sess['user'] = 0; // sesja gościa
  5. mysql_query("DELETE FROM Sesssion WHERE times<'$timeSession'");
  6. if (isset($session_id))
  7. {
  8. $file = FileName;
  9. $sQuery = mysql_query("SELECT times, filename, user FROM Session WHERE name = '$session_id' and ip = '$session_ip'");
  10. $sWhile = mysql_num_rows($sQuery);
  11. if ($sWhile == 0)
  12. {
  13. mysql_query("INSERT INTO Session (name, times, filename, user, ip) VALUES ('$session_id', '$timeSession', '$file', '0', '$session_ip')");
  14. } else {
  15. $session = mysql_fetch_assoc($sQuery);
  16. if ($session['times']<$config['TimeSession'])
  17. {
  18. $timeSession = $config["TimeSession"];
  19. mysql_query("UPDATE Session SET times='$timeSession', filename='$file' WHERE name = '$session_id' and ip = '$session_ip'");
  20. $sess = mysql_fetch_assoc(mysql_query("SELECT times, filename, user FROM Session WHERE name = '$session_id' and ip = '$session_ip'"));
  21. } else {
  22. mysql_query("INSERT INTO Session (name, times, filename, user, ip) VALUE ('$session_id', '$timeSession', '$file', '0', '$session_ip')");
  23. }
  24. }
  25. }


TimeSession:
  1. // Czas Sesji
  2. $config["TimeSession"] = TIME_NOW+$config['TimeSession'];

Działanie kodu wygląda następująco. Na początku skrypt usuwa stare sesje gdzie czas przekroczył dozwolony limit trwania sesji (czas ustawiony przez administratora). Następnie skrypt pobiera nazwę sesji oraz ip od użytkownika, po czym sprawdza czy istnieje sesja w bazie danych z pobranymi parametrami (ip oraz nazwa sesji). Jeżeli nie istnieje taka sesja to tworzy taką sesje w bazie danych, jeżeli jednak istnieje to przydziela identyfikator który został wpisany do bazy. Początkowo user nie jest zalogowany przez co $sess['user'] wynosi 0, dlatego podczas poprawnego logowania następuje update tabeli "user" na identyfikator konta z pasującym loginem i hasłem wpisanym przez użytkownika.
I tutaj pytanie mam do doświadczonych użytkowników: czy moje główkowanie w celu zabezpieczenia się przed Session Hijacking da jakiś odpowiedni skutek, czy napisałem niepotrzebne pobieranie sesji z bazy danych?
Damonsson
I przy każdej akcji użytkownika robisz SELECT do bazy danych? Prościej i wydajniej przecież zapisywać takie info w cookies np i porównywać, jedno zapytanie do bazy mniej. Ale jeśli szukasz hiper super bezpiecznego zabezpieczenia przed przejęciem sesji lub i tak pobierasz info, gdzie użytkownik się ostatnio znajdował, jaki czas temu itd., to jest ok. Pamiętaj, że IP zawsze można sobie ustawić na jaki się chce, więc porównywanie tylko IP to za mało.
Johnas
Kod ten pisany jest pod panel administratora więc wielkiego ruchu tam nie będzie, a zabezpieczenia jak najbardziej wskazane smile.gif Dzięki za odpowiedź, bo chciałem wiedzieć czy wizja która pojawiła się w mojej głowie działa czy jest tylko zbędnym kodem smile.gif

@Edit
Co do możliwości zmiany ip, to wiedziałem że można je zmieniać, ale że można zmieniać ip na takie które przypadnie nam do gustu to o tym nie wiedziałem. A jak sprawa wygląda ze sprawdzaniem wersji przeglądarki i systemu operacyjnego? Pewnie też da się to w jakiś sposób obejść?
!*!
Cytat(Jonek_1993 @ 23.11.2013, 12:21:22 ) *
@Edit
Co do możliwości zmiany ip, to wiedziałem że można je zmieniać, ale że można zmieniać ip na takie które przypadnie nam do gustu to o tym nie wiedziałem. A jak sprawa wygląda ze sprawdzaniem wersji przeglądarki i systemu operacyjnego? Pewnie też da się to w jakiś sposób obejść?


Wszytko co odbierasz od użytkownika może być spreparowane. Nie ma pewnych danych, tak samo jak nie ma dobrych zabezpieczeń.
Johnas
Ale zawszę można w pewny sposób utrudnić zdobywanie danych osobom niepożądanym smile.gif
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.