認証へのソルトの追加
これで、認証を変更する必要があります。 ここでの変更はより重要なものになります。
もはや、ログインとパスワードのペアの正しさを 即座に1つのクエリで確認することはできません。なぜなら: パスワードを確認するには、そのソルト付きハッシュを 取得する必要がありますが、ソルトはデータベースに保存されており、 各ログインに対して一意だからです。
まず、ログインのみでレコードを取得し、 ソルトを読み取り、入力されたパスワードにソルトを加えて、 データベースからのソルト付きパスワードと比較し、 それらが一致した場合にのみユーザーを認証する 必要があります。
ログインが誤って入力されている可能性があることを 考慮してください。この場合、パスワードの確認は 行わず、直ちに認証が不可能であること、つまりデータが 正しくないことを表示できます:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'";
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
// このログインのユーザーがいます。次にパスワードを確認する必要があります...
} else {
// このログインのユーザーはいません。メッセージを表示します
}
?>
パスワード確認を追加しましょう:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'";
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$salt = $user['salt']; // DBからのソルト
$hash = $user['password']; // DBからのソルト付きパスワード
$password = md5($salt . $_POST['password']); // ユーザーからのソルト付きパスワード
// ソルト付きハッシュを比較
if ($password == $hash) {
// すべてOK、認証...
} else {
// パスワードが一致しません。メッセージを表示します
}
} else {
// このログインのユーザーはいません。メッセージを表示します
}
?>
セキュリティ上の理由から、ログインとパスワードのペアの ブルートフォースをハッカーが行うのを難しくするために、 通常、ユーザーには何が一致しなかったか(ログインかパスワードか)は 通知されません。単にログインとパスワードのペアが 間違っているか、またはそのような内容のメッセージが 表示されます。
上記のソルト付きパスワードによる認証を実装してください。 登録し、認証し、すべてが機能することを確認してください。