認証へのソルトの追加

これで、認証を変更する必要があります。 ここでの変更はより重要なものになります。

もはや、ログインとパスワードのペアの正しさを 即座に1つのクエリで確認することはできません。なぜなら: パスワードを確認するには、そのソルト付きハッシュを 取得する必要がありますが、ソルトはデータベースに保存されており、 各ログインに対して一意だからです。

まず、ログインのみでレコードを取得し、 ソルトを読み取り、入力されたパスワードにソルトを加えて、 データベースからのソルト付きパスワードと比較し、 それらが一致した場合にのみユーザーを認証する 必要があります。

ログインが誤って入力されている可能性があることを 考慮してください。この場合、パスワードの確認は 行わず、直ちに認証が不可能であること、つまりデータが 正しくないことを表示できます:

html<?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 {
    // このログインのユーザーはいません。メッセージを表示します
  }
?>

パスワード確認を追加しましょう:

html<?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 {
    // このログインのユーザーはいません。メッセージを表示します
  }
?>

セキュリティ上の理由から、ログインとパスワードのペアの ブルートフォースをハッカーが行うのを難しくするために、 通常、ユーザーには何が一致しなかったか(ログインかパスワードか)は 通知されません。単にログインとパスワードのペアが 間違っているか、またはそのような内容のメッセージが 表示されます。

Задание 1

上記のソルト付きパスワードによる認証を実装してください。 登録し、認証し、すべてが機能することを確認してください。