2009-11-23 11 views
6

Ho un oggetto utente che contiene informazioni sull'utente (nome utente, ip, paese, nome, email ... ma NON password). Devo memorizzare solo il nome utente nel cookie e quindi recuperare tutte le informazioni dal DB al caricamento della pagina, o semplicemente memorizzare l'intero oggetto Utente nel cookie?È sicuro memorizzare l'oggetto utente in un cookie?

risposta

16

Non è possibile fidarsi di alcuna informazione memorizzata in un cookie, in quanto l'utente può manipolarlo a suo piacimento.

Suggerisco di utilizzare un PHP session per memorizzare l'oggetto. In questo modo, l'utente finale ha solo un ID di sessione memorizzato in un cookie, con i dati reali sul tuo server.

La sessione scadrà alla fine, anche se ... costringendo l'utente ad accedere nuovamente.

Modifica: Whoops, dovrei sottolineare che le sessioni sono davvero facili da usare. Basta fare quanto segue:

session_start(); // This MUST be at the very top of every page that accesses the session 

// Store something in the session with the key 'something' 
$_SESSION['something'] = "Hi, I'm a session!"; 

// Retrieve 'something' from the session 
$myString = $_SESSION['something']; 
+7

+1 per "impossibile fidarsi dei dati nei cookie". Per ampliare i point-cookies di R. Bemrose dovrebbe contenere un puntatore ai dati nel tuo sistema, niente di più. In questo modo, di per sé, i dati dei cookie non hanno senso. –

+0

Inoltre, il passaggio di enormi quantità di dati in un cookie può avere un effetto negativo sui tempi di caricamento della pagina poiché il cookie viene trasmesso ad ogni richiesta. – Yacoby

+0

Oppure, potrebbe avere un effetto positivo sui tempi di caricamento della pagina, in quanto consente di eliminare un round-trip del database. Lo saprai solo misurando. :) – Thom

0

In questo caso, direi memorizzare l'id utente nel cookie e il gioco è fatto. Quindi, al primo caricamento della pagina, si carica tutto il necessario dal database e si continua a utilizzare una sessione finché l'utente rimane sulla pagina.

Per verificare se la pagina viene caricata la prima volta, ho appena impostato un bool nella sessione se è stato caricato. Se il bool non esiste, l'utente lo carica inizialmente.

Probabilmente ci sono modi migliori per farlo, ma funziona in modo semplice e facile. :)

1

La regola standard di "mai fidarsi dei dati pubblicati" si applica anche ai cookie. Suggerisco di memorizzare solo l'ID utente e un hash dell'ID e qualche segreto noto solo al server.

0

Memorizza solo un ID di sessione! Dati mai significativi come l'ID utente. Immagina di avere un sito con 10.000 utenti. È probabile che tu abbia almeno un utente chiamato superman e batman - se hai strappato un nome utente in un cookie per accedere alle informazioni della sessione - è potenzialmente possibile per me manipolare quel cookie per modificare le informazioni memorizzate dal mio nome utente a batman e ottenere l'accesso al conto di Batman se la sua sessione è ancora viva. Se memorizzi una sorta di ID di sessione generato in modo casuale, è praticamente impossibile per me capire un numero di sessione che funzioni per un altro utente per dirottare quella sessione.

0

È possibile fidarsi delle informazioni nel cookie se si utilizza qualcosa come Hmac. Gli utenti potrebbero ancora vedere i dati, ma si saprebbe se li hanno manomessi (ad esempio, cambiando il loro nome utente in quello di qualcun altro nel tentativo di vedere i dati di un altro utente). Se non vuoi che vedano i dati, potresti anche crittografare simeticricamente i dati che stai inviando. Ovviamente c'è un sovraccarico della CPU per tutto questo, e una larghezza di banda in testa più roba ci si stipa lì, ma è del tutto legittimo fare quello che stai chiedendo.

0

@ ApoY2k - Penso che il voto negativo (non ero io :) era perché non si può presumere che il nome utente che viene passato da un cookie sia l'effettivo nome utente che hai scritto sul cookie. Questo è il motivo per cui hanno suggerito di usare sessionID. Usando il sessionID puoi ottenere il nome utente e come ha detto è valido solo per 20 minuti o qualsiasi cosa tu abbia impostato per il timeout della sessione. SessionID non rivela alcun dato privato. Ho avuto il tuo stesso pensiero prima di trovare questo post.

Problemi correlati