corrispondenti ai nomi utente con la loro password

2

Stiamo lavorando su un semplice modulo di login / registrazione. Il nostro script di accesso controlla se il nome utente e la password esistono nella stessa riga del database. Se esiste, portiamo l'utente a una pagina di benvenuto.

Tuttavia, il nostro problema si trova quando controlliamo se la password esiste nel database perché abbiamo applicato la funzione password_hash () alla password inviata dall'utente. Questo metodo di crittografia è a senso unico e non reversibile (a mia conoscenza). Ecco il codice per lo script di accesso:

<?php 
//will correspond with 'loginLogin.html page
require("opendboLogin.php");
$user = $_POST['username'];
$password = $_POST['password'];

$stmt2 = $conn->stmt_init();
$stmt2 = $conn->prepare("SELECT * FROM login WHERE alogin = ? AND apassword = ?"); 
$stmt2->bind_param("ss", $user, $password);
$stmt2->execute();
$stmt2->store_result();
$numberofrows = $stmt2->num_rows; //this is an integer!!
$stmt2 -> close();

if($numberofrows > 0) //if username and password combination exists in a row 
{ 
    echo 'login successful!';
}
else
{
    echo 'Incorrect username and/or password, dumbass!';
}
?>

Stavo pensando che potremmo crittografare la password di nuovo all'interno di questo script e vedere se i due hash corrispondono, tuttavia la crittografia cambia ogni volta indipendentemente dal fatto che la stessa password esatta sia stata sottoposta a hash!

A partire da ora la combinazione username / password non esisterà mai e colpirà sempre l'ultima istruzione "else". Qualche idea su come verificare la combinazione nome utente / password corretta?

    
posta Nicholas Roberts 19.08.2015 - 00:27
fonte

2 risposte

8

Tenta di recuperare il record utente in base al nome utente (ma usa LIKE anziché = in modo che il caso non abbia importanza. I nomi utente non dovrebbero essere case sensitive.

Se sei riuscito a recuperare un record utente (quindi l'utente esiste) e puoi confrontare le password per convalidare il login.

Informazioni sulla sicurezza della password

Memorizza le password utilizzando una funzione come password_hash () in modo che siano molto più sicuro di essere memorizzato in testo semplice (un enorme no-no). Questo genererà ogni volta un sale unico quindi sì, l'hash sarà diverso ogni volta. Non preoccuparti per questo.

Per convalidare la password che l'utente sta effettuando l'accesso con la password memorizzata, utilizzare password_verify ( e passa la password che hanno postato e l'hash memorizzato dal database. La funzione si prenderà cura del sale e del confronto. Questa è la funzione che penso possa esserti perso durante la lettura dell'hash di password.

Bonus

Dopo aver effettuato correttamente l'accesso, è necessario verificare se la password ha bisogno di re-hash (nel tempo il "costo" degli algoritmi viene aggiornato). Passa semplicemente l'hash memorizzato a password_needs_rehash () per vedere se dovresti re-hash e ri-salva la password.

    
risposta data 19.08.2015 - 01:03
fonte
2

Normalmente cercherò semplicemente nella tabella il record che contiene il nome utente corrispondente. Se quel record non esiste l'utente non esiste quindi non c'è bisogno di andare oltre.

Se il record esiste, quel record avrebbe l'hash della password su quell'utente. Prendi la password fornita dall'utente, cancellala nello stesso modo, confronta con l'hash nel tuo record.

    
risposta data 19.08.2015 - 00:34
fonte

Leggi altre domande sui tag