Bezpieczeństwo sesji PHP

Jakie są wytyczne dla utrzymania odpowiedzialnego bezpieczeństwa sesji w PHP? Informacje są w całej sieci i najwyższy czas, aby wszystko wylądowało w jednym miejscu!

 125
Author: mattytommo, 0000-00-00

12 answers

Istnieje kilka rzeczy do zrobienia, aby zapewnić bezpieczeństwo Sesji:

  1. Użyj SSL podczas uwierzytelniania użytkowników lub wykonywania wrażliwych operacji.
  2. regeneruje identyfikator sesji za każdym razem, gdy zmieni się poziom bezpieczeństwa (np. logowanie). Możesz nawet zregenerować identyfikator sesji każdego żądania, jeśli chcesz.
  3. mieć czas sesji
  4. nie używaj register globals
  5. przechowuj szczegóły uwierzytelniania na serwerze. Czyli nie wysyłaj danych takich jak nazwa użytkownika w ciasteczko.
  6. Sprawdź $_SERVER['HTTP_USER_AGENT']. Dodaje to małą barierę do przechwytywania sesji. Możesz również sprawdzić adres IP. Ale to powoduje problemy dla użytkowników, którzy mają zmieniający się adres IP ze względu na równoważenie obciążenia na wielu połączeniach internetowych itp (co ma miejsce w naszym środowisku tutaj).
  7. Zablokuj dostęp do sesji w systemie plików lub użyj niestandardowej obsługi sesji
  8. dla wrażliwych operacji należy rozważyć wymaganie od zalogowanych użytkowników podania swoich danych again
 88
Author: grom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-06 17:37:35

Jedną z wytycznych jest wywoływanie session_regenerate_id za każdym razem, gdy zmienia się poziom bezpieczeństwa sesji. Pomaga to zapobiec przechwytywaniu sesji.

 15
Author: saint_groceon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-02 02:43:42

Moje dwa (lub więcej) grosze:

  • nie ufaj nikomu
  • Filter input, escape output (cookie, dane sesji są również Twoim wejściem)
  • unikaj XSS (zachowaj dobrze uformowany HTML, spójrz na PHPTAL lub HTMLPurifier)
  • obrona w głębi
  • nie ujawniaj danych

Istnieje mała, ale dobra książka na ten temat: Essential PHP Security autorstwa Chrisa Shifletta .

Podstawowe zabezpieczenia PHP http://shiflett.org/images/essential-php-security-small.png

Na stronie głównej Książki znajdziesz kilka ciekawych przykładów kodu oraz przykładowe rozdziały.

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

 11
Author: takeshin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-06 16:25:03

Myślę, że jednym z głównych problemów (który jest rozwiązywany w PHP 6) jest register_globals. Obecnie jedną ze standardowych metod stosowanych w celu uniknięcia register_globals jest użycie $_REQUEST, $_GET lub $_POST tablice.

"poprawny" sposób na to (od 5.2, chociaż jest tam trochę buggy, ale stabilny od 6, który wkrótce się pojawi) jest za pomocą filtrów .

Więc zamiast:

$username = $_POST["username"];

Zrobiłbyś:

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

Lub nawet po prostu:

$username = filter_input(INPUT_POST, 'username');
 11
Author: cmcculloh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-04 09:41:40

Ten papier utrwalający sesję ma bardzo dobre wskazówki, gdzie może nadejść atak. Zobacz też strona utrwalania sesji w Wikipedii .

 9
Author: raspi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-05 22:33:27

Używanie adresu IP nie jest najlepszym pomysłem z mojego doświadczenia. Na przykład; moje biuro ma dwa adresy IP, które są używane w zależności od obciążenia i stale napotykamy problemy z użyciem adresów IP.

Zamiast tego zdecydowałem się na przechowywanie sesji w oddzielnej bazie danych dla domen na moich serwerach. W ten sposób nikt w systemie plików nie ma dostępu do informacji o sesji. To było naprawdę pomocne w phpBB przed 3.0 (oni od tego czasu naprawili to), ale to nadal dobry pomysł, myślę.

 5
Author: Eric Lamb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-06 20:44:55

Jest to dość trywialne i oczywiste, ale pamiętaj, aby session_destroy po każdym użyciu. Może to być trudne do zaimplementowania, jeśli użytkownik nie wyloguje się jawnie, więc można ustawić timer, aby to zrobić.

Oto dobry tutorial na setTimer() i clearTimer ().

 3
Author: helloandre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-02 03:24:12

Główny problem z sesjami PHP i zabezpieczeniami (oprócz przechwytywania sesji) wiąże się z tym, w jakim środowisku się znajdujesz. Domyślnie PHP przechowuje dane sesji w pliku w katalogu tymczasowym systemu operacyjnego. Bez specjalnej myśli lub planowania jest to katalog czytelny dla świata, więc wszystkie informacje o sesji są publiczne dla każdego, kto ma dostęp do serwera.

Co do utrzymywania sesji na wielu serwerach. W tym momencie lepiej byłoby przełączyć PHP na sesje obsługiwane przez użytkownika, Gdzie wywołuje dostarczone funkcje do CRUD (tworzenie, odczyt, aktualizacja, usuwanie) dane sesji. W tym momencie możesz przechowywać informacje o sesji w bazie danych lub rozwiązaniu podobnym do memcache, aby wszystkie serwery aplikacji miały dostęp do danych.

Przechowywanie własnych sesji może być również korzystne, jeśli jesteś na współdzielonym serwerze, ponieważ pozwoli Ci to przechowywać je w bazie danych, nad którą często masz większą kontrolę niż system plików.

 3
Author: John Downey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-03 13:14:48

Ustawiam swoje sesje w ten sposób-

Na stronie logowania:

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

(fraza zdefiniowana na stronie konfiguracyjnej)

Następnie w nagłówku, który znajduje się w pozostałej części strony:

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}
 3
Author: Chad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 22:00:12

Php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

Eq Apache dodaj nagłówek:

X-XSS-Protection    1
 3
Author: user956584,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-13 02:40:01

Sprawdziłbym zarówno IP, jak i User Agent, aby zobaczyć, czy się zmieniają

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
 2
Author: Teifion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-04 21:38:05
 
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54