Bezpieczeństwo sesji PHP

głosy
125

Jakie są wytyczne dla utrzymania właściwego zabezpieczenia sesji z PHP? Nie ma informacji o całej sieci, a to najwyższy czas to wszystko wylądował w jednym miejscu!

Utwórz 02/08/2008 o 03:41
źródło użytkownik
W innych językach...                            


13 odpowiedzi

głosy
88

Istnieje kilka rzeczy do zrobienia w celu utrzymania sesji bezpieczne:

  1. Użyj SSL podczas uwierzytelniania użytkowników lub wykonywania operacji wrażliwych.
  2. Regenerują identyfikator sesji, kiedy zmienia się poziom bezpieczeństwa (takie jak zalogowaniu). Można nawet zregenerować identyfikator sesji każde żądanie, jeśli chcesz.
  3. Sesje mają czas na zewnątrz
  4. Nie używaj zarejestrować globalnych
  5. dane uwierzytelniające przechowywać na serwerze. Oznacza to, że nie wysyłają takie informacje, jak nazwa użytkownika w pliku cookie.
  6. Sprawdzić $_SERVER['HTTP_USER_AGENT']. To dodaje niewielką przeszkodę dla przechwycenia sesji. Można także sprawdzić adres IP. Ale to powoduje problemy dla użytkowników, które zmienia adres IP z powodu równoważenia obciążenia na kilka połączeń internetowych itp (co ma miejsce w naszym środowisku tutaj).
  7. Zablokować dostęp do sesji w systemie plików lub użyć niestandardowej obsługi sesji
  8. Za operacje wrażliwe rozważyć wymagających zalogowanych użytkowników ponownie dostarczyć swoje dane authenication
Odpowiedział 11/08/2008 o 03:38
źródło użytkownik

głosy
15

Jedna wskazówka jest wywołanie session_regenerate_id za każdym razem zmienia się poziom bezpieczeństwa sesji użytkownika. Pomaga to uniknąć przechwycenia sesji.

Odpowiedział 02/08/2008 o 03:43
źródło użytkownik

głosy
11

Moje dwie (lub więcej) centy:

  • Nie wierzyć nikomu
  • Filtr wejście, wyjście ucieczki (ciasteczka, dane sesji są twoje wejście zbyt)
  • Unikać XSS (utrzymać HTML dobrze uformowane, przyjrzeć PHPTAL lub HTMLPurifier )
  • Obrona w głębi
  • Nie wystawiać dane

Jest mała, ale dobra książka na ten temat: Niezbędny PHP Bezpieczeństwa przez Chris Shiflett .

Niezbędny PHP Bezpieczeństwa http://shiflett.org/images/essential-php-security-small.png

Na stronie głównej tej książki znajdziecie interesujące przykłady kodu i przykładowe rozdziały.

Można użyć techniki wymienione powyżej (IP & UserAgent), opisany tutaj: Jak uniknąć kradzieży tożsamości

Odpowiedział 06/04/2010 o 17:05
źródło użytkownik

głosy
11

Myślę, że jednym z głównych problemów (co jest omówione w PHP 6) jest register_globals. Teraz jeden ze standardowych metod stosowanych w celu uniknięcia register_globalsjest użycie $_REQUEST, $_GETlub $_POSTtablic.

„Poprawny” sposób to zrobić (jak 5,2, chociaż jest tam trochę buggy, ale stabilny jak 6, który wkrótce) jest przez filtry .

Więc zamiast:

$username = $_POST["username"];

ty byś zrobił:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

lub nawet tylko:

$username = filter_input(INPUT_POST, 'username');
Odpowiedział 02/08/2008 o 03:55
źródło użytkownik

głosy
9

Ten papier utrwalenie sesja ma bardzo dobre wskaźniki, gdzie atak może przyjść. Zobacz także sesji stronę fiksacji w Wikipedii .

Odpowiedział 05/03/2009 o 23:33
źródło użytkownik

głosy
5

Korzystanie z adresu IP nie jest to najlepszy pomysł w moim doświadczeniu. Na przykład; moje biuro ma dwa adresy IP, które przyzwyczaić w zależności od obciążenia, a my ciągle napotkasz problemów przy użyciu adresów IP.

Zamiast, ja zdecydowaliśmy się na przechowywanie sesje w oddzielnej bazie danych dla domen na moich serwerach. W ten sposób nikt w systemie plików ma dostęp do tych informacji sesji. To był bardzo pomocny w phpBB przed 3.0 (ponieważ oni ustalone to), ale nadal jest to dobry pomysł, myślę.

Odpowiedział 06/08/2008 o 21:44
źródło użytkownik

głosy
3

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache dodać nagłówek:

X-XSS-Protection    1
Odpowiedział 13/10/2011 o 03:40
źródło użytkownik

głosy
3

Ustawić moje sesje się jak to-

na dziennik w stronę:

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);

(Oznaczenie określa się na stronie konfiguracji)

następnie w nagłówku, który jest w całej reszty strony:

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}
Odpowiedział 19/07/2011 o 22:40
źródło użytkownik

głosy
3

Głównym problemem z sesji i bezpieczeństwa (oprócz przechwycenia sesji PHP) pochodzi z tego, co jesteś w środowisku. Domyślnie sklepach PHP dane sesji w pliku w katalogu temp na os. Bez specjalnego myślenia i planowania jest to czytelny świat katalogu więc wszystkie informacje sesji jest publiczna każdemu z dostępem do serwera.

Jeśli chodzi o utrzymanie sesji na wielu serwerach. W tym momencie byłoby lepiej, aby przełączyć PHP obsługiwane przez użytkownika sesji, gdzie wywołuje swoje przewidziane funkcje CRUD (Create, Read, aktualizację, usuwanie) danych sesji. W tym momencie można przechowywać informacje o sesji w bazie danych lub memcache podobnego rozwiązania, tak aby wszystkie serwery aplikacji mają dostęp do danych.

Zapisywanie własnych sesje mogą być również korzystne, jeśli jesteś na wspólnym serwerze, ponieważ pozwala to zapisać je w bazie danych, które często czasy mają większą kontrolę nad ówczesnego systemu plików.

Odpowiedział 03/08/2008 o 14:14
źródło użytkownik

głosy
3

Jest to dość banalne i oczywiste, ale należy session_destroy po każdym użyciu. To może być trudne do wykonania, jeśli użytkownik nie zaloguje się jawnie, więc zegar można ustawić, aby to zrobić.

Oto dobry poradnik na SetTimer () i clearTimer ().

Odpowiedział 02/08/2008 o 04:16
źródło użytkownik

głosy
2

Musisz mieć pewność, że dane sesji są bezpieczne. Patrząc na php.ini lub za pomocą phpinfo () może się okazać, że ustawienia sesji. _session.save_path_ powie Ci, gdzie są one zapisywane.

Sprawdź uprawnienia do folderu i jego rodziców. To nie powinno być publiczne (/ tmp) lub być dostępne z innych stron na swojej wspólnym serwerze.

Zakładając, że nadal chcesz używać sesji php, php można skonfigurować do korzystania z innego folderu zmieniając _session.save_path_ lub zapisać dane w bazie danych poprzez zmianę _session.save_handler_.

Możesz być w stanie ustawić _session.save_path_ w php.ini (niektórzy dostawcy to pozwolić) lub apache + mod_php, w pliku .htaccess w katalogu głównym witryny: php_value session.save_path "/home/example.com/html/session". Można również ustawić go w czasie wykonywania z _session_save_path () _.

Sprawdzić samouczek Chris Shiflett za lub Zend_Session_SaveHandler_DbTable ustawić i alternatywnej obsługi sesji.

Odpowiedział 18/08/2008 o 18:12
źródło użytkownik

głosy
2

Jeśli używasz session_set_save_handler () można ustawić własny obsługi sesji. Na przykład można zapisywać sesje w bazie danych. Odnoszą się do komentarzy php.net dla przykładów obsługi sesji bazy danych.

Sesje DB są również dobre, jeśli masz wiele serwerów inaczej jeśli używasz sesji plików oparty trzeba by upewnić się, że każdy serwer WWW miał dostęp do tego samego systemu plików do odczytu / zapisu sesji.

Odpowiedział 09/08/2008 o 04:28
źródło użytkownik

głosy
2

Chciałbym sprawdzić zarówno IP i agenta użytkownika, aby sprawdzić, czy nie zmienić

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
Odpowiedział 04/08/2008 o 22:38
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more