2012-05-12 18 views
14

Più tardi stavo chiedendo come disconnettere correttamente un utente, ora vedo che usare solo i cookie per mantenere un utente loggato non è affatto sicuro.Qual è il modo corretto e sicuro per mantenere un utente connesso? biscotti? sessione? PHP && MYSQL

Mantenere la password in un cookie non è un metodo sicuro per farlo, quindi la mia domanda è, Qual è il modo corretto di fare (login/mantenere l'utente connesso) sul mio sito web?

Attualmente memorizzo l'ID utente che è lo stesso dell'URL che deve mostrare il profilo utente X e l'e-mail e la password crittografati in MD5.

Setcookie è l'unica funzione che utilizzo quando si accede correttamente. Uso solo le sessioni per memorizzare numeri casuali per evitare invii di moduli ripetitivi. campi nascosti.

• Potete mostrarmi come è il modo corretto e sicuro per farlo?
• Qual è il tuo modo di farlo?

Solo PHP. Due mesi in php, tutti appreso dalle tue risposte. Grazie

+0

Non capisco. perché dovresti memorizzare la password in un cookie? Utilizzare le sessioni, non i cookie. Basta memorizzare un valore booleano in una variabile di sessione per verificare se un utente è connesso o meno. – Flukey

+0

@Flukey: l'ID di sessione viene solitamente trasferito su un cookie. Può essere rubato proprio come una password che può essere rubata e l'utente malintenzionato dovrebbe accedere come te senza nemmeno dover digitare la password. –

+5

possibile duplicato di [La Guida definitiva all'autenticazione basata su sito basata su moduli] (http://stackoverflow.com/questions/549/the-definitive-guide-to-forms-based-website-authentication) – eggyal

risposta

6

Vorrei utilizzare una sessione.

Per aiutare un po 'sulla sicurezza, una volta verificate le credenziali degli utenti utilizzare session_regenerate_id - poiché l'ID di sessione è ciò che viene passato in un cookie questo è importante se qualcuno annusa durante l'accesso in elaborazione.

NON memorizzare NESSUNA informazione nella sessione relativa alle credenziali di accesso - un ID utente è spesso sufficiente; personalmente costruisco un oggetto utente che immagazzino nella sessione (questi vengono serializzati/non serializzati automaticamente tra una richiesta e l'altra, ma puoi leggerlo in modo indipendente).

SE si desidera impostare un cookie in modo che l'utente non debba effettuare il login alla visita successiva, magari memorizza l'ID utente e un token generato automaticamente che può essere verificato nel database (o simile) - Vorrei aggiungere degli anche il controllo - come la memorizzazione dell'ultimo indirizzo IP con il token da controllare, se non corrispondono allora chiedi di nuovo il login.

Ci sono alcuni approcci che possono essere adottati - Non offro tutti/"i migliori" - riesaminare il codice da persone in una comunità di PHP - si impara di più in questo modo.

25

Per prima cosa, lascia che ti dica questo. Niente è sicuro al 100%. Niente è a tenuta d'aria e nulla è sacro. Se sufficientemente motivato, un utente malintenzionato interromperà ogni difesa lato server che potresti mettere (a meno che tu non stia utilizzando HTTPS, che è una storia diversa).

È possibile utilizzare i cookie, ma i cookie sono altamente esposti e facilmente modificabili. Non memorizzare mai dati privati ​​o livelli di accesso in un cookie. Poiché è facilmente rubato/modificato da un utente malintenzionato.

Le sessioni non sono al 100% sicure. L'ID di sessione, che il server utilizza per identificare il client, viene inviato da uno dei 2 modi. una variabile $ _GET (cattiva) o un cookie (meglio, ma ancora piuttosto scadente). Significa, se sei loggato come amministratore, su un WiFi non protetto, un abile attaccante (e con abilità intendo un pr0 haxx0r che ha scaricato un semplice sniffer HTTP) può facilmente rubare il tuo ID SESSIONE. E pur non ricevendo la tua password, il server identificherà erroneamente l'utente malintenzionato come te e gli concederà ogni accesso che potresti avere/avuto.

Quindi cosa fare? Le sessioni sono nella maggior parte dei casi sicure. Consiglia agli utenti di non accedere in una rete non protetta (bus, internet cafè, ecc.).Se si desidera consentire al proprio utente di persistere nel tempo, è necessario un cookie. Io di solito uso un sistema a 2 biscotto se ho bisogno che:

userid=12345 
hash=$userid . $password . $user_specific_random_pregenerated_salt 

Poi ho qualcosa da abbinare contro, e dettagli dell'utente non sono stati rivelati.


Ma come ho detto, alla fine della giornata, se davvero voleva davvero per proteggere gli utenti, sopra a tutto il resto scritto in questa risposta, farti HTTPS.

+0

risposta molto bella, puoi dire qualcosa di simile anche per https. mi piacerebbe leggerlo. mi hai appena insegnato un sacco di cose in un'unica risposta. se solo potessi avere qualche informazione su https, sarò molto grato. un link forse. ? –

+0

@RishirajPurohit Vedi https://letsencrypt.org/ –

+0

Grazie amico, lo apprezzo –

3

Se una persona ha un accesso e una password, questa può essere impostata come cookie nel browser in modo che non debbano effettuare nuovamente l'accesso al sito Web ogni volta che visitano. È possibile memorizzare quasi tutto in un cookie del browser. Il problema è che un utente può bloccare i cookie o eliminarli in qualsiasi momento. Se, ad esempio, il carrello del tuo sito web utilizzava i cookie e una persona aveva il proprio browser impostato per bloccarli, allora non potevano fare acquisti sul tuo sito web.

Quando si memorizzano i dati nei cookie, è necessario essere assolutamente certi che gli utenti non possano manomettere i dati in alcun modo. Non c'è modo di impedire agli utenti di alterare i dati in un cookie; è assurdamente facile. Pertanto, al fine di garantire che il sito Web non accetti i cookie contenenti dati modificati, è necessario crittografare i valori dei cookie o firmarli con un hash che consente di verificarne l'integrità.

+1

anche se un cookie è crittografato non c'è nulla per impedire a qualcuno di rubare il cookie e usarlo per accedere. Se hanno accesso al computer è come lasciare la password sul computer –

2

Come @Madara ha affermato che nulla è sicuro e corretto al 100% ma, come punto di vista dello sviluppatore, direi che ogni metodo di conservazione dei dati di sessione dell'utente presenta i propri vantaggi e svantaggi, ad esempio.

dati utente nei cookie vs sessione

Se siete mantiene i dati della sessione dell'utente in cookie si consumerà memoria RAM meno del server e l'elaborazione perché non si devono tenere informazioni effettuato dell'utente nella RAM. anche se l'utente aumenta, si consiglia di mantenere i dati della sessione utente nei cookie piuttosto che nella sessione perché tenere in sessione consumerebbe risorse del server e l'applicazione potrebbe essere più lenta e non reattiva. come se si conservasse i dati di accesso dell'utente nella sessione Sarebbe sicuro dei cookie ma consumerebbe più risorse del server.

Sulla nota finale: Entrambe le vie sono corrette nella sua propria implementazione anche se l'applicazione utilizza il protocollo HTTPS, allora la sicurezza non dovrebbe essere una preoccupazione. quindi suggerirei di utilizzare metodi di conservazione dei dati di sessione dell'utente in base ai requisiti del modello di business e dell'applicazione.

0

È consigliabile utilizzare sessioni PHP.

Una sessione PHP viene mantenuta facendo in modo che il browser restituisca una stringa crittograficamente protetta (ovvero non indovinabile per il valore valido successivo) nota come ID ID ogni volta che effettua una richiesta durante tale sessione. Il modo migliore e più sicuro per farlo è di fornire al browser un cookie di sessione , che verrà poi inviato ad ogni richiesta.

Il metodo alternativo all'utilizzo di un cookie di sessione consiste nell'includere l'ID sessione PHP nell'URL della richiesta stessa come variabile GET.Un esempio di URL potrebbe essere simile:

https://www.example.com/mypage.php?PHPSESSID=cteekbf64igp5vdjjkktvoeb97

Questo non è così sicuro come l'utilizzo di un cookie, perché l'URL potrebbe accidentalmente condivisa o rubato tramite altri mezzi.

La sicurezza è molti livelli, come una cipolla (come l'esempio comune va). Più fai qualcosa di sicuro, più lo sforzo è necessario per renderlo sicuro e meno è conveniente usarlo. È un compromesso costi-benefici. Quindi devi chiedere, quanto sono importanti i tuoi dati, la privacy e la sicurezza dei tuoi utenti, ecc.

Per me, un livello base sarebbe utilizzare le sessioni PHP con l'ID di sessione forzato per essere nei cookie (bloccare gli utenti che disabilita i cookie), la crittografia SSL sempre, sia sui dati che sui cookie, e assicurati che le varie impostazioni PHP che influiscono sulla sicurezza delle sessioni siano impostate sulle migliori e più sicure impostazioni. Ti consigliamo di leggere tutto in queste pagine e pagine figlio:

Problemi correlati