Avvio di una sessione php sicura

7

Ho cercato di creare sessioni php sicure da utilizzare in uno script di accesso per una settimana circa. Finora non ho trovato una risorsa concreta per basare il mio lavoro, leggendo StackOverflow tutto quello che ho visto sono opinioni e opinioni contrastanti.

Ho deciso di immergermi e dare a scrivere una funzione per iniziare la sessione.

Con una lettura approfondita e guardando la presentazione di Samy Kamkar da DEFCON su Youtube, sono abbastanza fiducioso e soddisfatto del primo pezzo di questo sistema che ho scritto.

$session_name = 'sec_session_id'; // Set a custom session name
$secure = false; // Set to true if using https else leave as false
$httponly = true; // This stops javascript being able to access the session id 
ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. 
ini_set('session.entropy_file', '/dev/urandom'); // better session id's
ini_set('session.entropy_length', '512'); // and going overkill with entropy length for maximum security

$cookieParams = session_get_cookie_params(); // Gets current cookies params.
session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); 
session_name($session_name); // Sets the session name to the one set above.
session_start(); // Start the php session

Questo sarà usato con SSL per motivi di sviluppo non è ...

Quindi la mia domanda è dove posso migliorare su questo script, ho perso qualcosa, cosa dovrei esaminare nel prossimo ...

    
posta TuKritical 19.11.2012 - 06:43
fonte

3 risposte

2

Questo sembra abbastanza buono. Non riesco a vedere buchi sgargianti, tranne il fatto che SSL (https only) è spento, anche se hai detto che verrà attivato in produzione.

Potresti anche voler esaminare HTTP Strict Transport Security (HSTS) e Content Security Policy (CSP) ( dettagli / intro ) per una maggiore sicurezza.

    
risposta data 19.11.2012 - 09:47
fonte
2

Puoi inoltre "bloccare" la sessione su uno specifico indirizzo IP del client, il che rende la sessione ancora più difficile, ma rende quasi impossibile il roaming degli ISP o delle posizioni per gli utenti (l'utente deve relogin).

    
risposta data 19.11.2012 - 11:23
fonte
2

C'è molta configurazione e non molto codice.

Non c'è molto motivo nell'usare un generatore di numeri casuali veramente buono se non si imposta il flag di sicurezza (ma suppongo che lo cambierai per il sistema live).

Tuttavia ci sono alcuni problemi qui.

Per prima cosa non dici in quale contesto è in esecuzione - su un server condiviso, i dati di sessione dal gestore predefinito saranno generalmente accessibili da tutti i vhost. Anche su un server dedicato, consiglierei di impostare il gestore di Sesison per limitare l'accesso alle sessioni (es. Usando un gestore di database, con una stored procedure per impostare / ottenere la sessione in base all'ID e nessun accesso diretto ai dati sottostanti) .

Successivamente, non c'è nulla qui per occuparsi della risoluzione della sessione. In realtà dovresti forzare l'identificatore di sessione a cambiare quando viene creata la sessione (cioè quando è vuoto - ma ricorda di mettere qualcosa lì dentro dopo aver cambiato l'id di sessione) e quando l'utente è autenticato.

Un'ulteriore avvertenza è che il gestore predefinito riutilizzerà le sessioni che hanno superato il loro TTL (se non sono ancora state raccolte da rifiuti).

Il consiglio di Polynomiial è una buona protezione contro sslstripping.

Consiglierei di provare ad associare una sessione con un dispositivo specifico - ma a differenza di Manuel Faux, suggerirei di utilizzare solo i primi 16 bit dell'indirizzo IPV4. Allo stesso modo, l'abbinamento tra l'agente utente e la sessione fornisce una protezione aggiuntiva (ma si noti che Google Chrome può aggiornarsi al volo, anche a metà sessione).

Perché stai sovrascrivendo le impostazioni del file ini nel tuo codice? Questi dovrebbero essere impostati nel tuo file php.ini.

$cookieParams = session_get_cookie_params(); // Gets current cookies params.
session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly)

Non ha molto senso cambiare i parametri del cookie nei valori che già detengono.

L'altra cosa che manca nel tuo codice è qualsiasi tipo di registrazione.

    
risposta data 19.11.2012 - 12:43
fonte

Leggi altre domande sui tag