Quali sono alcune linee guida per mantenere la sicurezza della sessione responsabile con PHP? Ci sono informazioni su tutto il Web ed è giunto il momento che tutto atterri in un unico posto!
Quali sono alcune linee guida per mantenere la sicurezza della sessione responsabile con PHP? Ci sono informazioni su tutto il Web ed è giunto il momento che tutto atterri in un unico posto!
Risposte:
Ci sono un paio di cose da fare per proteggere la sessione:
$_SERVER['HTTP_USER_AGENT']
. Ciò aggiunge una piccola barriera al dirottamento della sessione. Puoi anche controllare l'indirizzo IP. Ma ciò causa problemi agli utenti che hanno cambiato l'indirizzo IP a causa del bilanciamento del carico su più connessioni Internet ecc. (Che è il caso nel nostro ambiente qui).Una linea guida è chiamare session_regenerate_id ogni volta che cambia il livello di sicurezza di una sessione. Questo aiuta a prevenire il dirottamento della sessione.
I miei due (o più) centesimi:
C'è un piccolo ma buono libro su questo argomento: Essential PHP Security di Chris Shiflett .
Sicurezza PHP essenziale http://shiflett.org/images/essential-php-security-small.png
Nella home page del libro troverai alcuni esempi di codici interessanti e capitoli di esempio.
È possibile utilizzare la tecnica sopra menzionata (IP e UserAgent), descritta qui: Come evitare il furto di identità
Penso che uno dei maggiori problemi (che viene affrontato in PHP 6) sia register_globals. In questo momento uno dei metodi standard utilizzati per evitare register_globals
è quello di utilizzare i $_REQUEST
, $_GET
o $_POST
array.
Il modo "corretto" per farlo (a partire da 5.2, sebbene sia un po 'buggy lì, ma stabile a partire da 6, che arriverà presto) è attraverso i filtri .
Quindi invece di:
$username = $_POST["username"];
faresti:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
o anche solo:
$username = filter_input(INPUT_POST, 'username');
Questo documento sulla fissazione della sessione contiene ottimi suggerimenti su dove potrebbe verificarsi un attacco. Vedi anche la pagina di fissazione della sessione su Wikipedia .
L'uso dell'indirizzo IP non è davvero la migliore idea della mia esperienza. Per esempio; il mio ufficio ha due indirizzi IP che vengono utilizzati a seconda del carico e ci imbattiamo costantemente in problemi utilizzando gli indirizzi IP.
Invece, ho optato per l'archiviazione delle sessioni in un database separato per i domini sui miei server. In questo modo nessuno nel file system ha accesso alle informazioni di quella sessione. Questo è stato davvero utile con phpBB prima della 3.0 (da allora l'hanno risolto) ma penso sia comunque una buona idea.
Questo è piuttosto banale e ovvio, ma assicurati di session_destroy dopo ogni uso. Questo può essere difficile da implementare se l'utente non si disconnette esplicitamente, quindi è possibile impostare un timer per farlo.
Ecco un buon tutorial su setTimer () e clearTimer ().
Il problema principale con le sessioni e la sicurezza di PHP (oltre al dirottamento della sessione) viene dall'ambiente in cui ci si trova. Per impostazione predefinita, PHP memorizza i dati della sessione in un file nella directory temporanea del sistema operativo. Senza pensarci né pianificarlo, questa è una directory leggibile a livello mondiale, quindi tutte le informazioni sulla sessione sono pubbliche a chiunque abbia accesso al server.
Per quanto riguarda il mantenimento delle sessioni su più server. A quel punto sarebbe meglio passare da PHP alle sessioni gestite dall'utente dove chiama le funzioni fornite su CRUD (creare, leggere, aggiornare, eliminare) i dati della sessione. A quel punto è possibile archiviare le informazioni sulla sessione in un database o in una soluzione memcache in modo che tutti i server delle applicazioni abbiano accesso ai dati.
Anche l'archiviazione delle sessioni personali può essere vantaggiosa se ci si trova su un server condiviso perché consente di archiviarlo nel database che spesso si ha più controllo sul file system.
Ho impostato le mie sessioni in questo modo-
nella pagina di accesso:
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);
(frase definita in una pagina di configurazione)
quindi sull'intestazione che si trova in tutto il resto del sito:
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
non è affatto utile. In effetti, lo stesso algoritmo di protezione potrebbe effettivamente essere sfruttato, rendendolo peggiore di prima.
Verificherei sia IP che User Agent per vedere se cambiano
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
|| $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
//Something fishy is going on here?
}
Se si utilizza session_set_save_handler () è possibile impostare il proprio gestore sessioni. Ad esempio, è possibile archiviare le sessioni nel database. Fare riferimento ai commenti di php.net per esempi di un gestore di sessioni di database.
Le sessioni DB sono buone anche se si hanno più server, altrimenti se si utilizzano sessioni basate su file, è necessario assicurarsi che ciascun server Web abbia accesso allo stesso filesystem per leggere / scrivere le sessioni.
Devi essere sicuro che i dati della sessione siano al sicuro. Guardando php.ini o usando phpinfo () è possibile trovare le impostazioni della sessione. _session.save_path_ ti dice dove sono stati salvati.
Controlla l'autorizzazione della cartella e dei suoi genitori. Non dovrebbe essere pubblico (/ tmp) o essere accessibile da altri siti Web sul tuo server condiviso.
Supponendo che si desideri ancora utilizzare la sessione php, è possibile impostare php in modo che utilizzi un'altra cartella modificando _session.save_path_ o salvando i dati nel database modificando _session.save_handler_.
Potreste essere in grado di impostare _session.save_path_ nel tuo php.ini (alcuni fornitori consentono) o per apache + mod_php, in un file .htaccess nella cartella principale sito:
php_value session.save_path "/home/example.com/html/session"
. Puoi anche impostarlo in fase di esecuzione con _session_save_path () _.
Controlla il tutorial di Chris Shiflett o Zend_Session_SaveHandler_DbTabella per impostare e gestore di sessioni alternativo.