在登录脚本中放置password_verify的位置?

Cyr*_*rus 5 php session pdo login-script password-encryption

另一个晚上,另一个问题!

我创建了一个登录页面,如果密码是纯文本,它可以正常工作.

我遇到的问题是我的注册表单使用password_hash为表输入加密密码.

我目前的脚本如下.

注册脚本

$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
Run Code Online (Sandbox Code Playgroud)

登录脚本

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

?>
Run Code Online (Sandbox Code Playgroud)

我对这个有几个问题:

  1. 我password_verify在哪里放入登录脚本?
  2. $_SESSION['xxx'] = $row['xxx'];在"我的帐户"页面上不必输入多个来显示用户详细信息,如何使用$results = $stmt->fetch(PDO::FETCH_ASSOC);我读过的方法?

提前谢谢了,

CyrilWalrus

Dre*_*rew 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();
    }
?>
Run Code Online (Sandbox Code Playgroud)

浏览器输出:

欢呼,你认证了.

注意,该password_hash()函数使用随机盐,如果你多次运行它就很明显,散列密码会改变相同的clearText输入,例如这些散列密码:

$2y$10$KywNHrGiPaK9JaWvOrc8UORdT8UXe60I2Yvj86NGzdUH1uLITJv/q

$2y$10$vgJnAluvhfdwerIX3pAJ0u2UKi3J.pfvd0vIqAwL0Pjr/A0AVwatW
Run Code Online (Sandbox Code Playgroud)

如上所述,这两者都是相同明文密码的后续散列的结果.在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
);
Run Code Online (Sandbox Code Playgroud)

  • 我可以想知道是谁给了你那个downvote.你的竞争对手也许会这样?或许从未对此发表评论的人呢?因为害怕被击落也许?无论如何,你得到了我的upvote. (2认同)