Domanda

Quali sono alcune linee guida per mantenere una sicurezza responsabile delle sessioni con PHP?Ci sono informazioni in tutto il web ed era ora che arrivassero tutte in un unico posto!

È stato utile?

Soluzione

Ci sono un paio di cose da fare per mantenere sicura la tua sessione:

  1. Utilizza SSL durante l'autenticazione degli utenti o l'esecuzione di operazioni sensibili.
  2. Rigenera l'ID di sessione ogni volta che cambia il livello di sicurezza (come l'accesso).Se lo desideri, puoi anche rigenerare l'ID di sessione ad ogni richiesta.
  3. Fai in modo che le sessioni scadano
  4. Non utilizzare i registri globali
  5. Memorizza i dettagli di autenticazione sul server.Cioè, non inviare dettagli come il nome utente nel cookie.
  6. Controlla il $_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 cambiano indirizzo IP a causa del bilanciamento del carico su più connessioni Internet, ecc. (come è il caso nel nostro ambiente qui).
  7. Blocca l'accesso alle sessioni sul file system o utilizza la gestione personalizzata delle sessioni
  8. Per le operazioni sensibili, valutare la possibilità di richiedere agli utenti che hanno effettuato l'accesso di fornire nuovamente i dettagli di autenticazione

Altri suggerimenti

Una linea guida è chiamare session_regenerate_id ogni volta che il livello di sicurezza di una sessione cambia.Ciò aiuta a prevenire il dirottamento della sessione.

I miei due (o più) centesimi:

  • Non fidarti di nessuno
  • Filtra input, escape output (anche i cookie e i dati della sessione sono il tuo input)
  • Evita XSS (mantieni il tuo HTML ben formato, dai un'occhiata a PHPTAL O HTMLPurificatore)
  • Difesa in profondità
  • Non esporre i dati

C'è un piccolo ma bel libro su questo argomento: Sicurezza PHP essenziale di Chris Shiflett.

Sicurezza PHP essenziale http://shiflett.org/images/essential-php-security-small.png

Nella home page del libro troverai alcuni interessanti esempi di codice e capitoli di esempio.

È possibile utilizzare la tecnica menzionata sopra (IP e UserAgent), descritta qui: Come evitare il furto d'identità

Penso che uno dei problemi maggiori (che viene risolto in PHP 6) sia Register_globals.In questo momento uno dei metodi standard utilizzati per evitare register_globals è usare il $_REQUEST, $_GET O $_POST matrici.

Il modo "corretto" per farlo (a partire dalla 5.2, anche se c'è un po' di bug lì, ma stabile a partire dalla 6, che arriverà presto) è attraverso 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 di fissazione della sessione ha ottimi suggerimenti su dove potrebbe arrivare l'attacco.Guarda anche pagina di fissazione della sessione su Wikipedia.

L'uso dell'indirizzo IP non è davvero l'idea migliore secondo la mia esperienza.Per esempio;il mio ufficio ha due indirizzi IP che vengono utilizzati a seconda del carico e riscontriamo costantemente problemi nell'utilizzo degli 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 sulla sessione.Questo è stato davvero utile con phpBB prima della 3.0 (da allora hanno risolto questo problema) ma penso che sia comunque una buona idea.

Questo è piuttosto banale e ovvio, ma assicurati di farlo sessione_distruggi dopo ogni utilizzo.Questo può essere difficile da implementare se l'utente non si disconnette esplicitamente, quindi è possibile impostare un timer per farlo.

Ecco un bene tutorial su setTimer() e clearTimer().

Il problema principale con le sessioni PHP e la sicurezza (oltre al dirottamento della sessione) deriva dall'ambiente in cui ti trovi.Per impostazione predefinita PHP memorizza i dati della sessione in un file nella directory temporanea del sistema operativo.Senza alcuna riflessione o pianificazione speciale, questa è una directory leggibile da tutto il mondo, quindi tutte le informazioni sulla sessione sono pubbliche per chiunque abbia accesso al server.

Per quanto riguarda il mantenimento di sessioni su più server.A quel punto sarebbe meglio passare PHP alle sessioni gestite dall'utente in cui chiama le funzioni fornite a CRUD (crea, leggi, aggiorna, elimina) i dati della sessione.A quel punto potresti archiviare le informazioni sulla sessione in un database o in una soluzione simile a memcache in modo che tutti i server delle applicazioni abbiano accesso ai dati.

Memorizzare le tue sessioni può anche essere vantaggioso se ti trovi su un server condiviso perché ti consentirà di memorizzarle nel database su cui spesso hai più controllo rispetto al filesystem.

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)

poi sull'intestazione che è presente 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();     
}

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache aggiungi intestazione:

X-XSS-Protection    1

Vorrei controllare sia l'IP che l'agente utente 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 usi session_set_save_handler() puoi impostare il tuo gestore di sessione.Ad esempio potresti memorizzare le tue sessioni nel database.Fare riferimento ai commenti di php.net per esempi di gestori di sessioni di database.

Le sessioni DB sono utili anche se si dispone di più server, altrimenti se si utilizzano sessioni basate su file è necessario assicurarsi che ciascun server Web abbia accesso allo stesso file system per leggere/scrivere le sessioni.

Devi essere sicuro che i dati della sessione siano al sicuro.Guardando il tuo php.ini o usando phpinfo() puoi trovare le impostazioni della tua sessione._session.save_path_ ti dice dove vengono salvati.

Controlla i permessi della cartella e dei suoi genitori.Non dovrebbe essere pubblico (/tmp) o essere accessibile da altri siti Web sul tuo server condiviso.

Supponendo che tu voglia comunque utilizzare la sessione php, puoi impostare php per utilizzare un'altra cartella modificando _session.save_path_ o salvare i dati nel database modificando _session.save_handler_ .

Potresti essere in grado di impostare _session.save_path_ nel tuo php.ini (alcuni provider lo consentono) o per apache + mod_php, in un file .htaccess nella cartella principale del tuo sito:php_value session.save_path "/home/example.com/html/session".Puoi anche impostarlo in fase di esecuzione con _session_save_path()_ .

Controllo Il tutorial di Chris Shiflett O Zend_Session_SaveHandler_DbTable per impostare un gestore di sessione alternativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top