2013-10-03 28 views
6

Próbowałem zbudować własną, bezpieczną klasę sesji PHP, kiedy naprawdę zastanawiałem się, co powstrzymuje kogoś przed emulowaniem sesji?Przejęcie sesji PHP i jej metody

IE, dlaczego nie jest kod na test.php

$_SESSION['logged_in'] = true; 

nie być w stanie pracować na index.php gdzie

if($_SESSION['logged_in'] == True){ 
echo 'logged in'; 
} 

Rozumiem, że sposób o to, aby zabezpieczyć sesja poprzez wygenerowanie bezpiecznego identyfikatora przez zablokowanie go do adresu IP i klienta użytkownika, ale jak dokładnie to działa?

Czy byłbym w stanie odgadnąć identyfikator sesji, który byłby w stanie ustawić $ _SESSION ['logged_in'] = true i emulować login? Czy powinienem zmienić zmienną SESJA, aby sprawdzić, czy logowanie jest bezpieczniejsze?

Przepraszam za moje pytania i nadzieję, że jakiś sens ...

+0

Czy masz "session_start();" na każdej stronie? –

+1

Powinieneś wziąć lekcje WebGoat od OWASP, pomogą ci lepiej zrozumieć rzeczy, co jest wymagane do stworzenia bezpiecznych rzeczy.https: //www.owasp.org/index.php/Kategoria: OWASP_WebGoat_Project – pduersteler

+1

Więcej lekcji [tutaj - Damn Vulnerable Web App (http://www.dvwa.co.uk/) –

Odpowiedz

7

Przede wszystkim dane sesji są przechowywane tylko na serwerze, więc klient zewnętrzny nie może po prostu utworzyć własnych danych sesji i wysłać go na serwer.

Sprowadza się to do rzeczywistego zgadywania identyfikatora sesji kogoś innego i zakładania własnej tożsamości; jest to dość trudne, ale nie niemożliwe. W sytuacji, w której atakujący może wykorzystać ruch sieciowy między ofiarą a serwerem, nie można ich zatrzymać.

Istnieje kilka rzeczy, które można przyjąć, aby rzeczy bezpieczniej, choć:

  1. Użyj SSL; patrz także session.cookie_secure.
  2. Generowanie identyfikatorów z dobrego losowego źródła, tj. /dev/urandom na komputerach z systemem Linux; patrz także session.entropy_file.
  3. Ponownie generuje identyfikator, gdy użytkownik się loguje lub wylogowuje; zobacz także session_regenerate_id()
  4. Użyj HttpOnly cookies (i tylko ciasteczek), aby utrwalić identyfikator sesji; patrz także session.use_only_cookies i session.cookie_httponly.
  5. Sesje ścisłe; patrz także session.use_strict_mode.
  6. Zachowaj obliczoną wartość skrótu agenta użytkownika w sesji i upewnij się, że się nie zmienia, np.:

    $_SESSION['_agent'] = sha1($_SERVER['HTTP_USER_AGENT']); 
    
  7. Spróbuj zmniejszyć żywotność sesji jak najkrótszy i użyć zaawansowanych "remember me" feature zregenerować sesje jak ich wygaśnięcia.

Ważne jest również, aby wiedzieć, kiedy miało miejsce porwanie i podjąć odpowiednie działania, gdy tak się stanie. Będziesz musiał śledzić, które sesje należą do którego użytkownika, aby można unieważnić wszystkie z nich, gdy jeden z nich został naruszony.

Przy okazji zablokowanie sesji na adres IP jest trudne; niektórzy dostawcy usług internetowych sprawią wrażenie, że użytkownik pochodzi z różnych adresów lub wielu użytkowników pochodzi z tego samego adresu. Tak czy inaczej, lepiej będzie śledzić agenta użytkownika, ponieważ jest to mniej prawdopodobne, aby się zmienić.

+0

+1 Teraz to jest odpowiedź. – samayo

+0

Doskonała odpowiedź! Dzięki :) – user2587774

+0

@ user2587774 Nie ma za co; jeśli pomógł ci odpowiedzieć na twoje pytanie, rozważ zaakceptowanie go jako swojej odpowiedzi :) –

3

odgadywanie identyfikator sesji nie jest sesja porwanie. To trudniejsze niż odgadnięcie hasła. Ale tak, jeśli ktoś uzyskał identyfikator sesji, uzyskałby pełny dostęp do danego konta.

Blokowanie za pomocą adresu identyfikatora oznacza po prostu przechowywanie oryginalnego adresu IP, którego używał użytkownik po zalogowaniu się w sesji, i sprawdzenie go na początku każdego żądania, aby sprawdzić, czy nie uległo zmianie. W ten sposób, nawet jeśli atakujący uzyska prawidłowy identyfikator sesji, nadal nie będzie mógł z niego skorzystać.

Istnieje dobra Wikipedia article on the topic, a także powiązane pytania dotyczące StackOverflow: 1, 2.

+0

Wiesz, że zmienne '$ _SERVER' mogą zostać sfałszowane. Dlatego nie można polegać na '$ _SERVER ['REMOTE_ADDR']' w celu uwierzytelnienia, a szczególnie w wieku, w którym [dynamiczny adres IP] (http://www.noip.com/blog/2012/05/24/what -is-a-dynamic-ip-address /) jest szeroko stosowany. Oznacza to, że użytkownik może zostać wylogowany, ponieważ serwer zmienia adres IP dynamicznie. – samayo

+0

'$ _SERVER ['REMOTE_ADDR']' może być łatwo zmieniony przez klienta, ale nie można go łatwo ustawić na dowolną wartość równą wartości innego klienta. – Denis

+0

@Simon_eQ Więc jak by się podniecić '$ _SERVER ['REMOTE_ADDR']'? – Gumbo