Tengo un problema al intentar iniciar sesión usando el hash guardado de mi base de datos, guardo mi contraseña de la siguiente manera, que funciona bien:
adduser($conn, '3', $username, $password);Esto llama a la siguiente función:
function adduser ($conn, $level, $username, $password) { $password = mysqli_real_escape_string($conn, $password); $password = mysqli_real_escape_string($conn, $username); $password = password_hash($password, PASSWORD_BCRYPT); $user = "INSERT INTO users (level, username, password) VALUES ('$level', '$username', '$password')"; mysqli_query($conn, $user) or die (mysqli_error($conn)); } Mi campo de contraseña es un CHAR(60) , por lo que el hash de contraseña almacenado debe tener el tamaño correcto.
Cuando intento iniciar sesión, llamo a esta función:
if (login($conn, $username, $password) === true){ }Que existe aquí:
function login ($conn, $username, $password) { $password = mysqli_real_escape_string($conn, $password); $username = mysqli_real_escape_string($conn, $username); $query = "SELECT password FROM `users` WHERE username='$username'"; $result = mysqli_query($conn, $query) or die(mysqli_error($conn)); $row = mysqli_fetch_array($result, MYSQLI_ASSOC); $hash = $row["password"]; $verify = password_verify($password, $hash); if ($verify) { return true; } else { return false; } }Mi problema es que nunca devuelve verdadero o falso, lo que me impide iniciar sesión...
Extra: se publica con éxito en la base de datos
También intenté ejecutar esto, que publicó con éxito los datos de mi base de datos.
$query = "SELECT password FROM `users` WHERE username='$username'"; $result = mysqli_query($conn, $query) or die(mysqli_error($conn)); $row = mysqli_fetch_array($result, MYSQLI_ASSOC); echo $row["password"];Actualizar
Haciendo esto:
echo '<br/>'; echo $hash; echo '<br/>'; echo $password;Me da la siguiente salida:
$2y$10$OfJhVve4GMZRfjfelb8sNOJ7EN5NAAGOmsN6OS/SC7PZGU5mDNOou hejQue coincide con la contraseña en mi base de datos
$2y$10$OfJhVve4GMZRfjfelb8sNOJ7EN5NAAGOmsN6OS/SC7PZGU5mDNOouDespués de probar todo su código, he llegado a la siguiente conclusión.
El problema aquí es que está escapando de la contraseña mientras la inserta en su base de datos, que es algo que planteé en los comentarios desde el principio.
"nota al margen: no debe escapar de una función de contraseña/hash, las contraseñas como
123'\abc<son perfectamente válidas y se modificarán al insertarlas".
$password = mysqli_real_escape_string($conn, $username);Nota al margen para ^: consulte la edición n. ° 2 a continuación, cerca de "Sin embargo..." :
Simplemente no lo use, solo mantenga/utilice la tarea normalmente.
Tanto password_hash() como password_verify() hacen su trabajo, por lo que no es necesario escapar de las contraseñas.
Deberá eliminarlo del código que usó para insertarlo en la base de datos y comenzar de nuevo con un nuevo conjunto de hashes.
Es muy probable que esa función de escape agregue un carácter durante la inserción.
Nota al margen: solo para que conste, mi columna de contraseña es VARCHAR , pero eso no debería ser una diferencia con su CHAR (Editar: consulte la nota al pie). Si es así, ALTERA tu columna para que sea VARCHAR .
Sin embargo, el manual sobre password_hash() sugiere usar 255 para una longitud, siendo una buena apuesta.
Editar nota al pie:
Según un comentario que publiqué debajo de mi respuesta.
Parece tener una diferencia. Estas preguntas y respuestas ¿Cuál es la diferencia entre VARCHAR y CHAR? lo muestra, según la respuesta aceptada
VARCHAR es de longitud variable.
CHAR es de longitud fija.
Editar #2:
Después de más pruebas para ver si hizo una diferencia ALTERANDO la columna de contraseña de VARCHAR(255) a CHAR(60) hizo una diferencia; no lo hizo.
Pruebas realizadas:
TRUE .FALSE . Por lo tanto y como dije originalmente; la falla radica en el uso de mysqli_real_escape_string() .
Sin embargo, y repasando su código nuevamente, esta línea:
$password = mysqli_real_escape_string($conn, $username); Estaba usando la variable $username aquí que también explica el valor incorrecto que se inserta en la base de datos. Todos estos juntos fueron los problemas desde el principio.