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?
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
'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