Добавяне на сол в авторизацията
Сега трябва да променим авторизацията. Тук промените ще бъдат по-съществени.
Вече няма да е възможно да проверим правилността на двойката потребителско име-парола веднага, с една заявка. Защо: защото, за да проверим паролата, трябва да получим нейният солен хеш, а солта се съхранява в базата данни и е уникална за всяко потребителско име.
Ще трябва първо да получим записа само по потребителското име, да прочетем солта, да осолим въведената парола и да сравним със солената парола от базата и само, ако те съвпадат, - да авторизираме потребителя.
Имайте предвид, че може да се случи потребителското име да е въведено грешно, в този случай проверката на паролата може да не се извършва, а веднага да се изведе, че авторизацията не е възможна - данните са грешни:
<?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 {
// няма потребител с такова потребителско име, ще изведем съобщение
}
?>
От съображения за сигурност на потребителя обикновено не се информира какво точно не съвпада - потребителското име или паролата, за да се усложни подборът на двойки потребителско име-парола от хакери. Просто се извежда съобщение, че двойката потребителско име-парола е грешна или нещо подобно.
Реализирайте описаната по-горе авторизация със солена парола. Опитайте се да се регистрирате, да се авторизирате, уверете се, че всичко работи.