Pridanie soli do autorizácie
Teraz musíme zmeniť autorizáciu. Tu už budú zmeny výraznejšie.
Už nebude možné okamžite, jednou požiadavkou overiť správnosť páru prihlasovacie meno-heslo. Prečo: pretože na overenie hesla je potrebné získať jeho soľaný hash, soľ je uložená v databáze a je unikátna pre každé prihlasovacie meno.
Najprv bude potrebné získať záznam len podľa prihlasovacieho mena, prečítať soľ, posoliť zadané heslo a porovnať so soľaným heslom z databázy a len v prípade, že sa zhodujú, - autorizovať používateľa.
Berte do úvahy, že sa môže stať, že prihlasovacie meno je zadané nesprávne, v tomto prípade overenie hesla je možné nevykonávať a okamžite vypísať, že autorizácia nie je možná - údaje sú nesprávne:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'";
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
// používateľ s takýmto prihlasovacím menom existuje, teraz treba overiť heslo...
} else {
// používateľ s takýmto prihlasovacím menom neexistuje, vypíšeme správu
}
?>
Pridajme overenie hesla:
<?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']; // soľ z databázy
$hash = $user['password']; // soľané heslo z databázy
$password = md5($salt . $_POST['password']); // soľané heslo od používateľa
// Porovnávame soľané hashe
if ($password == $hash) {
// všetko v poriadku, autorizujeme...
} else {
// heslo nesedelo, vypíšeme správu
}
} else {
// používateľ s takýmto prihlasovacím menom neexistuje, vypíšeme správu
}
?>
Z bezpečnostných dôvodov sa používateľovi zvyčajne neoznamuje, čo konkrétne nesedelo - prihlasovacie meno alebo heslo, aby sa sťažil postupný výskyt párov prihlasovacie meno-heslo hackermi. Jednoducho sa zobrazí správa o tom, že pár prihlasovacie meno-heslo je nesprávny alebo niečo v tom zmysle.
Realizujte opísanú autorizáciu so soľaným heslom. Skúste sa zaregistrovať, prihlásiť, presvedčte sa, že všetko funguje.