• 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)

VPS Starter Arubacloud
0 głosów
357 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 (599,730 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 (599,730 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 (599,730 p.)
Żeby zabezpieczyć bazę.

Podobne pytania

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

92,452 zapytań

141,262 odpowiedzi

319,079 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...