2012-10-30 11 views
9

(mi ha sorpreso che questa domanda non è stata posta su Stack per ora, ma ho fatto qualche ricerca e non ho trovato nulla oO)Perché dovrei usare l'ID di sessione nei cookie invece di memorizzare la password di accesso e (con hash) nei cookie?

Sto lavorando su webapp basata sui servizi e mi chiedo cosa sia il modo migliore per gestire gli accessi degli utenti. Finora ho:

  1. Quando l'utente effettua il login, fornisce credito. La password viene salata e sottoposta a hash in locale, quindi viene trasmessa al server su POST (in modo che gli utenti non possano recuperare la password originale, ad esempio per controllarli negli altri siti)
  2. Login e password con hash vengono memorizzati nel cookie con TTL di 15 minuti (revocato ogni singola webaction)
  3. Passwod è salato sul server e sottoposto ad hash di nuovo, e rispetto alla password memorizzata nel database (quindi, le password sono double hash con diversi sali, questo è per qualcuno che si interromperà nel database - non saranno ancora in grado di recuperare credenziali di accesso)
  4. L'utente può eseguire al massimo 3 tentativi di accesso per 5 minuti dal singolo IP
  5. Gli utenti ottengono informazioni sull'ultimo riuscito e unsu ccessful tentativi di accesso a fianco con data e IP

qualcuno aveva notato che è meglio per memorizzare unico ID di sessione, invece di una password hash in biscotto e mi chiedo il motivo per cui è così importante - se qualcuno annusare i pacchetti, che non è una sessione importa id o no - possono ancora ottenere pacchetti dal login con tutti i dati necessari per porsi come utenti legittimi e accedere autonomamente. Quindi ci sono altri vantaggi dell'approccio session-id memorizzato rispetto alla memorizzazione di login e hashed-password in cookie apprapool?

risposta

11

Memorizzare la password con hash come cookie è una vulnerabilità molto sgradevole ed è un OWASP Violation. L'intero punto in hashing una password è che si sta costringendo l'attaccante a rompere l'hash per accedere. Se l'utente malintenzionato può semplicemente estrarre l'hash dal database e quindi effettuare il login, allora si dispone di un sistema equivalente alla memorizzazione della password in testo normale.

Ogni piattaforma ha un gestore di sessione, in php basta usare session_start() e $ _SESSION super globale. Scrivendo il tuo gestore di sessione personale sarai meno sicuro.

+0

I'm rehashing password di nuovo, lato server. C'è una doppia password hash nel database, quindi non è possibile ottenere la password single-hash, che è richiesta per l'accesso – PiotrK

+3

@PiotrK è ancora un'idea orribile, non scrivere il proprio gestore di sessione. – rook

+0

Volevo descrivere il mio problema nel modo più generico possibile per essere utile alla comunità, ma la situazione è leggermente diversa: sto utilizzando Flash come client e sta facendo chiamate HTTP e ricevendo dati in formato XML semplice. Non posso usare la sessione standard, perché non ho GET o COOKIE nel mio codice.Mi riferisco solo alle variabili mantenute dal client Flash come "cookie", perché si comportano come tali. Ecco perché non posso usare il gestore di sessione PHP e devo scrivere il mio :) – PiotrK

4

Memorizzando un ID sessione è possibile identificare diverse sessioni dello stesso utente e si consiglia di gestirle in un modo speciale (ad esempio, consentire una singola sessione o dati associati alla sessione anziché al utente).

E puoi distinguere facilmente attività da sessioni diverse, così puoi uccidere una sessione senza dover cambiare la password se la lasci aperta in un computer, e le altre sessioni non noteranno una differenza.

0

L'hashing doppio non ti protegge dall'exploit. Se uno prende l'ID utente memorizzato e ha cancellato la password dal cookie e inviato al server, otterrebbe immediatamente l'accesso. Con gli ID di sessione, sarebbe almeno il timeout.

Problemi correlati