Druskos pridėjimas autorizacijoje
Dabar mums reikia pakeisti autorizaciją. Čia pokyčiai jau bus reikšmingesni.
Jau nebeįmanoma bus iškart patikrinti prisijungimo vardo ir slaptažodžio poros teisingumą vienu užklausu. Kodėl: nes, norint patikrinti slaptažodį, reikia gauti jo pasūdytą maišos reikšmę, o druska saugoma duomenų bazėje ir yra unikali kiekvienam prisijungimo vardui.
Pirmiausia teks gauti įrašą tik pagal prisijungimo vardą, nuskaityti druską, pasūdyti įvestą slaptažodį ir palyginti su pasūdytu slaptažodžiu iš bazės ir tik, jei jie sutampa, - autorizuoti vartotoją.
Atkreipkite dėmesį, kad gali būti taip, kad prisijungimo vardas įvestas neteisingai, tokiu atveju slaptažodžio patikrinimo galima neatlikti, o iškart išvesti, kad autorizacija neįmanoma - duomenys neteisingi:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'";
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
// vartotojas su tokiu prisijungimo vardu yra, dabar reikia tikrinti slaptažodį...
} else {
// vartotojo su tokiu prisijungimo vardu nėra, išvesime pranešimą
}
?>
Pridėkime slaptažodžio patikrinimą:
<?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']; // druska iš DB
$hash = $user['password']; // pasūdytas slaptažodis iš DB
$password = md5($salt . $_POST['password']); // pasūdytas slaptažodis nuo vartotojo
// Lyginame pasūdytas maišos reikšmes
if ($password == $hash) {
// viskas gerai, autorizuojame...
} else {
// slaptažodis netiko, išvesime pranešimą
}
} else {
// vartotojo su tokiu prisijungimo vardu nėra, išvesime pranešimą
}
?>
Dėl saugumo sumetimų vartotojui dažniausiai nepranešama, kas tiksliai netiko - prisijungimo vardas ar slaptažodis, kad apsunkinti prisijungimo vardo ir slaptažodžio poros parinkimą programuotojų. Tiesiog išvedama pranešimas apie tai, kad prisijungimo vardo ir slaptažodžio pora neteisinga arba kažkas panašaus.
Įgyvendinkite aukščiau aprašytą autorizaciją su pasūdytu slaptažodžiu. Pabandykite užsiregistruoti, prisijungti, įsitikinkite, kad viskas veikia.