Ho capito bene la funzione "autologin" del sito web?

4

Sto sviluppando una libreria di autenticazione (*) per un sito Web e mi sono reso conto che forse non sto capendo completamente quale sia la funzione "autologin" e come svilupparla.

Mentre raccoglievo informazioni e studiavo altro codice, mi sono imbattuto in un paio di librerie che implementano l'opzione per accedere all'utente senza dover effettuare l'accesso (queste librerie sono Auth Auth e Ion, create per il framework PHP CodeIgniter); fondamentalmente lavorano alla creazione di un cookie che, nel caso in cui l'utente non sia loggato (i dati di sessione non sono impostati) ma questo cookie viene trovato, consente loro di accedere comunque.

Ok, finora è chiaro. Quello che non capisco, però, è il motivo per cui entrambe le librerie cancellano il cookie di autologin quando l'utente si disconnette. Voglio dire: accedo, controllo l'opzione "ricordami" (**), faccio ciò che devo fare nel mio pannello di amministrazione, quindi esco; se il cookie di autologin viene cancellato, la prossima volta dovrò accedere nuovamente compilando il modulo, ignorando l'opzione I flaggata. Qual è il suo scopo allora? Ho pensato che questo "autologin" sarebbe stato un accesso esteso che mi ha permesso di evitare di dover compilare nuovamente il modulo di accesso.

Quindi sono andato avanti e ho sviluppato la mia funzione di autologin, ma ovviamente mi sono imbattuto nel problema di non essere in grado di disconnettere affatto , dato che non lo sto eliminando. Quindi mi disconnetto, reindirizzato alla home page, poi vado al pannello di amministrazione e il sistema mi registra ... beh, funziona come previsto, ma non sono sicuro se questo è come dovrebbe essere ... Come dovrebbe essere fatto correttamente?

Qualcuno può spiegarmi come dovrebbe funzionare? Mi sto un po 'confuso

P.S. Non so se questo è il posto giusto per chiederlo, o se SO è una soluzione migliore; Mi dispiace se ho postato sul sito SE sbagliato.

(*) Per favore non dirmi "non reinventare la ruota" o alcuna variante di essa; Lo sto facendo per imparare e sto progettando di renderlo un progetto open source per il divertimento del pubblico, quindi volontariamente do voglio reinventare la ruota, al costo di renderlo ovale.

(**) Penso di aver indovinato la differenza tra l'opzione "ricordami" e la funzione "autologin"; finora, non ho considerato il primo (1 - perché molti browser ti chiedono di farlo comunque; 2 - perché non so come farlo correttamente, cioè come far riempire automaticamente i campi di login senza questo la minaccia alla sicurezza di avere la password memorizzata in testo in chiaro all'interno di un cookie), ma per favore dimmi se ho frainteso anche questo ..

    
posta Damien Pirsy 18.12.2011 - 23:07
fonte

3 risposte

5

Prima chiariamo alcune cose:

  1. Le sessioni PHP, nella loro forma predefinita sono basate sui cookie, ho una panoramica di come funzionano in un'altra risposta . Ma dal momento che sono basati sui cookie, secondo me, se baserai il tuo flusso di lavoro di autenticazione e autorizzazione sui cookie, vai con i normali cookie per tutto - e usa le sessioni solo per quello a cui sono destinate: persistenza dei dati di sessione.

  2. Lo schema di accesso circolare che hai notato è esattamente il motivo per cui devi eliminare i cookie al logout. Inoltre, come @Morons scrive , quando un utente fa clic su Esci, si aspetta di uscire. Non cancella la funzione di login automatico, ma dovrebbe essere possibile disconnettersi in qualsiasi momento.

Ora, il mio approccio di accesso automatico è simile a questo:

Cheovviamenteèpiuttostosemplice,maciòcheèveramenteimportanteèl'interocontrollo"cookie è valido". Quando un utente accede correttamente con l'opzione "ricordami", ho generato un token di accesso automatico: una stringa casuale unica sensibilmente , molto probabilmente un hash salato .

Questa è l'unica cosa che immagazzino nel cookie, nient'altro altro. Non è necessario memorizzare nulla che possa identificare un singolo utente in un cookie, è necessario evitare di memorizzare elementi come nomi utente ed e-mail (anche con hash). Nel mio database, ho una semplice tabella token che in pratica memorizza:

  1. Un ID utente,
  2. Il token,
  3. Una data di scadenza

E il mio controllo riguarda solo la verifica di questo tavolo. La data di scadenza può sembrare eccessiva, in quanto puoi far scadere il cookie quando vuoi, ma: dovresti trattare tutto ciò che arriva insieme al cookie come input dell'utente, non sicuro e facilmente falso. Ciò include la sua scadenza. E ovviamente al logout non mi preoccupo di uccidere il cookie, ho appena impostato un NOW() come data di scadenza. Facile come una torta, e tengo la maggior parte degli elementi del controllo lato server, dove ci si sente un po 'più sicuri.

In un progetto recente, ho fatto un ulteriore passo avanti e ho aggiunto il controllo ad ogni richiesta di pagina invece di memorizzare qualcosa in una sessione per indicare una sessione autorizzata. Alcuni potrebbero obiettare che la chiamata al database porterà a problemi di prestazioni, ma la mia tabella 'token' è cresciuta fino a circa 10 milioni di token 1 e ancora non ho notato alcun problema reale. Tieni presente che le sessioni comportano l'accesso al file system, che non è quasi mai più veloce di un semplice select .

Ovviamente, qualsiasi cookie che memorizza qualsiasi cosa relativa all'autenticazione e all'autorizzazione deve essere crittografato . E ti consiglio di applicare sempre i cookie sicuri, con setcookie() è facile come impostare il parametro secure a true:

Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client. When set to TRUE, the cookie will only be set if a secure connection exists. On the server-side, it's on the programmer to send this kind of cookie only on secure connection (e.g. with respect to $_SERVER["HTTPS"]).

1 Non elimino i token scaduti per una serie di motivi.

    
risposta data 19.12.2011 - 00:14
fonte
5

Non intendo superare la risposta esaustiva di @Yannis Rizos, ma voglio solo rispondere a un elemento molto specifico che hai chiesto: L'opzione "Esci" esiste proprio in modo che l'utente possa indicare che non desidera essere ricordato più. Controlla tutti i principali siti web e vedrai che funzionano tutti in questo modo: una volta che ho controllato la casella di controllo "ricordami" nella schermata di accesso, e finché non effettuo esplicitamente il logout, sono ricordato. Una volta che mi disconnetto esplicitamente, non mi ricordo più.

Un paio di altri punti:

In tutti i principali siti Web che conosco, "ricordami", naturalmente, significa "ricorda sia il mio nome utente che la mia password"; in altre parole, "per favore non disturbarmi con le schermate di accesso".

Inoltre, lo stato dell'arte al giorno d'oggi per i siti web generalmente utilizzati da persone quotidiane, come Gmail, sembra essere che circa una volta al mese dovresti comunque dimenticare gli utenti, il che significa che vedono un log-in schermo e devono ri-digitare le loro credenziali una volta al mese. Apparentemente loro (cioè i ragazzi di Gmail) hanno fatto delle ricerche su questo argomento e hanno scoperto che questo aiuta gli utenti a ricordare la loro password, con un minimo di fastidio. (Solo una volta al mese.)

    
risposta data 19.12.2011 - 00:48
fonte
0

La disconnessione dovrebbe disconnettere l'utente finché non si collega (manualmente) nuovamente. es .: un disarmo temporaneo dell'accesso automatico.

In altre parole, elimina il cookie.

Ricordami dovresti ricordare solo nome utente non la password .

    
risposta data 18.12.2011 - 23:20
fonte

Leggi altre domande sui tag