10

私の登録スクリプトは、ユーザーのパスワードを受け取り、PHP の password_hash 関数を使用してパスワードを暗号化し、それをデータベースに配置します。作成したばかりのユーザーを使用してログインしようとすると、パスワードが同じかどうかを確認するエラーが表示されます。私の場合、そうではありません。ログイン スクリプトで password_verify 関数を呼び出すと、何が間違っていますか?

登録

if($_SERVER["REQUEST_METHOD"] == "POST"){
    function secure($data){
        $data = trim($data);
        $data = stripslashes($data);
        $data = htmlspecialchars($data);
        return($data);
    }

    $p_num = secure($_POST["p_number"]);
    $first_name = secure($_POST["first_name"]);
    $last_name = secure($_POST["last_name"]);
    $email = secure($_POST["email"]);
    $password = secure($_POST["pw"]);
    $verify_password = secure($_POST["pw_verify"]);
    $program = secure($_POST["program"]);
    $role = secure($_POST["role"]);
    $logged_in = 0;
    $registered = 0;
    $image = "../images/profile_placeholder.png";

    if($password != $verify_password){
        echo "Nope.  Passwords";
    }
    else{
        $registered = 1;
        $password = password_hash($password, PASSWORD_DEFAULT);
        $insert = "INSERT INTO `$user_table`(`user_id`, `first_name`, `last_name`, `password`, `image`, `email`, `program`, `role`, `logged_in`, `registered`) VALUES('" .$p_num ."', '" .$first_name ."', '" .$last_name ."', '" .$password ."', '" .$image ."', '" .$email ."', '" .$program ."', '" .$role ."', '" .$logged_in ."', '" .$registered ."')";
        $query = mysqli_query($connect, $insert);
        echo "Success!";
    }
}

ログインする

if($_SERVER["REQUEST_METHOD"] == "POST"){
    $p_num = $_POST["username"];
    $pwd = $_POST["password"];

    $query = "SELECT * FROM `$user_table` WHERE `user_id` = '$p_num'";
    $result = mysqli_query($connect, $query);
    while($row = mysqli_fetch_assoc($result)){
        $user_id = "{$row['user_id']}";
        $first_name = "{$row['first_name']}";
        $last_name = "{$row['last_name']}";
        $user_name = $first_name ." " .$last_name;
        $password = "{$row['password']}";
        $image = "{$row['image']}";
        $email = "{$row['email']}";
        $program = "{$row['program']}";
        $role = "{$row['role']}";
        $status = "{$row['logged_in']}";
        $registered = "{$row['registered']}";
        if(($user_id == $p_num) && (password_verify($pwd, $password))){
            $_SESSION["id"] = $user_id;
            $_SESSION["user"] = $user_name;
            $_SESSION["program"] = $program;
            $_SESSION["pass"] = $password;
            $_SESSION["image"] = $image;
            $_SESSION["email"] = $email;
            $_SESSION["role"] = $role;
            $_SESSION["status"] = $status;
            $_SESSION["registered"] = $registered;
            $loggedin = "UPDATE `$user_table` SET `logged_in` = 1 WHERE `user_id` = '$user_id'";
        }
    var_dump($pwd);
    var_dump($password);
}

var_dump を実行すると、次のようになります。

string(1) "1" string(16) "$2y$10$0aysCso3b"

明らかに、パスワードは一緒に照合されていません。そのため、登録スクリプトでは、パスワードがハッシュされてデータベースに送信されます。次に、ユーザーがログインすると、ログイン スクリプトは、ユーザーがログインするために入力したパスワードを確認し、password_verify を使用して、データベース内のハッシュ化されたパスワードと照合します。しかし、ハッシュ化されたパスワードは、ハッシュ化されていないパスワードを一致として受け入れません。私が理解していないのは、なぜですか?

4

2 に答える 2

18

password_hashとに使用するものは次のとおりですpassword_verify。書かれているとおりに試してみてください。成功したら、コードの残りの部分に追加を開始できます。

テーブルと列の名前を適切に変更します。

注意:これは基本的な挿入方法です。代わりに準備済みステートメントを使用することをお勧めします。

補足: パスワード列は、ハッシュに対応するのに十分な長さである必要がありますVARCHAR(255)。「脚注」を参照してください。

ファイルを挿入

<?php
$DB_HOST = 'xxx';
$DB_USER = 'xxx';
$DB_PASS = 'xxx';
$DB_NAME = 'xxx';

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_errno > 0) {
die('Connection failed [' . $conn->connect_error . ']');
}

$password = "rasmuslerdorf";
$first_name = "john";
$password = password_hash($password, PASSWORD_DEFAULT);

$sql = "INSERT INTO users (`name`, `password`) VALUES ('" .$first_name ."', '" .$password ."')";

    $query = mysqli_query($conn, $sql);
    if($query)

{
    echo "Success!";
}

else{
    // echo "Error";
    die('There was an error running the query [' . $conn->error . ']');
}

ログインファイル

<?php
// session_start();

$DB_HOST = 'xxx';
$DB_USER = 'xxx';
$DB_PASS = 'xxx';
$DB_NAME = 'xxx';

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_errno > 0) {
  die('Connection failed [' . $conn->connect_error . ']');
}

$pwd = "rasmuslerdorf";
$first_name = "john";

//$sql = "SELECT * FROM users WHERE id = 1";

        $sql = "SELECT * FROM users WHERE name='$first_name'";
        $result = $conn->query($sql);
        if ($result->num_rows === 1) {
            $row = $result->fetch_array(MYSQLI_ASSOC);
            if (password_verify($pwd, $row['password'])) {

                //Password matches, so create the session
                // $_SESSION['user'] = $row['user_id'];
                // header("Location: http://www.example.com/logged_in.php");

                echo "Match";

            }else{
                echo  "The username or password do not match";
            }

}

 mysqli_close($conn);

脚注:

パスワード列は、ハッシュを保持するのに十分な長さである必要があります。ハッシュが生成する文字の長さは 72 ですが、マニュアルでは 255 が推奨されています。

参照:

"bcrypt アルゴリズムを使用します (PHP 5.5.0 以降のデフォルト)。この定数は、新しいより強力なアルゴリズムが PHP に追加されるにつれて、時間の経過とともに変化するように設計されていることに注意してください。そのため、この識別子を使用した結果の長さは変化する可能性があります。したがって、60 文字を超えて拡張できるデータベース列に結果を格納することをお勧めします (255 文字が適切な選択です)。

于 2014-10-24T01:16:33.640 に答える
0

ログインに一意のユーザー名を使用しているため、ユーザー名のみを使用してデータベースからパスワード/データをフェッチする必要があります。

例:

<?php
    $connect = mysqli_connect($localhost, $username, $pwd, $database) or die("Opps some thing went wrong");

    if (isset($_POST['submit'])) {
      extract($_POST);

     // Get Old Password from Database which is having unique userName
     $sqlQuery = mysqli_query($connect, "select * from loginTable where User='$username'");
     $res = mysqli_fetch_array($sqlQuery);
     $current_password = $res['userPassword'];

     if (password_verify($enteredPassword, $current_password)) { 
        /* If Password is valid!! */
        $_SESSION['id'] = $res['id'];
        header("location: home.php");
     }
     else { 
        /* If Invalid password Entered */
        $alt = "Login Failed! Wrong user ID or Password";
        header("location: index.php?m=$alt");
     }
  }
?>

それは私のために働いています...私はデータベースからパスワードを取得し、PHP APIを使用して入力されたパスワードと比較しています。すなわちpassword_verify($enteredPassword, $current_password)

于 2016-03-02T10:15:39.887 に答える