Uwierzytelnianie HTTP – zabezpieczenie strony hasłem
W wielu przypadkach przy projektowaniu stron internetowych dostęp do niektórych skryptów (np. panelu administracyjnego) należy ograniczyć. Najprostszą i najpopularniejszą metodą jest wymóg podania loginu i hasła. Problem ten można rozwiązać na dwa sposoby. Możemy napisać skrypty PHP odpowiedzialne za rejestracje nowych internautów, logowanie ich itd. lub skorzystać z uwierzytelnienia HTTP, co daje nam praktycznie takie same efekty pisząc tylko kilka linijek kodu.
Niestety rozwiązanie to ma jedną bardzo poważną wadę, a mianowicie nie mamy możliwości wylogowywania się.
Na samym początku skryptu PHP (pliku strony WWW), do którego chcemy zablokować dostęp należy umieścić taki kod:
if (!isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Jakaś nazwa"');
exit('Musisz podać hasło');
}
//pobieramy podane hasło i login
$username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
//sprawdzamy czy hasło i login się zgadzają pobierając z bazy danych odpowiednie dane
//zapytanie parametryzowane - dane trafiają do bazy osobno od tekstu SQL (ochrona przed SQL injection)
$query = 'SELECT username FROM user WHERE username = ? AND password = ?';
$stmt = mysqli_prepare($dbc, $query) or die('Błąd w zapytaniu do bazy');
mysqli_stmt_bind_param($stmt, 'ss', $username, $password);
mysqli_stmt_execute($stmt) or die('Błąd w zapytaniu do bazy');
mysqli_stmt_store_result($stmt);
if (mysqli_stmt_num_rows($stmt) == 1) {
//dane się zgadzają
echo 'Jesteś zalogowany jako ' . $username;
//dalszy kod skryptu oraz kod HTML - zostanie on wyświetlony tylko wtedy, kiedy internauta się zaloguje
} else {
exit ('Login lub hasło jest niepoprawne');
}
Dla większego bezpieczeństwa zalecamy przechowywanie haseł w postaci skrótów. Aktualizacja: algorytm MD5 nie nadaje się już do haseł, dokumentacja PHP wprost to odradza. Używaj funkcji password_hash() i password_verify(), a nie md5('string'); Oczywiście dane takie jak login czy hasło, mogą być zapisane wcześniej w jakiejś zmiennej lub w innym miejscu, a nie w bazie MySQL.