Jakie są wskazówki dotyczące utrzymywania odpowiedzialnego bezpieczeństwa sesji w PHP? W całej sieci są informacje i najwyższy czas, aby wylądowały w jednym miejscu!
Jakie są wskazówki dotyczące utrzymywania odpowiedzialnego bezpieczeństwa sesji w PHP? W całej sieci są informacje i najwyższy czas, aby wylądowały w jednym miejscu!
Odpowiedzi:
Aby zapewnić bezpieczeństwo sesji, należy wykonać kilka czynności:
$_SERVER['HTTP_USER_AGENT']
. To dodaje niewielką barierę do przechwytywania sesji. Możesz również sprawdzić adres IP. Ale powoduje to problemy dla użytkowników, którzy mają zmieniający się adres IP z powodu równoważenia obciążenia na wielu połączeniach internetowych itp. (Co ma miejsce w naszym środowisku tutaj).Jedną ze wskazówek jest wywołanie session_regenerate_id za każdym razem, gdy zmienia się poziom bezpieczeństwa sesji. Pomaga to zapobiegać przejmowaniu sesji.
Moje dwa (lub więcej) centów:
Jest mała, ale dobra książka na ten temat: Essential PHP Security autorstwa Chrisa Shifletta .
Niezbędne zabezpieczenia PHP http://shiflett.org/images/essential-php-security-small.png
Na stronie głównej książki znajdziesz kilka interesujących przykładów kodu i przykładowe rozdziały.
Możesz użyć wspomnianej powyżej techniki (IP & UserAgent), opisanej tutaj: Jak uniknąć kradzieży tożsamości
Myślę, że jednym z głównych problemów (którym zajmuje się PHP 6) jest register_globals. Teraz jeden ze standardowych metod stosowanych w celu uniknięcia register_globals
jest użycie $_REQUEST
, $_GET
lub $_POST
tablic.
"Prawidłowym" sposobem na zrobienie tego (od 5.2, chociaż jest tam trochę wadliwy, ale stabilny od 6, co wkrótce się pojawi) są filtry .
Więc zamiast:
$username = $_POST["username"];
ty byś zrobił:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
lub po prostu:
$username = filter_input(INPUT_POST, 'username');
Ten dokument utrwalający sesję zawiera bardzo dobre wskazówki, gdzie może nastąpić atak. Zobacz także stronę dotyczącą naprawy sesji w Wikipedii .
Korzystanie z 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żywaniem 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 tej sesji. Było to bardzo pomocne w przypadku phpBB przed 3.0 (od tego czasu naprawili to), ale myślę, że nadal jest to dobry pomysł.
Jest to dość trywialne i oczywiste, ale pamiętaj o 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ć licznik czasu, aby to zrobić.
Oto dobry samouczek dotyczący setTimer () i clearTimer ().
Główny problem z sesjami PHP i bezpieczeństwem (poza przechwytywaniem sesji) dotyczy środowiska, w którym się znajdujesz. Domyślnie PHP przechowuje dane sesji w pliku w katalogu tymczasowym systemu operacyjnego. Bez specjalnego przemyślenia i planowania jest to katalog, który można odczytać na całym świecie, więc wszystkie informacje o sesji są jawne dla każdego, kto ma dostęp do serwera.
Jeśli chodzi o utrzymywanie sesji na wielu serwerach. W tym momencie byłoby lepiej przełączyć PHP na sesje obsługiwane przez użytkownika, w których wywołuje on dostarczone funkcje do CRUD (tworzenie, odczytywanie, aktualizowanie, usuwanie) danych 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 serwerze współdzielonym, ponieważ umożliwia przechowywanie ich w bazie danych, nad którą często masz większą kontrolę niż system plików.
Skonfigurowałem 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 znajdującym się w pozostałej części witryny:
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {
session_destroy();
header('Location: http://website login page/');
exit();
}
session.cookie_httponly = 1
change session name from default PHPSESSID
X-XSS-Protection 1
X-XSS-Protection
to wcale nie jest przydatne. W rzeczywistości sam algorytm zabezpieczający mógłby zostać wykorzystany, czyniąc go gorszym niż wcześniej.
Sprawdziłbym zarówno adres IP, jak i agenta użytkownika, 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?
}
Jeśli używasz session_set_save_handler () , możesz ustawić własną obsługę sesji. Na przykład możesz przechowywać swoje sesje w bazie danych. Przykłady obsługi sesji bazy danych można znaleźć w komentarzach php.net.
Sesje DB są również dobre, jeśli masz wiele serwerów, w przeciwnym razie, jeśli używasz sesji opartych na plikach, musisz się upewnić, że każdy serwer WWW ma dostęp do tego samego systemu plików, aby odczytywać / zapisywać sesje.
Musisz mieć pewność, że dane sesji są bezpieczne. Patrząc na swój php.ini lub używając phpinfo (), możesz znaleźć ustawienia sesji. _session.save_path_ informuje, gdzie są zapisywane.
Sprawdź uprawnienia folderu i jego elementów nadrzędnych. Nie powinien być publiczny (/ tmp) ani być dostępny dla innych witryn internetowych na Twoim współdzielonym serwerze.
Zakładając, że nadal chcesz używać sesji php, możesz ustawić php, aby używał innego folderu, zmieniając _session.save_path_ lub zapisując dane w bazie danych, zmieniając _session.save_handler_.
Możesz ustawić _session.save_path_ w swoim php.ini (niektórzy dostawcy na to pozwalają) lub dla apache + mod_php, w pliku .htaccess w folderze głównym twojej witryny:
php_value session.save_path "/home/example.com/html/session"
. Możesz również ustawić go w czasie wykonywania za pomocą _session_save_path () _.
Sprawdź samouczek Chrisa Shifletta lub Zend_Session_SaveHandler_DbTable, aby ustawić i alternatywną procedurę obsługi sesji.