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.