Использование пароля для существующего пароля

Я пытаюсь проверить пароль и имя пользователя, прежде чем они войдут на мой сайт. Все пароли хранятся в password_hash($password1, PASSWORD_BCRYPT); Я не уверен, что я делаю неправильно. На данный момент, независимо от того, что я набираю, он всегда говорит «Неправильно».

 <?php require 'privstuff/dbinfo.php'; $username = $_POST["username"]; $password1 = $_POST["password1"]; $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE); if(mysqli_connect_errno()) { echo "Connection Failed. Please send an email to owner@othertxt.com regarding this problem."; exit(); } if ($stmt = $mysqli->prepare("SELECT `username`, `password` FROM `accounts` WHERE username = ? AND password = ?")) { $result = mysqli_query($mysqli,"SELECT `password` FROM `accounts` WHERE username = $username"); $stmt->bind_param("ss", $username, password_verify($password1, $result); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows) { echo("Success"); } else { echo("Incorrect"); } } $mysqli->close(); ?> 

Это register.php

 <?php require 'privstuff/dbinfo.php'; $firstname = $_POST["firstname"]; $password1 = $_POST["password1"]; $email = $_POST["email"]; $ip = $_SERVER['REMOTE_ADDR']; $username = $_POST["username"]; $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE); if(mysqli_connect_errno()) { echo "Connection Failed. Please send an email to owner@othertxt.com regarding this problem."; exit(); } if ($stmt = $mysqli->prepare("INSERT INTO `accounts`(`firstname`, `username`, `password`, `email`, `ip`) VALUES (?,?,?,?,?)")) { $db_pw = password_hash($password1, PASSWORD_BCRYPT); $stmt->bind_param("sssss", $firstname, $username, $db_pw, $email, $ip); $stmt->execute(); if ($stmt->affected_rows > 0) { echo "Account successfuly created"; } $stmt->close(); } $stmt->close(); $mysqli->close(); ?> 

Related of "Использование пароля для существующего пароля"

Я исправил проблему. Я неправильно использовал password_verify .

 <?php require 'privstuff/dbinfo.php'; $username = $_POST["username"]; $password1 = $_POST["password1"]; $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE); // Check connection if(mysqli_connect_errno()) { echo "Connection Failed: " . mysqli_connect_errno(); exit(); } /* create a prepared statement */ if ($stmt = $mysqli->prepare("SELECT `password` FROM `accounts` WHERE username = ?")) { /* Bind parameters: s - string, b - blob, i - int, etc */ $stmt -> bind_param("s", $username); /* Execute it */ $stmt -> execute(); /* Bind results */ $stmt -> bind_result($result); /* Fetch the value */ $stmt -> fetch(); /* Close statement */ $stmt -> close(); } if(password_verify($password1, $result)) { session_start(); $_SESSION['loggedin'] = true; $_SESSION['username'] = $username; echo '<script type="text/javascript"> window.open("textbomber.php","_self");</script>'; }else{ echo '<script type="text/javascript"> alert("Incorrect Username/Password"); window.open("login.html","_self");</script>'; } $mysqli->close(); ?> 

Эту проблему нужно решать по-разному. Выполните только один запрос и получите пароль-хэш заданным именем пользователя. Затем проверка должна выполняться в коде, а не во втором запросе:

 // Check if the hash of the entered login password, matches the stored hash. // The salt and the cost factor will be extracted from $existingHashFromDb. $isPasswordCorrect = password_verify($password, $existingHashFromDb); 

Эта функция вернет true или false, в зависимости от того, совпадает ли пароль с сохраненным паролем-хешем. Вы не можете сравнивать хэши-пароли непосредственно в SQL-запросе из-за случайной соли, добавленной к каждому паролю.