Domanda

Sto sviluppando un sistema di accesso basato su PHP. Ogni utente ha un ID (un numero) e una password, che viene memorizzata come hash salato.

Sono in grado di capire se un accesso ha esito positivo o meno, ma ora ho bisogno di archiviare tali informazioni da qualche parte (in modo che l'utente non sia disconnesso in modo permanente).

In passato, ho giocato con le variabili $ _SESSION. Tuttavia, questi sembrano essere eliminati quando l'utente lascia il browser, il che è indesiderato. Inoltre, non posso " dare per scontato " che l'utente non tenterà di ingannare il sistema, quindi deve essere sicuro.

Quindi, ecco le mie domande:

  1. Devo usare $ _SESSION o $ _COOKIE ? Quali sono i principali vantaggi di ciascuno di questi approcci?
  2. Come implementare una casella di controllo "Ricordami"?
  3. Quali informazioni devono essere archiviate nella variabile sessione / cookie?

Si noti che in questa particolare domanda non vengono presi in considerazione problemi di sicurezza del database.

Per quanto riguarda il numero 3, intendo esattamente:

  • Devo memorizzare l'ID e la password con hash dell'utente nel cookie / sessione, oppure
  • Devo memorizzare l'ID e la password senza hash dell'utente nel cookie / sessione, oppure
  • Devo memorizzare un " SessionID " e la password (con hash o senza hash?) o
  • Devo memorizzare un "ID sessione", l'ID "quot" e la password (ancora una volta, con o senza hash)?

Voglio mantenere il mio sito Web il più sicuro, efficiente e facile da usare possibile. Se viene adottato un approccio basato su SessionID, apprezzerei anche alcune spiegazioni su come memorizzarlo nel database.

Grazie in anticipo

EDIT: le risposte di Eran e Brian combinate sembrano essere ciò di cui ho bisogno. Sfortunatamente, posso solo contrassegnarne uno come accettato. Cercherò di andare avanti e implementare per vedere quale è stato più utile.

È stato utile?

Soluzione

Voglio ribadire il punto di Eran mai archiviare la password dell'utente o persino un hash della password nella sessione o nei dati dei cookie.

In generale ho implementato la funzionalità Ricordami nelle app Web utilizzando i cookie. Un buon punto di partenza per informazioni sulla costruzione di un "sicuro" il sistema di accesso persistente è questo post sul fishbowl . Una risposta approfondita è già trattata in un'altra risposta di overflow dello stack .

Se devi assicurarti che il login sia sicuro devi usare https. Questo perché i cookie o le sessioni possono essere rubati se non sono crittografati.

Un'altra buona pratica da seguire è il sistema di accesso a 2 livelli. Puoi vederlo su siti come Amazon, dove puoi aggiungere elementi al carrello senza effettuare l'accesso, ma se desideri effettuare il checkout o modificare il tuo account in qualche modo devi inserire di nuovo la password.

Altri suggerimenti

Per informazioni sensibili (es. risultati di autenticazione) utilizzare solo sessioni. Le sessioni sono archiviate sul lato server e hanno molte meno probabilità di essere compromesse.

Per quanto riguarda la durata della sessione, l'impostazione predefinita è la durata della sessione del browser, ma puoi controllarla. Esistono diverse impostazioni che influiscono su questo:

session.gc_maxlifetime - controlla efficacemente la durata della sessione.

session.gc_probability e session.gc_divisor determinano insieme con quale frequenza avrà luogo la garbage collection della sessione.

E last - session.cookie_lifetime controlla la durata del cookie di sessione (il cookie che contiene l'id di sessione in modo che non debba essere trasferito sull'URL). Dovrebbe corrispondere al valore di session.gc_maxlifetime.

Inoltre, non archiviare mai le password in sessioni o cookie (anche in formato con hash). Solo i risultati dell'autenticazione.

Archivia l'ID in $ _SESSION ma non archivia la password con hash o senza hash. Una volta che l'utente ha effettuato l'accesso e l'ID è stato salvato in $ _SESSION, non è più necessaria la password.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top