Mysql
 sql >> Database >  >> RDS >> Mysql

PHP e MySQL confrontano la password

Vedo che stai memorizzando un hash della password nel database, ma a beneficio di altri lettori, mai memorizzare le password in testo normale nel database. Non vuoi essere come Monster.com.uk !

Dovresti usare una funzione di hashing più potente di MD5() . Idealmente dovresti usare SHA256. Questo metodo hash è disponibile in PHP utilizzando hash() funzione.

Dovresti anche applicare un sale casuale alla password. Memorizza un valore salt diverso per l'account di ciascun utente. Questo aiuta a sconfiggere gli attacchi del dizionario e tavolo arcobaleno attacchi.

Dovresti imparare a usare mysqli extension invece della vecchia estensione mysql. Mysqli supporta le query con parametri, quindi puoi ridurre la vulnerabilità ad alcuni attacchi di SQL injection.

Ecco un codice di esempio. Non l'ho testato, ma dovrebbe essere abbastanza vicino a funzionare:

$input_login = $_POST['login'];
$input_password = $_POST['password'];

$stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?");
$stmt->bind_param("s", $input_login);
$stmt->execute();
$stmt->bind_result($password_hash, $salt);

while ($stmt->fetch()) {
  $input_password_hash = hash('sha256', $input_password . $salt);
  if ($input_password_hash == $password_hash) {
    return true;
  }
  // You may want to log failed password attempts here,
  // for security auditing or to lock an account with
  // too many attempts within a short time.
}
$stmt->close();

// No rows matched $input_login, or else password did not match
return false;

Alcune altre persone suggeriscono che la query dovrebbe verificare login = ? AND password = ? ma non mi piace farlo. Se lo fai, non puoi sapere se la ricerca non è riuscita perché l'accesso non esisteva o perché l'utente ha fornito una password errata.

Ovviamente non dovresti rivelare all'utente che ha causato il tentativo di accesso fallito, ma tu potrebbe essere necessario saperlo, in modo da poter registrare attività sospette.

@Javier dice nella sua risposta che non dovresti recuperare la password (o l'hash della password in questo caso) dal database. Non sono d'accordo.

Javier mostra la chiamata a md5() nel codice PHP e inviando la stringa hash risultante al database. Ma questo non supporta il salting della password facilmente. Devi eseguire una query separata per recuperare il sale di questo utente prima di poter eseguire l'hash in PHP.

L'alternativa è inviare il testo in chiaro password sulla rete dall'app PHP al server del database. Chiunque intercetta la tua rete può vedere questa password. Se si registrano query SQL, chiunque acceda ai registri può vedere la password. Gli hacker motivati ​​possono anche tuffarsi nei cassonetti per trovare vecchi supporti di backup del filesystem e potrebbero leggere i file di registro in questo modo!

Il rischio minore è recuperare la stringa hash della password dal database nell'app PHP, confrontarla con l'hash dell'input dell'utente (anche nel codice PHP) e quindi scartare queste variabili.