当前位置: 首页 > 面试题库 >

在登录脚本中将password_verify放在哪里?

邬宏扬
2023-03-14
问题内容

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

我创建了一个登录页面,如果密码为纯文本形式,则可以正常运行。

我的问题是我的注册表单使用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);已阅读的方法

提前谢谢了,

西里尔·海象


问题答案:

*阅读代码 *之前 ,请记住,该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
);


 类似资料:
  • 我试图在CodeIgniter中实现登录实现,我在注册时对密码进行散列,就像 密码,但我无法理解。 如何根据电子邮件验证密码,并重定向到所需的视图,即,我通过AJAX调用发出请求。

  • 在我当前的Grails项目中,有一个场景需要在适当的位置将一些独立的可执行文件添加到文件中。这些文件不会在Grails项目内的任何地方使用,而是从Bash shell调用,以便将一些消息发送到消息传递队列(例如RabbitMQ)。

  • 我的密码\u散列有问题,当我登录时,我想让用户登录会话,但当我使用密码验证时不工作,回显不返回任何内容。我怎样才能解决这个问题?谢谢这是我的代码: 这个代码完美的工作时,我不使用password_verify。

  • 我有一个基本的Groovy脚本,我希望尽可能简单地创建日志。我希望消息转到标准输出,以及一个日志文件,日志文件中的每个条目都有一个时间戳。 我不能使用@Log符号,因为它是一个脚本,我没有要注入的类。否则我认为这将是理想的。

  • 我给出作为输入文件,一些方法将使用它,但是现在我的reader方法无法检测该文件。 我要将文件放置在哪个目录中....我是否必须在中制定任何maven规范,以检测文件是否存在,并且他们必须读取该文件。

  • ChatGPT登录入口在哪里?