Додавање соли у ауторизацију
Сада морамо да променимо ауторизацију. Овде ће промене бити значајније.
Више неће бити могуће проверити исправност пара корисничко име-лозинка одмах, једним упитом. Зашто: јер, да би се проверила лозинка, потребно је добити њен солени хеш, а со се чува у бази података и јединствена је за свако корисничко име.
Мораћемо прво да добијемо запис само по корисничком имену, прочитамо со, посолимо унету лозинку и упоредимо са соленом лозинком из базе и само, ако се поклапају, - ауторизовати корисника.
Имајте у виду да може бити тако да је корисничко име унето погрешно, у том случају проверу лозинке не морамо да вршимо, већ одмах да испишемо да ауторизација није могућа - подаци нису тачни:
<?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 {
// корисника са таквим корисничким именом нема, исписаћемо поруку
}
?>
У циљу безбедности кориснику се обично не саопштава шта није у реду - корисничко име или лозинка, како би се отежало погодили пар корисничко име-лозинка хакерима. Једноставно се исписује порука о томе, да пар корисничко име-лозинка није тачан или нешто слично.
Имплементирајте горе описани начин ауторизације са соленом лозинком. Покушајте да се региструјете, ауторизујете, уверите се да све ради.