Non dovresti mai scappare, tagliare o utilizzare qualsiasi altro meccanismo di pulizia sulle password che eseguirai l'hashing con PHP password_hash()
per una serie di motivi, il più grande dei quali è perché la pulizia aggiuntiva della password richiede codice aggiuntivo non necessario.
Sosterrai (e lo vedi in ogni post in cui i dati dell'utente sono accettati per l'uso nei tuoi sistemi) che dovremmo ripulire tutti gli input degli utenti e faresti bene a ogni altra informazione che accettiamo dai nostri utenti. Le password sono diverse. Le password con hash non possono rappresentare una minaccia di SQL injection perché la stringa viene trasformata in hash prima dell'archiviazione nel database.
L'atto di hashing di una password è l'atto di rendere la password sicura da archiviare nel database. La funzione hash non dà un significato speciale a nessun byte, quindi non è richiesta alcuna pulizia del suo input per motivi di sicurezza
Se segui i mantra di consentire agli utenti di utilizzare le password / frasi che desiderano e non limiti le password , consentendo qualsiasi lunghezza, qualsiasi numero di spazi e qualsiasi carattere speciale hashing renderà la password / passphrase sicura indipendentemente da ciò che è contenuto all'interno la password. A partire da ora l'hash più comune (l'impostazione predefinita), PASSWORD_BCRYPT
trasforma la password in una stringa di 60 caratteri contenente un salt casuale insieme alle informazioni sulla password con hash e un costo (il costo algoritmico di creazione dell'hash):
PASSWORD_BCRYPT viene utilizzato per creare nuovi hash delle password utilizzando l'algoritmo CRYPT_BLOWFISH. Ciò risulterà sempre in un hash utilizzando il formato crypt "$ 2y $", che è sempre largo 60 caratteri.
I requisiti di spazio per l'archiviazione dell'hash sono soggetti a modifiche in quanto vengono aggiunti diversi metodi di hashing alla funzione, quindi è sempre meglio aumentare il tipo di colonna per l'hash archiviato, come VARCHAR(255)
o TEXT
.
Potresti usare una query SQL completa come password e verrebbe sottoposta ad hashing, rendendola ineseguibile dal motore SQL, ad es.
SELECT * FROM `users`;
Potrebbe essere sottoposto a hashing $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G
Vediamo come i diversi metodi di sanificazione influenzano la password:
La password è I'm a "dessert topping" & a <floor wax>!
(Ci sono 5 spazi alla fine della password che non vengono visualizzati qui.)
Quando applichiamo i seguenti metodi di rifilatura otteniamo risultati incredibilmente diversi:
var_dump(trim($_POST['upassword']));
var_dump(htmlentities($_POST['upassword']));
var_dump(htmlspecialchars($_POST['upassword']));
var_dump(addslashes($_POST['upassword']));
var_dump(strip_tags($_POST['upassword']));
Risultati:
string(40) "I'm a "dessert topping" & a <floor wax>!" // spaces at the end are missing
string(65) "I'm a "dessert topping" & a <floor wax>! " // double quotes, ampersand and braces have been changed
string(65) "I'm a "dessert topping" & a <floor wax>! " // same here
string(48) "I\'m a \"dessert topping\" & a <floor wax>! " // escape characters have been added
string(34) "I'm a "dessert topping" & a ! " // looks like we have something missing
Cosa succede quando li inviamo a password_hash()
? Vengono tutti sottoposti ad hashing, proprio come la query precedente. Il problema si presenta quando si tenta di verificare la password. Se utilizziamo uno o più di questi metodi, dobbiamo riutilizzarli prima di confrontarli con password_verify()
. Quanto segue fallirà:
password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query
Dovresti eseguire la password pubblicata attraverso il metodo di pulizia che hai scelto prima di utilizzare il risultato di quella nella verifica della password. È una serie di passaggi non necessari e non migliorerà l'hashish.
Usi una versione PHP inferiore alla 5.5? Puoi usare il password_hash()
pacchetto di compatibilità .
Non dovresti davvero usare gli hash delle password MD5 .