Dodawanie soli do autoryzacji

Teraz musimy zmienić autoryzację. Tutaj zmiany będą już bardziej znaczące.

Nie będzie już możliwości sprawdzenia poprawności pary login-hasło od razu, jednym zapytaniem. Dlaczego: ponieważ, aby sprawdzić hasło, trzeba pobrać jego zasolony hash, a sól jest przechowywana w bazie danych i jest unikalna dla każdego loginu.

Będzie trzeba najpierw pobrać rekord tylko po loginie, odczytać sól, posolić wprowadzone hasło i porównać z zasolonym hasłem z bazy i tylko, jeśli się zgadzają, - autoryzować użytkownika.

Weź pod uwagę, że może być tak, że login został wpisany nieprawidłowo, w tym przypadku sprawdzania hasła można nie przeprowadzać, a od razu wyświetlić, że autoryzacja nie jest możliwa - dane są nieprawidłowe:

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)) {
    // użytkownik z takim loginem istnieje, teraz trzeba sprawdzić hasło...
  } else {
    // użytkownik z takim loginem nie istnieje, wyświetlimy komunikat
  }
?>

Dodajmy sprawdzenie hasła:

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']; // sól z BD
    $hash = $user['password']; // zasolone hasło z BD
    
    $password = md5($salt . $_POST['password']); // zasolone hasło od użytkownika
    
    // Porównujemy zasolone hashe
    if ($password == $hash) {
      // wszystko ok, autoryzujemy...
    } else {
      // hasło nie pasuje, wyświetlimy komunikat
    }
  } else {
    // użytkownik z takim loginem nie istnieje, wyświetlimy komunikat
  }
?>

Ze względów bezpieczeństwa użytkownikowi zwykle nie komunikuje się, co dokładnie nie pasuje - login czy hasło, aby utrudnić podbieranie par login-hasło przez hakerów. Po prostu wyświetla się komunikat o tym, że para login-hasło jest nieprawidłowa lub coś w tym rodzaju.

Задание 1

Zaimplementuj opisaną powyżej autoryzację z zasolonym hasłem. Spróbuj się zarejestrować, zaloguj się, upewnij się, że wszystko działa.