Где поставить password_verify в сценарии входа?

php session pdo password-encryption login-script

2096 просмотра

2 ответа

Еще одна ночь, другой вопрос!

Я создал страницу входа в систему, которая отлично работает, если пароли в текстовом виде.

У меня проблема в том, что моя форма регистрации использует password_hash для ввода зашифрованного пароля в таблицу.

Мои текущие сценарии ниже.

Сценарий регистрации

$password = password_hash($_POST['password'], PASSWORD_DEFAULT);

Вход в скрипт

<?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 ");}
    }

?>

У меня есть пара вопросов по этому вопросу:

  1. Где я могу поставить password_verifyсвой сценарий входа?
  2. Вместо того, чтобы вводить несколько символов $_SESSION['xxx'] = $row['xxx'];для отображения сведений о пользователе на странице «Моя учетная запись», как я могу использовать $results = $stmt->fetch(PDO::FETCH_ASSOC);метод, о котором я читал?

Спасибо заранее,

CyrilWalrus

Автор: CyrilWalrus Источник Размещён: 12.11.2019 09:41

Ответы (2)


12 плюса

Решение

Прежде чем читать код, имейте в виду, что Fake Registrationблок не будет в вашем коде, но это необходимо показать вам сквозным образом.

<?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="jsmith123@gmail.com";
    $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='jsmith123@gmail.com'");
             $conn->query("insert user_accounts(first_name,last_name,email,password) values ('joe','smith','jsmith123@gmail.com','$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();
    }
?>

Вывод браузера:

ура, вы подтвердили подлинность

Обратите внимание, что password_hash()функция использует случайную соль, как очевидно, если вы запускаете ее несколько раз, когда хешированный пароль изменяется с тем же вводом clearText, как эти хешированные пароли:

$2y$10$KywNHrGiPaK9JaWvOrc8UORdT8UXe60I2Yvj86NGzdUH1uLITJv/q

$2y$10$vgJnAluvhfdwerIX3pAJ0u2UKi3J.pfvd0vIqAwL0Pjr/A0AVwatW

оба они являются результатом последующих хэширования одного и того же открытого текста пароля. saltИ хэш costвыпекают в хэшированном пароль и сохранен. Все эти вызовы читайте в ссылках ниже.

Из Руководства password_hash и password_verify .

схема

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
);
Автор: Drew Размещён: 14.09.2015 12:56

-3 плюса

$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;
Автор: Your Common Sense Размещён: 13.09.2015 08:18
Вопросы из категории :
32x32