【解決方法】データベースに保存されているハッシュ化されたパスワードを確認します。


データベースでハッシュされたユーザーパスワードがあります。 password_verify メソッドを使用して、ユーザーがデータベースに保存されているものに入力したパスワードを確認したい。 ただし、正しいパスワードを入力すると、コーディングが「失敗」し続けます。 最後に、コードがデータベースからデータをフェッチしない理由がわかりません。

私が試したこと:

PHP
<pre>
<?php
require_once 'includes/connection.php';
require_once 'includes/filter.php';
require_once 'includes/header.php';

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  $email;
  $password;

  if (empty($_POST['email']) || empty($_POST['password'])) {
    echo "<span>All fileds are required</span>";
  } 
  else {
    $email = $_POST['email'];
    $password = $_POST['password'];
    $query = "SELECT * FROM register_user WHERE email = :email AND user_password = :user_password";
    $statement = $pdo->prepare($query);
    $statement->bindParam(':email', $filterEmail, PDO::PARAM_STR);
    $statement->bindParam(':user_password', $filterPassword, PDO::PARAM_STR);
    $statement->execute();
    $row = $statement->fetch(PDO:: FETCH_ASSOC);

    if(password_verify($password, $row['email'] ?? 'default')) {
       echo "Success";
     } 
     else {
       echo 'failed';
     }
    
   }
}
?>

解決策 1

引用:
PHP
$query = "SELECT * FROM register_user WHERE email = :email AND user_password = :user_password";

ユーザーが入力した場合、クエリはレコードのみを返します 塩漬けのハッシュ 「パスワード」フィールドに自分のパスワードを入力します。

引用:
PHP
if(password_verify($password, $row['email'] ?? 'default')) {

password_verify 方法[^] ユーザーが入力した場合にのみ成功します 塩漬けハッシュの塩漬けハッシュ 登録時にパスワードをメールアドレスとして使用します。

したがって、あなたのコードは 一度もない ログインできるようにします。

純粋に電子メール アドレスに基づいて、データベースからユーザーを選択する必要があります。 クエリが成功し、行が返されることを確認する必要があります。 また、ハッシュ化されたパスワードをデータベースから password_verify 方法、 いいえ メールアドレス。

コメントで指摘されているように、クエリ パラメータに対して既に定義した変数を使用する必要があります。

PHP
<?php
require_once 'includes/connection.php';
require_once 'includes/filter.php';
require_once 'includes/header.php';

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  if (empty($_POST['email']) || empty($_POST['password'])) {
    echo "<span>All fileds are required</span>";
  } 
  else {
    $email = $_POST['email'];
    $password = $_POST['password'];
    
    $query = "SELECT * FROM register_user WHERE email = :email";
    $statement = $pdo->prepare($query);
    $statement->bindParam(':email', $email, PDO::PARAM_STR);
    if ($statement->execute() && $row = $statement->fetch(PDO:: FETCH_ASSOC) && password_verify($password, $row['user_password'])) {
       echo "Success";
    } 
    else {
       echo 'failed';
    }
  }
}
?>

コメント

タイトルとURLをコピーしました