0

さて、私の教育のためのサイド プロジェクトとして、私は現在、PHP と mysqli を使用して安全なログイン システムに取り組んでいます。順調に進んでいますが、今、仲間、教師、そして私が困惑している問題に遭遇しました.

password_hash と password_verify でパスワードをハッシュしてチェックしています。

アカウントを作成すると、すべてがデータベースに正しく保存されます。次に、正しいパスワードを使用してログインしようとすると、パスワードが正しくないというエラーが表示されます。

キッカーは次のとおりです。PHPMyAdminにアクセスすると、データベースに保存されているハッシュ化されたパスワードをコピーし、コピーされた正確なパスワードでパスワードフィールドを更新します...うまくいきます。使用したパスワードで意図したとおりにログインでき、エラーは発生しません。

何が起きているのか、それを修正する方法を知っている人はいますか?

登録に使用されるコード:

public function createAccount()
{
    global $con;

    $this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n";
    $sql='INSERT into user (username, password, email, creation_date)
        VALUES (?,?,?,?)';

    // Prepare statement
    $stmt = $con->prepare($sql);
    if($stmt === false) {
      trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR);
    }

    // Bind parameters. Types: s = string, i = integer, d = double,  b = blob
    $stmt->bind_param('ssss',$this->username,$this->password,$this->email,$this->creationDate);

    // Execute statement
    $stmt->execute();

    echo $stmt->insert_id;
    echo $stmt->affected_rows;

    $stmt->close();

    $_SESSION['login'] = true;
    $_SESSION['username'] = $username;
    Header("Location: index.php");
}

資格情報の検証に使用されるコード:

public function fetchCredentials() {
    // Select a set of credentials from the username given in form and return as array
    global $con;
    $sql = 'SELECT id, password FROM user WHERE username = ?';

    // Prepare statement 
    $stmt = $con->prepare($sql);
    if($stmt === false) {
      trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR);
    }

    // Bind parameters. Types: s = string, i = integer, d = double,  b = blob
    $stmt->bind_param('s',$this->username);

    // Execute statement
    $stmt->execute();

    // Store all results in an array
    $rs=$stmt->get_result();
    $arr = $rs->fetch_all(MYSQLI_ASSOC);
    $stmt->close();

    return($arr);
}

public function validateCredentials() {
    // Get credentials
    $arr = $this->fetchCredentials();

    // Validate username
    if (count($arr) > 1) {
        $this->error = 'crit';
        $this->abort = true;
    } else if (count($arr) < 1) {
        $this->error = 'badLogin';
        $this->abort = true;
    } else {
        $arr = $arr[0];
    }

    echo $arr['password'].'<br>'.$this->password;
    // Validate password. NOTE: This is where the issue arises. Password_verify() will return false where it    should return true.
    if ($this->abort == false && !password_verify($this->password, $arr['password'])) {
        $this->error = 'badLogin';
        $this->abort = true;
    }

    // Return values if needed
    if ($this->abort == false) {
        $this->id = $arr['id'];
    }
    return $this->abort;
}

ログインを呼び出す部分: (はい、validatecredentials 関数が 2 回呼び出されています。はい、そこにはあまりよく書かれていないものがいくつかあります。コードのこの部分にはまだいくつかの作業が必要であり、それが最初のことです。上記の問題を修正した後に行います)

function login()
{
    $newCred = new credentials(
    $_POST['username'],
    $_POST['password']);

    if ($newCred->checkForm() == false
    && $newCred->validateCredentials() == false) {
        $newLogin = new login(
        $newCred->validateCredentials()['id']);

        $newLogin->login();
        $newLogin->getUserDetails();
    } else {
        $newCred->fetchError();
    }
}
4

1 に答える 1

1

助けてくれたみんな: ありがとう。私はクラスメートに助けられただけで、彼は問題を見つけることができました. 私は今自分自身を殴っています。

$this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n";

ここにあります。"\n". 改行。例からコードを取得しましたが、それは何らかの理由でそこにありました。データベースを更新すると、改行が削除されました。

于 2014-10-29T13:46:19.690 に答える