1. ホーム
  2. php

[解決済み] PHP PDOログインシステムの不具合

2022-02-07 11:11:45

質問

ログインシステムを作っているのですが、どのようなパスワードのユーザーでも私のシステムに入ることができるようです。

mysqliを使用してこのシステムを作ることができますが、私はPDOで問題が発生しました。どのようにそれを解決すればよいのでしょうか。

if(isset($_POST["login-submit"])){
    require "dbh.inc.php";
    $username = $_POST["username"];
    $user_password = $_POST["password"];
    $user_password = password_hash($user_password, PASSWORD_DEFAULT);

    $sql = "SELECT count(id) FROM users WHERE username = :username AND user_password = :user_password"; 
    $stmt = $conn->prepare($sql);
    $stmt->execute(["username" => $username, "user_password" => $user_password]);
    if($stmt->rowCount() == 1){
        session_start();
        $_SESSION["username"] =  $username;
        header("location:../index.php?login=success");
        exit();
    } else {
        header("location:../index.php?login=failed");
        exit();
    }
}

私はコードの他のすべての部分をテストしました、私が新しいユーザーを登録するとき、それらはうまくいくようです、しかし、私がログインフォームを使用する場合、そこに任意のパスワードで誰でも私のシステムに入ることができます。間違ったユーザーと間違ったパスワードを入力しても、常にログインに成功すると表示されます。 私はまた、これに似たスタックオーバーフローで他の質問を見たことがありますが、それらのコードはちょっと複雑です。

解決方法は?

パスワードの有効性を確認するために再度ハッシュ化を行っていますが、その代わりに password_verify のように、パスワードが正当なものであるかどうかをチェックします。

if(isset($_POST["login-submit"])){
    require "dbh.inc.php";
    $username = $_POST["username"];
    $user_password = $_POST["password"];

    $sql = "SELECT * FROM users WHERE username = :username"; 
    $stmt = $conn->prepare($sql);
    $stmt->execute(["username" => $username]);
    $user = $stmt->fetch();
    $hash = $user['user_password'];
    if(password_verify($user_password,$hash)){
        session_start();
        $_SESSION["username"] =  $username;
        header("location:../index.php?login=success");
        exit();
    } else {
        header("location:../index.php?login=failed");
        exit();
    }
}

仮に、ユーザーのパスワードをデータベースに保存するために password_hash 関数を使用します。 また、ユーザー名で取得した後、ハッシュを取得し、そのハッシュを検証するために password_verify() 関数を使用します。