• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapobieganie atakom Session Hijacking (Cookie Hijacking)

0 głosów
296 wizyt
pytanie zadane 18 września 2016 w PHP przez MatiiTv Gaduła (3,790 p.)

Witam. Stworzyłem kod gdzie po zalogowaniu przez OpenID dane o koncie z logowania są przekazywane do bazy danych i jest generowany hash szyfrowany za pomocą SHA512. Hash jest zapisywany w bazie danych i jako ciasteczko w przeglądarce. Działa to tak, że skrypt przeszukuje bazę danych szukając wpisu gdzie jest wpisany hash z przeglądarki i jeżeli znajdzie to przekazuje do przeglądarki w formie tablicy cały wpis. 

if (isset($_COOKIE['hash'])) {
	$sql = $db->query("SELECT * FROM `users` WHERE `hash` = " . $db->quote($_COOKIE['hash']));
	if ($sql->rowCount() != 0) {
		$row = $sql->fetch();
		$user = $row;
	}
}

Chciałbym sprawić, aby niemożliwe było zwykłe przechwycenie hasha, ustawienie go w swojej przeglądarce i uzyskanie dostępu do całego konta użytkownika. Nie chodzi mi tu o HTTPS czy SSL, bo równie dobrze można po prostu sprawdzić pliki cookie fizycznie.

Pozdrawiam.

1 odpowiedź

+4 głosów
odpowiedź 18 września 2016 przez Comandeer Guru (568,880 p.)

Przy każdym żądaniu generuj hasha na nowo. I postaraj się, żeby zawsze był całkowicie losowy (np. hashuj output z random_bytes).

 można po prostu sprawdzić pliki cookie fizycznie

Jak ktoś ma dostęp do komputera usera, to raczej już nic nie zrobisz…

Maksymalne zabezpieczenie cookies to:

  • ustawienie flagi httpOnly
  • ustawienie flagi secure
  • ustawienie flagi SameSite
  • SSL + HSTS
  • mocne Content Security Policy dla strony
  • zablokowanie wczytywania strony w ramkach (czyli albo CSP, albo dodatkowo X-Frame-Options)
  • obcięcie CORS
  • generowanie nowego hasha i cookie przy każdym żądaniu

 

komentarz 18 września 2016 przez MatiiTv Gaduła (3,790 p.)

zrobiłem to w ten sposób:

na początku pliku:

if($_SERVER['HTTP_CLIENT_IP'])
{
 $ip = $_SERVER['HTTP_CLIENT_IP'];
}
else if($_SERVER['HTTP_X_FORWARDED_FOR'])
{
 $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
 $ip = $_SERVER['REMOTE_ADDR'];
}

przy żądaniu:

if (isset($_COOKIE['hash'])) {
	$sql = $db->query("SELECT * FROM `users` WHERE `hash` = " . $db->quote($_COOKIE['hash']));
	if ($sql->rowCount() != 0) {
		$row = $sql->fetch();
		$user = $row;
		if($ip!=$user['ip']){
			unset($row);
			unset($user);
		}
	}
}

przy logowaniu:

$db->exec("INSERT INTO `users` (`hash`, `steamid`, `name`, `avatar`, `ip`) VALUES ('" . $hash . "', '" . $steamid . "', " . $db->quote($name) . ", '" . $avatar . "', '" . $ip . "')");

 

komentarz 18 września 2016 przez Comandeer Guru (568,880 p.)
Polecam przejść na prepared statements przy zapytaniach w bazie.
komentarz 18 września 2016 przez MatiiTv Gaduła (3,790 p.)
Dodałem flagę httpOnly i ustawiłem header("X-Frame-Options: DENY");

No, chyba jest bezpiecznie :)
komentarz 18 września 2016 przez MatiiTv Gaduła (3,790 p.)

"prepared statements"? 

a po co to?

1
komentarz 18 września 2016 przez Comandeer Guru (568,880 p.)
Żeby zabezpieczyć bazę.

Podobne pytania

0 głosów
3 odpowiedzi 394 wizyt
pytanie zadane 13 sierpnia 2016 w PHP przez patryk11441 Obywatel (1,150 p.)
0 głosów
2 odpowiedzi 669 wizyt
pytanie zadane 23 czerwca 2015 w PHP przez Kazuhiro Użytkownik (910 p.)
0 głosów
1 odpowiedź 134 wizyt
pytanie zadane 7 października 2018 w JavaScript przez rafal.budzis Szeryf (77,170 p.)

88,332 zapytań

136,928 odpowiedzi

305,599 komentarzy

58,601 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...