Originariamente inviata da
Shores
(Solo per segnalarti alcuni refusi/potenziali problemi del tutorial, peraltro molto ben fatto:
1) Hai un problema di codifica caratteri, le lettere accentate nel codice sono guaste.
La codifica dei file è utf8, dovresti aprirli con questa codifica.
2) Nelle form, nel caso in cui un input abbia un name = id, allora la name puo' essere omessa.
In realtà l'id l'avevo messo perché inizialmente il form aveva il tag label, poi l'ho rimosso preferendogli l'attributo placeholder.
3) In fase di connessione al db, attenzione al fatto che $e->getMessage() potrebbe mostrare informazioni riservate
Giusto.
4) Gli script php di registrazione/login danno per assunto che nessuno stia tentando di farli andare in crash, ma sarebbe meglio che non contassero sul fatto che se e' definito _POST["register"/"login"] lo siano anche _POST["username"/"password"]...
Giusto, ho dimenticato un check con isset() su username e password prima di utilizzarli in empty().
5) Meglio evitare di richiedere uno specifico algoritmo di hash a password_hash: se non si indica, la versione di php in uso scegliera' sempre quello piu' forte a disposizione in quella versione, rimanendo comunque in grado di effettuare password_verify anche sugli hash fatti con altri algoritmi e gia' salvati in db.
OK
6) Attenzione ad usare history.back() come link per tornare alla maschera, puo' essere facilmente manipolato; molto meglio un link esplicito a login.html/register.html
Giusto. L'ho usato per comodità, di solito redireziono l'utente alla pagina referente impostando un messaggio flash in una variabile di sessione.
7) Attenzione anche al messaggio "Utente gia' in uso": capisco la necessità di indicare l'errore all'utente, ma bisognerebbe allora proteggersi da hammering sulla form di registrazione.
Giusto.
8) Usare session_destroy per eliminare il login e' corretto, ma distrugge tutta la sessione: se nella sessione sono stati memorizzati dati che non necessitavano di un login, come per esempio il contenuto di un carrello acquisti (mai pretendere che per mettere prodotti nel carrello sia necessario fare login, e quindi mai vuotare il carrello se non per diretta richiesta dell'utente) andrebbero persi.
Ok, diciamo che si potrebbe omettere e fare solo l'unset delle variabili che interessano, ma per lo scopo del tutorial è ok.
9) In effetti, io comunque porrei dei limiti su cid' che pud' essere usato come username o password: sebbene il tuo codice usando le Prepared sia abbastanza sicuro, io non vorrei comunque trovarmi in db degli utenti come "; DROP TABLE users"!
Per lo username sono daccordo (lo aggiungo nelle conclusioni assieme agli altri suggerimenti), per le password a mio parere non serve in quanto andrà salvato l'hash. Si può aggiungere un controllo sulla robustezza della password. Al momento c'è solo quello sulla lunghezza.
)