2012-08-05 8 views
5

Desidero che i miei utenti abbiano la possibilità di "Mi tengo connesso" quando accedono al mio sito web. Su suggerimento della risposta principale su questo post, "Keep Me Logged In" - the best approach, ho deciso di cancellare una combinazione di password e password dell'utente in un cookie e memorizzare l'ID dell'utente (un numero) in un altro cookie. Ovviamente, il valore hash verrà memorizzato anche sul lato server del database per essere convalidato quando l'utente ritorna di nuovo. Il valore di sale che ho usato è lo stesso con cui ho usato la password dell'utente quando si registra per la prima volta, quindi è statico - non cambia tra le sessioni. Ci sono alcuni dei problemi che vedo con questo approccio.Come conservare i cookie contenenti dati sensibili in modo sicuro in PHP?

1) L'uso della registrazione sale è una buona idea se è statico o dovrei generare un sale diverso ogni volta per il cookie?

2) Se qualcuno dovesse accedere ai cookie e li copia su un altro computer, e quindi provare ad accedere al sito Web da quel computer, in teoria, li accederà automaticamente all'account dell'utente, non è questo un problema di sicurezza?

3) In uno scenario in cui alcuni utenti con intenti malevoli dovevano accedere al database, un sito Web sicuro avrebbe password salate e hash che rendevano piuttosto difficile per l'hacker accedere a più account (se non del tutto) . Ma, semplicemente giocando con i valori hash e salt e creando un cookie che corrisponda ai valori che hanno modificato sul database, possono effettivamente ottenere l'accesso a qualsiasi account che desiderano, rendendo l'intero processo di hashing delle password come inutile. Pertanto, questo approccio di cookie che sto usando ora sta compromettendo il mio intero database e tutti gli account dei miei utenti.

Quindi la mia domanda è, come faccio a memorizzare un cookie in PHP con informazioni sensibili come un hash della password dell'utente senza doversi preoccupare dei suddetti problemi? Sicuramente siti web come Gmail e Hotmail, che offrono questa funzionalità "Keep me logged in", seguono un approccio più sicuro di quello che sto facendo ora, quindi come avrebbero fatto?

risposta

9

Non memorizzare la password nel cookie, cancellata o meno. In realtà, non c'è motivo di memorizzare qualcosa di sensibile nel cookie. Tutto quello che devi fare è mappare un ID casuale a 128 bit (o più grande) su un account utente nel tuo database e archiviarlo nel cookie. Non c'è modo che qualcuno possa indovinare un id valido con la forza bruta remota, specialmente se avete dei lock-out sul posto.

Se qualcuno dovesse ottenere l'accesso ai cookie e copiarli su un altro computer, e quindi provare l'accesso al sito da quel computer, in teoria, li registrerà automaticamente per conto di tale utente, non è questo un problema di sicurezza?

Sì. Questo è il lato negativo della funzionalità. Tuttavia, se il tuo sito Web rileva un nuovo indirizzo IP (in particolare di paesi diversi) e richiede un secondo passaggio (invia un codice a un dispositivo mobile, ecc.), Risolvi questo problema insieme al problema generale di una password rubata. (Questo naturalmente non aiuta a prevenire attacchi alla rete locale, come un wifi pubblico insicuro.)

Una soluzione più conveniente è richiedere il cookie "ricordami" per utilizzare SSL. In questo modo un hacker non vedrebbe mai il cookie nella trasmissione di testo normale, e probabilmente sarebbe necessario un attacco locale. (E se tale, il ricordami cookie è probabilmente l'ultimo dei dubbi dell'utente.)

possono effettivamente accedere a qualsiasi account desiderato, rendendo inutile l'intero processo di hashing della password.

Sì, e no.Se usi la tecnica che ho descritto (id casuale), possono accedere solo agli account che hanno un cookie "ricordami". Ma detto questo, se hanno accesso al tuo database, possono forzare brutalmente qualsiasi account che vogliono. Anche le password salate sono facili da decifrare localmente se la password stessa è debole.

Inoltre, si può considerare il "ricordati di me" login di essere un mezzo di accesso. L'accesso all'acquisto di qualcosa, la modifica di un indirizzo email, ecc. Richiederebbe comunque l'inserimento di una password. Fare cose innocue come postare su una bacheca potrebbe essere fatto senza la password.

Infine, ricordiamo che un cookie di sessione PHP è niente più che un temporaneo "ricordati di me" gettone! Gran parte di ciò si applica al concetto di dirottamento di sessione. Il token "ricordami" aggiunge semplicemente una finestra più ampia di opportunità.

Così, in breve: non riporre oggetti sensibili in un cookie, Richiedi SSL per il cookie e, se possibile, implementare l'autenticazione a più fattori ... soprattutto per gli account di amministrazione.

+0

Buona risposta, grazie. Quindi userò qualcosa come uniqid() per generare un token per ricordare il login. Non mi sento ancora a mio agio con quanto sia facile attaccare gli account in caso di compromissione del database. Se l'intero meccanismo "ricordami di me" non fosse incluso, potrei probabilmente rilevare un'intrusione e agire prima che si verifichi un danno grave, ma con questa soluzione gli attacchi sarebbero praticamente istantanei. – hesson

+0

'uniqid()' mentre unique non è molto difficile da prevedere. Userei qualcosa come un 'openssl_random_pseudo_bytes()' codificato in base a 64. Le tue preoccupazioni sono valide, ma ancora una volta, i controlli di integrità proteggono da attacchi diffusi. ad es., se ricevi molti nuovi IP che accedono a vecchi account o una registrazione IP in più account, alza un flag. – Matthew

Problemi correlati