Добавяне на сол в авторизацията

Сега трябва да променим авторизацията. Тук промените ще бъдат по-съществени.

Вече няма да е възможно да проверим правилността на двойката потребителско име-парола веднага, с една заявка. Защо: защото, за да проверим паролата, трябва да получим нейният солен хеш, а солта се съхранява в базата данни и е уникална за всяко потребителско име.

Ще трябва първо да получим записа само по потребителското име, да прочетем солта, да осолим въведената парола и да сравним със солената парола от базата и само, ако те съвпадат, - да авторизираме потребителя.

Имайте предвид, че може да се случи потребителското име да е въведено грешно, в този случай проверката на паролата може да не се извършва, а веднага да се изведе, че авторизацията не е възможна - данните са грешни:

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']; // сол от БД
    $hash = $user['password']; // солена парола от БД
    
    $password = md5($salt . $_POST['password']); // солена парола от потребителя
    
    // Сравняваме солените хешове
    if ($password == $hash) {
      // всичко е наред, авторизираме...
    } else {
      // паролата не съвпада, ще изведем съобщение
    }
  } else {
    // няма потребител с такова потребителско име, ще изведем съобщение
  }
?>

От съображения за сигурност на потребителя обикновено не се информира какво точно не съвпада - потребителското име или паролата, за да се усложни подборът на двойки потребителско име-парола от хакери. Просто се извежда съобщение, че двойката потребителско име-парола е грешна или нещо подобно.

Задание 1

Реализирайте описаната по-горе авторизация със солена парола. Опитайте се да се регистрирате, да се авторизирате, уверете се, че всичко работи.