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:
<?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:
<?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.
Zaimplementuj opisaną powyżej autoryzację z zasolonym hasłem. Spróbuj się zarejestrować, zaloguj się, upewnij się, że wszystko działa.