복붙노트

로그인 스크립트에 password_verify를 넣을 위치는 어디입니까?

PHP

로그인 스크립트에 password_verify를 넣을 위치는 어디입니까?

또 다른 밤, 또 다른 질문!

암호가 일반 텍스트 인 경우 잘 작동하는 로그인 페이지를 만들었습니다.

내가 가진 문제는 내 가입 양식이 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 ");}
    }

?>

이 질문에 대한 몇 가지 질문이 있습니다.

미리 감사드립니다.

CyrilWalrus

해결법

  1. ==============================

    1.코드를 읽기 전에 위조 등록 블록이 코드에 없지만이 코드를 철저하게 보여줄 필요가 있음을 명심하십시오.

    코드를 읽기 전에 위조 등록 블록이 코드에 없지만이 코드를 철저하게 보여줄 필요가 있음을 명심하십시오.

    <?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
    

    두 가지 모두 동일한 텍스트 암호에 대한 후속 해싱의 결과입니다. 소금 및 해시 비용은 해시 된 암호로 구워지고 저장됩니다. 이 전화는 아래의 링크에서 모두 읽으십시오.

    Manual 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
    );
    
  2. ==============================

    2.

    $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;
    
  3. from https://stackoverflow.com/questions/32554085/where-to-put-password-verify-in-login-script by cc-by-sa and MIT license