Sistema di accesso che utilizza token per l'autenticazione

2

Sto creando un sistema di accesso per un sito Web che sto costruendo. Ecco come lo sto facendo al momento.

  1. Utilizza HTTPS in tutto
  2. Cripta le password usando la funzione password_hash () di PHP.
  3. Genera un nuovo token ed elimina quello vecchio ad ogni nuovo accesso.
  4. Accedi utente utilizzando un cookie, memorizzando il token utente
  5. Controlla il cookie su ogni pagina caricata rispetto a una versione con hash SHA1 del token memorizzato nel cookie.
  6. Se il token viene eliminato dal database, l'utente viene disconnesso.

Questo è sicuro? C'è qualcos'altro che dovrei fare?

    
posta Francis 01.09.2016 - 16:06
fonte

2 risposte

1

Supponiamo che tu stia generando il token con sufficiente entropia e non usi il rand() predefinito. Supponiamo anche che tu esegua PHP 5.5.0 o successivo che supporti bcrypt (), quindi i miei complimenti.

Non mi è del tutto chiaro cosa debba fare o proteggere SHA1. Non fornirà sicurezza o confidenzialmente perché chiunque potrebbe hash il token con SHA1. Ad un certo punto convalida integrity , ma per cosa? Memorizzare il token nel database senza alcuna offuscazione fa esattamente la stessa cosa.

Se i tuoi token sono validi per un periodo di tempo più lungo, diciamo più di qualche ora, ti suggerirei:

  • Utilizza i token di aggiornamento, quindi puoi revocare i token dai client molto più rapidamente.
  • Firma i token al momento della creazione e convalida la firma su ogni richiesta. Questo confermerà integrità e autenticità.

Come ultimo suggerimento, non dare mai per scontato che SSL / TLS sia il Santo Graal, ma usa la difesa in profondità.

    
risposta data 01.09.2016 - 17:07
fonte
0
  • Use HTTPS throughout

Fin qui tutto bene.

  • Encrypt passwords using PHP's password_hash() function.

Hai effettivamente bisogno che il tuo utente tenga traccia di ancora un altro utente / password ? Non puoi usare la loro patente di guida di internet ?

Detto questo, supponendo che tu non possa o meno, assicurati di usare un buon salt e una versione di php che usi bcrypt (credo sia predefinito dal 5.0).

  • Generate a new token and delete the old one on every new login.
  • Login user using a cookie, storing the users token
  • Check cookie on each page load against a SHA1 hashed version of the token stored in the cookie.
  • If the token is deleted from the database the user is logged out.

Presumo che tu abbia una scadenza per i token e che siano eliminati da un back-end. Cosa succede se l'utente è attualmente connesso e il backend rileva il token scaduto?

Ci sono molte altre cose da considerare.

CSRF

Fai attenzione con CSRF sui tuoi moduli di login e logout. Non vuoi che i tuoi utenti vengano automaticamente disconnessi da terze parti.

In realtà, fai attenzione con CSRF in tutto il sito.

bruteforcing

Implementa misure bruteforce sul modulo di accesso e su qualsiasi back-end a cui comunica:

  • Aumento del ritardo per tentativi di accesso falliti
  • Captcha obbligatori dopo una soglia di tentativi
  • Blocco temporaneo per indirizzo IP dopo una soglia di tentativi

Monitora ciascuna di queste misure, assicurati che non causino problemi ai tuoi utenti.

Meccanismi di recupero password

In che modo i tuoi utenti recupereranno le password dimenticate?

Assicurati che il tuo meccanismo sia sicuro e non perdite le informazioni personali dei tuoi utenti.

Perdita di informazioni

Assicurati di non perdere informazioni sui tentativi di accesso falliti. Un messaggio di errore come questo:

Invalid user

Fornisce informazioni preziose agli aggressori (possono sapere se esiste o meno un nome utente).

Non è sufficiente avere un messaggio di errore generico. Questo è molto più sfumato di quanto sembri a prima vista: se impieghi 2 secondi per rispondere alle password sbagliate ma solo 100 millisecondi per i nomi utente errati stai perdendo informazioni.

Vedi CVE 2006-5229 per un buon esempio di questo ultimo attacco.

Facilità d'uso

Security at the expense of usability comes at the expense of security

Utilizza nomi di campi standard per nome utente / password in modo che gli utenti possano utilizzare comodamente un gestore di password se lo desiderano.

OWASP

Per ulteriori dettagli, leggi i documenti OWASP sull'autenticazione .

OWASP è un must per tutti gli sviluppatori web.

    
risposta data 03.09.2016 - 02:38
fonte

Leggi altre domande sui tag