validar usuario sistema postgres mvc hacer contraseña con como bootstrap php session pdo password-encryption login-script

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:

  1. ¿Dónde pongo password_verify en mi script de inicio de sesión?
  2. 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;