php - usuario - ¿Dónde poner password_verify en el script de inicio de sesión?
user login php mysql pdo (2)
Antes de
leer el código, tenga en cuenta que el bloque de
Fake Registration
no
estaría en su código, pero es necesario que se lo muestre de principio a fin.
<?php
session_start();
// Begin Vault
// credentials from a secure Vault, not hard-coded
$servername="localhost";
$dbname="login_system";
$username="dbUserName";
$password="dbPassword";
// End Vault
// The following two variables would come from your form, naturally
// as $_POST[]
$formEmail="[email protected]";
$ctPassword="¿^?fish╔&®)"; // clear text password
try {
#if(isset($_POST[''email''], $_POST[''password''])){
#require(''../../../private_html/db_connection/connection.php'');
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Begin Fake Registration
// fake it that user already had password set (from some registration insert routine)
// the registration routine had SSL/TLS, safely passing bound parameters.
$hp=password_hash($ctPassword,PASSWORD_DEFAULT); // hashed password, using
$conn->query("delete from user_accounts where email=''[email protected]''");
$conn->query("insert user_accounts(first_name,last_name,email,password) values (''joe'',''smith'',''[email protected]'',''$hp'')");
// we are done assuming we had a registration for somewhere in your system
// End Fake Registration
$query = $conn->prepare("SELECT * FROM user_accounts WHERE email=:email");
$query->bindParam('':email'', $formEmail);
$query->execute();
unset($_SESSION[''email'']);
unset($_SESSION[''first_name'']);
if(($row = $query->fetch()) && (password_verify($ctPassword,$row[''password'']))){
$_SESSION[''email''] = $row[''email''];
$_SESSION[''first_name''] = $row[''first_name''];
//header("Location: ../../myaccount/myaccount.php");
echo "hurray, you authenticated.<br/>";
}
else {
//header("Location:../../login/login.php ");
echo "invalid login<br/>";
}
#}
} catch (PDOException $e) {
echo ''Connection failed: '' . $e->getMessage();
exit();
}
?>
Salida del navegador:
hurra, te autenticaste.
Tenga en cuenta que la función
password_hash()
utiliza una sal aleatoria, como es evidente si la ejecuta varias veces, con la contraseña hash
cambiando
con la misma entrada de texto claro, como estas contraseñas hash:
$2y$10$KywNHrGiPaK9JaWvOrc8UORdT8UXe60I2Yvj86NGzdUH1uLITJv/q
$2y$10$vgJnAluvhfdwerIX3pAJ0u2UKi3J.pfvd0vIqAwL0Pjr/A0AVwatW
los cuales son el resultado de hashings posteriores, como se mencionó, de la misma contraseña de texto claro.
El
cost
salt
y hash se cuece en la contraseña hash y se guarda.
Todas estas llamadas se pueden leer en los enlaces a continuación.
Desde el Manual password_hash y password_verify .
Esquema
create table user_accounts
( id int auto_increment primary key,
first_name varchar(50) not null,
last_name varchar(50) not null,
email varchar(100) not null,
password varchar(255) not null
);
¡Otra noche, otra pregunta!
He creado una página de inicio de sesión que funciona bien si las contraseñas están en texto plano.
El problema que tengo es que mi formulario de registro usa password_hash para ingresar una contraseña cifrada en la tabla.
Mis scripts actuales están a continuación.
Script de registro
$password = password_hash($_POST[''password''], PASSWORD_DEFAULT);
Iniciar sesión Script
<?php
session_start();
if(isset($_POST[''email''], $_POST[''password''])){
require(''../../../private_html/db_connection/connection.php'');
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = $conn->prepare("SELECT * FROM user_accounts WHERE email=:email AND password=:password");
$query->bindParam('':email'', $_POST[''email'']);
$query->bindParam('':password'', $_POST[''password'']);
$query->execute();
if($row = $query->fetch()){
$_SESSION[''email''] = $row[''email''];
$_SESSION[''first_name''] = $row[''first_name''];
header("Location: ../../myaccount/myaccount.php");
}
else {header("Location:../../login/login.php ");}
}
?>
Tengo un par de preguntas sobre este:
-
¿Dónde pongo
password_verify
en mi script de inicio de sesión? -
En lugar de tener que escribir múltiples
$_SESSION[''xxx''] = $row[''xxx''];
para mostrar los detalles de los usuarios en la página ''Mi cuenta'', ¿cómo puedo utilizar$results = $stmt->fetch(PDO::FETCH_ASSOC);
método sobre el que he leído?
Muchas gracias de antemano,
CiriloWalrus
$query = $conn->prepare("SELECT * FROM user_accounts WHERE email=?");
$query->execute([$_POST[''email'']]);
if($row = $query->fetch() && password_verify($_POST[''password''], $row[''password''])){
$_SESSION[''user''] = $row;