Добавление соли в авторизацию
Теперь нам необходимо поменять авторизацию. Здесь уже изменения будут более существенными.
Уже не получится проверить правильность пары логин-пароль сразу же, одним запросом. Почему: потому что, чтобы проверить пароль, надо получить его соленый хеш, а соль хранится в базе данных и уникальная для каждого логина.
Придется вначале получить запись только по логину, прочитать соль, посолить введенный пароль и сравнить с соленым паролем из базы и только, если они совпадают, - авторизовывать пользователя.
Учтите, что может такое быть, что логин вбит неправильно, в этом случае проверку пароля можно не осуществлять, а сразу вывести, что авторизация не возможна - данные не верны:
<?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']; // соль из БД
$hash = $user['password']; // соленый пароль из БД
$password = md5($salt . $_POST['password']); // соленый пароль от юзера
// Сравниваем соленые хеши
if ($password == $hash) {
// все ок, авторизуем...
} else {
// пароль не подошел, выведем сообщение
}
} else {
// пользователя с таким логином нет, выведем сообщение
}
?>
В целях безопасности пользователю обычно не сообщают, что именно не подошло - логин или пароль, чтобы усложнить подбор пар логин-пароль хакерами. Просто выводят сообщение о том, что пара логин-пароль неверна или что-то в таком роде.
Реализуйте описанную выше авторизацию с соленым паролем. Попробуйте зарегистрируйтесь, авторизуйтесь, убедитесь, что все работает.