Suolan lisääminen autentikointiin
Nyt meidän on muutettava autentikointia. Tässä muutokset ovat jo merkittävämpiä.
Ei enää ole mahdollista tarkistaa käyttäjätunnus-salasanaparin oikeellisuutta heti, yhdellä kyselyllä. Miksi: koska salasanan tarkistamiseksi on haettava sen suolattu tiiviste, ja suola tallennetaan tietokantaan ja on ainutlaatuinen jokaiselle käyttäjätunnukselle.
On ensin haettava tietue vain käyttäjätunnuksen perusteella, luettava suola, suolattu syötetty salasana ja verrattava sitä tietokannasta saatavaan suolattuun salasanaan ja vain, jos ne täsmäävät, - autentikoida käyttäjä.
Ota huomioon, että voi olla tilanteita, joissa käyttäjätunnus on syötetty väärin, tässä tapauksessa salasanan tarkistusta ei tarvitse suorittaa, vaan voidaan heti ilmoittaa, että autentikointi ei ole mahdollista - tiedot eivät ole oikein:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'";
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
// käyttäjä tällaisella käyttäjätunnuksella on olemassa, nyt on tarkistettava salasana...
} else {
// käyttäjää tällaisella käyttäjätunnuksella ei ole, näytetään viesti
}
?>
Lisätään salasanan tarkistus:
<?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']; // suola tietokannasta
$hash = $user['password']; // suolattu salasana tietokannasta
$password = md5($salt . $_POST['password']); // käyttäjän suolattu salasana
// Verrataan suolattuja tiivisteitä
if ($password == $hash) {
// kaikki kunnossa, autentikoidaan...
} else {
// salasana ei täsmännyt, näytetään viesti
}
} else {
// käyttäjää tällaisella käyttäjätunnuksella ei ole, näytetään viesti
}
?>
Tietoturvasyistä käyttäjälle yleensä ei kerrota, mikä ei täsmännyt - käyttäjätunnus vai salasana, vaikeuttaakseen käyttäjätunnus-salasanaparien murtautumista hakkereilta. Yksinkertaisesti näytetään viesti siitä, että käyttäjätunnus-salasanapari on virheellinen tai jotain vastaavaa.
Toteuta yllä kuvattu autentikointi suolalla salasanassa. Kokeile rekisteröityä, kirjaudu sisään, varmista, että kaikki toimii.