Come creare un sistema di accesso sicuro con i cookie? [chiuso]

2

Per la mia educazione personale, sto cercando di creare un sistema di accesso sicuro usando i cookie. Ho letto molti articoli e domande Stack Overflow su come ottenerlo, ma non ho trovato nulla di utile. Ognuno suggerisce diversi modi per raggiungere questo obiettivo, ma quelli che sembrano ragionevoli e sanno quello che stanno facendo, non riesco a capirlo per qualche motivo.

Puoi spiegarmi, qual è il modo migliore per creare un sistema di accesso sicuro con i cookie?

Ho sentito dire che l'approccio migliore sono i token. Ma alcuni dicono che dovresti aggiungere un token accanto all'id utente nella tabella dei token nel database - e quindi cosa succede se una persona accede da dispositivi diversi? Alcuni dicono che dovresti tenere traccia degli indirizzi IP per questo - e quindi cosa succede se una persona accede da un altro IP? Alcuni dicono che dovresti creare una sessione e un cookie, ma qual è il punto della sessione (se il cookie autentica una persona) ...

Ho visto molte domande in cui le persone facevano domande simili e, nelle risposte, le persone cercavano di spiegare qual è la differenza tra i cookie e le sessioni. Conosco tutte le differenze e tutta la teoria. Non riesco a capire la tecnica per rendere tutto al sicuro.

Non riesco a capire chiaramente come dovrebbe funzionare logicamente quel sistema, quindi puoi spiegarlo passo passo a me?

    
posta Tack 09.12.2015 - 05:45
fonte

2 risposte

3

In PHP, creare una sessione è facile. Per prima cosa dichiaralo usando session_start() . Gestisce la creazione di un cookie di sessione per te e praticamente tutte le cose difficili. Quando l'utente naviga nel tuo sito, puoi leggere e scrivere sulle variabili di sessione utilizzando l'oggetto globale $_SESSION , che può influire sul contenuto che desideri visualizzare all'utente e persino su come viene visualizzato.

Ciò che accade è che il server genera un token casuale sicuro sul suo lato e quindi invia il valore come cookie al client che il client comunica automaticamente al server su ogni richiesta. Il server prende questo valore e lo utilizza per determinare quale oggetto in memoria deve fare riferimento come oggetto $_SESSION .

Comunque vuoi gestire l'accesso iniziale dipende da te - non ho intenzione di approfondirlo qui. Ma una volta che l'utente effettua il login, vuoi indicarlo in $_SESSION globale. Per renderlo sicuro, dovrai distruggere qualsiasi sessione esistente e crearne una nuova sull'autenticazione. Il modo in cui di solito lo faccio è che ho impostato $_SESSION['user'] all'accesso (dopo aver distrutto la sessione precedente e averne creata una nuova). In questo modo ha un altro uso, controllando se un utente è loggato: if(isset($_SESSION['user'])) .

Questa è una funzionalità di base, ma si spera che punti nella giusta direzione. I database non sono necessari per le sessioni a meno che non si stia tentando di implementare le politiche di accesso / sessione o si sta eseguendo il sito Web in un cluster. Ciò sarebbe dovuto a una discussione più complicata, che non credo sarebbe opportuno entrare qui.

Modifica / Aggiornamento :

Si scopre che in effetti entrerò nello specifico di un sistema di accesso sicuro; Se si desidera che il proprio sistema di accesso sia conforme agli standard in termini di sicurezza, sarà necessario eseguire correttamente l'hash (e il sale) della propria password. Risulta che esiste un metodo PHP per questo bene .

L'hashing trasforma praticamente tutto ciò che l'input è nella spazzatura che non può essere reinserito nell'input originale. L'hashing della password viene utilizzato per impedire alle persone di accedere alla password originale nel caso di un compromesso server / database in cui le password possono essere trapelate potenzialmente. La cosa più importante da sapere quando l'hashing è che gli algoritmi più lenti funzionano meglio per le password.

La salatura è quasi altrettanto importante dell'algoritmo utilizzato per proteggere le password. Il sale è un CSPRNG che viene semplicemente aggiunto alla password prima dell'hashing. CSPRNG è l'acronimo di Pseudo Random Number Generator crittograficamente sicuro, ed è davvero solo un modo elegante per dire che si tratta di un insieme di byte super casuali e imprevedibili. Questi byte sono generati casualmente su una base per password per proteggere gli utenti finali dagli attacchi rainbow, in cui un singolo hash prodotto può essere controllato su grandi quantità di password. Richiedendo un singolo hash per tentativo per password, riduce notevolmente le possibilità di perdere una perdita di password risultante da una perdita di hash di massa.

Un sistema manuale funzionerebbe come segue:

Quando viene creato l'account utente, una riga viene inserita nel database "utenti" con il nome utente specificato e la password con hash. La password hash viene prima salata (dati casuali aggiunti alla password), quindi hash con un algoritmo di hashing della password lenta. Il sale viene inoltre aggiunto all'hash della password prima di essere inserito nel database. Opzionalmente è possibile memorizzare qualcosa per identificare l'algoritmo di hash utilizzato con esso come bene. Se ti senti a disagio nel combinare questi valori, puoi anche memorizzarli come valori separati del database.

Quando viene avviata la procedura di accesso, il database viene interrogato nella tabella "utenti" per la riga con la chiave "nome utente" corrispondente al nome utente richiesto. Quella fila è tirata che include l'hash della password. Innanzitutto, il sale viene portato via dall'hash. Quindi il sale viene aggiunto alla password fornita durante l'autenticazione e l'intera cosa viene sottoposta a hash utilizzando lo stesso algoritmo di hashing utilizzato in origine. Quindi, se il risultato finale corrisponde all'hash che è stato memorizzato, l'utente può essere autenticato con successo.

Spero di non confondervi troppo con le mie spiegazioni. A quanto pare, Ashley Madison ha perso completamente il memo, quindi se non capisci, non sentirti male. Non sei un sito web da molti milioni di dollari. La maggior parte dei problemi viene da quando le persone si assumono la responsabilità di portare a termine le cose al di là delle loro competenze. A tale proposito, raccomando di utilizzare le funzioni di hashing della password predefinite, o almeno open source e pubblicamente raccomandate, laddove possibile. Prendono tutte le congetture dall'equazione.

    
risposta data 09.12.2015 - 09:41
fonte
-8

Quello che faccio è md5 aver cancellato la password, quindi salvarla per proteggerla dalle tabelle arcobaleno e memorizzare due cookie sul computer dell'utente. Uno con l'ID utente e l'altro con la password salata. Per proteggere contro la forza bruta, registro i tentativi di accesso non riusciti, quindi se qualcuno cambia il cookie della password con qualcosa di sbagliato, viene registrato. 100 tentativi errati indicano che la persona non può accedere nuovamente a quell'account per 24 ore.

Rendo diverso il sale per ogni utente, quindi la password x darà un risultato diverso nella riga 1 rispetto alla riga 2. Se qualcuno controlla i cookie, non sarà in grado di capire il tuo nome utente, email o password.

Facendo ricerche adeguate, ho scoperto che questo è un modo sicuro per eseguire un sistema di autenticazione. Altri siti Web rendono più complicato il fatto che il cookie sia una stringa casuale, ma tale stringa deve essere verificata rispetto al database anche se quella stringa casuale non è in alcun punto nel database, quindi viene utilizzato un algoritmo per convertire il database dell'utente registrato fila in una stringa casuale per autenticarli.

    
risposta data 09.12.2015 - 14:55
fonte

Leggi altre domande sui tag