簡単なログイン/登録フォームに取り組んでいます。ログインスクリプトは、ユーザー名とパスワードがデータベースの同じ行に存在するかどうかを確認します。存在する場合は、ユーザーをウェルカムページに移動します。
ただし、ユーザーが送信したパスワードにpassword_hash()関数を適用したため、データベースにパスワードが存在するかどうかを確認するときに問題が発生します。この暗号化方法は一方向であり、(私の知る限り)元に戻すことはできません。ログインスクリプトのコードは次のとおりです。
<?php
//will correspond with 'loginLogin.html page
require("opendboLogin.php");
$user = $_POST['username'];
$password = $_POST['password'];
$stmt2 = $conn->stmt_init();
$stmt2 = $conn->prepare("SELECT * FROM login WHERE alogin = ? AND apassword = ?");
$stmt2->bind_param("ss", $user, $password);
$stmt2->execute();
$stmt2->store_result();
$numberofrows = $stmt2->num_rows; //this is an integer!!
$stmt2 -> close();
if($numberofrows > 0) //if username and password combination exists in a row
{
echo 'login successful!';
}
else
{
echo 'Incorrect username and/or password, dumbass!';
}
?>
このスクリプト内でパスワードを再度暗号化して、2つのハッシュが一致するかどうかを確認できると考えていましたが、同じパスワードがハッシュされているかどうかに関係なく、暗号化は毎回変更されます。
現在のところ、ユーザー名とパスワードの組み合わせは存在せず、常に最後の「else」ステートメントにヒットします。ユーザー名とパスワードの正しい組み合わせを確認する方法はありますか?
ユーザー名に基づいてユーザーレコードを取得しようとします(ただし、大文字と小文字が区別されないように、=
ではなくLIKE
を使用してください。ユーザー名では大文字と小文字が区別されません。
ユーザーレコードを取得することができ(ユーザーが存在する場合)、パスワードを比較してログインを検証できます。
password_hash() のような関数を使用してパスワードを保存し、プレーンテキスト(ahugeno-no)。これにより毎回一意のソルトが生成されるため、ハッシュは毎回異なります。心配しないでください。
保存されているパスワードに対してユーザーがログインしているパスワードを検証するには、 password_verify() を使用して、パスワードをユーザーに渡しますポストされ、データベースから保存されたハッシュ。関数は、saltと比較を処理します。これは、パスワードハッシュについて読んだときに見逃した機能だと思います。
ログインに成功したら、パスワードを再ハッシュする必要があるかどうかを確認する必要があります(アルゴリズムの「コスト」は更新されます)。保存したハッシュを password_needs_rehash() に渡すだけで、パスワードを再ハッシュして再保存する必要があるかどうかを確認できます。
通常、一致するユーザー名を含むレコードをテーブルで検索します。そのレコードが存在しない場合、ユーザーは存在しないため、これ以上進む必要はありません。
レコードが存在する場合、そのレコードにはそのユーザーのパスワードハッシュが含まれます。ユーザーが指定したパスワードを取得し、同じ方法でハッシュし、レコード内のハッシュと比較します。