środa,
PHP: Skrypt logowania
Obsługa mechanizmu logowania to często wymagana funkcja aplikacji internetowych. W przykładzie zademonstrowano proste rozwiązanie, które umożliwia logowanie użytkownika z regeneracją identyfikatora sesji i haszowaniem hasła. Skrypt jest uproszczony i służy celom edukacyjnym. W prawdziwych aplikacjach internetowych należy zwrócić uwagę na dodatkowe aspekty bezpieczeństwa. W prawdziwej aplikacji dane logowania powinny pochodzić z bazy danych. Bezpieczeństwo aplikacji internetowych jest złożonym tematem i wymaga ciągłej uwagi i aktualizacji praktyk zgodnie z najlepszymi standardami branżowymi.
Dla ułatwienia analizy kodu skrypt podzielono na trzy części (pliki).
Przykład skryptu logowania
Strona logowania (login.php)
<?php
session_start();
// Zakładamy, że dane użytkownika są przechowywane w bazie danych
// Tutaj używamy stałych wartości dla celów demonstracyjnych
$correctUsername = 'user1';
$correctPasswordHash = password_hash('password123', PASSWORD_DEFAULT); // Hasło powinno być hashowane w bazie danych
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if ($username === $correctUsername && password_verify($password, $correctPasswordHash)) {
// Regeneracja ID sesji dla bezpieczeństwa
session_regenerate_id();
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
header("Location: welcome.php");
exit;
} else {
echo "Niepoprawne dane logowania!";
}
}
?>
<form method="post">
Username: <input type="text" name="username"><br>
Password: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
Strona powitalna (welcome.php)
<?php
session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
header("Location: login.php");
exit;
}
echo "Witaj, " . htmlspecialchars($_SESSION['username']) . "!";
echo "<br><a href='logout.php'>Wyloguj się</a>";
?>
Wylogowanie (logout.php)
<?php
<?php
session_start();
// Usuń wszystkie zmienne sesji
$_SESSION = array();
// Zniszcz sesję
session_destroy();
header("Location: login.php");
exit;
?>
Ważne aspekty
- Haszowanie hasła – hasła są hashowane przy użyciu
password_hash
i weryfikowane za pomocąpassword_verify
. Nigdy nie przechowuj ani nie przesyłaj jawnych haseł, jak wspomniano, przykładowy skrypt nie spełnia tych wymagań z uwagi na uproszczenia mające ułatwić zasadę działania. - Regeneracja ID sesji – po pomyślnym logowaniu ID sesji jest regenerowane przez
session_regenerate_id()
. Jest to praktyka zapobiegająca atakom polegającym na przejęciu sesji. - Sprawdzanie statusu logowania – Na stronie
welcome.php
sprawdzamy, czy użytkownik jest zalogowany. Jeśli nie, przekierowujemy go do strony logowania. - Bezpieczeństwo – ten skrypt jest uproszczony i nie obejmuje wielu aspektów bezpieczeństwa, takich jak ochrona przed atakami CSRF, SQL Injection itp.
- Przechowywanie danych użytkownika – w prawdziwych aplikacjach dane użytkownika powinny być przechowywane w bazie danych, a nie jako stałe wartości w kodzie. Dodatkowo hasło powinno być zapisane w postaci zahaszowanej.
Omówienie rozwiązania
Skrypt składa się z trzech głównych części: strony logowania (login.php
), strony powitalnej (welcome.php
) i skryptu wylogowania (logout.php
). Każda z tych części odgrywa określoną rolę w procesie logowania.
Strona logowania (login.php)
Ten plik jest punktem wejścia dla użytkownika, który chce się zalogować. Skrypt obsługuje zarówno wyświetlanie formularza logowania, jak i przetwarzanie danych przesłanych przez użytkownika.
Sesja:
session_start();
Tunkcja session_start()
inicjuje sesję lub wznawia istniejącą. Jest to niezbędne, aby móc używać globalnej zmiennej $_SESSION
, która pozwala przechowywać informacje między różnymi stronami.
Przygotowanie danych do weryfikacji
$correctUsername = 'user1';
$correctPasswordHash = password_hash('password123', PASSWORD_DEFAULT);
Tutaj definiujemy przykładowe dane logowania. W prawdziwej aplikacji te dane powinny pochodzić z bazy danych. Hasło jest haszowane dla bezpieczeństwa.
Obsługa żądania POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
...
}
Ten blok kodu wykonuje się, gdy użytkownik wysyła formularz (metodą POST). Sprawdzamy, czy żądanie do serwera zostało wykonane metodą POST.
Weryfikacja danych użytkownika:
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if ($username === $correctUsername && password_verify($password, $correctPasswordHash)) {
...
}
Pobieramy przesłane dane (username
i password
). Następnie sprawdzamy, czy nazwa użytkownika jest poprawna i czy hasło pasuje do zahaszowanego hasła.
Regeneracja ID sesji
session_regenerate_id();
Jest to środek bezpieczeństwa przeciwko atakom polegającym na przejęciu sesji. Tworzy nowe ID sesji, które jest używane po pomyślnym zalogowaniu.
Ustawienie zmiennych sesji i przekierowanie
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
header("Location: welcome.php");
exit;
Po pomyślnym zalogowaniu ustawiamy zmienne sesji i przekierowujemy użytkownika na stronę powitalną.
Formularz logowania
<form method="post">
Username: <input type="text" name="username"><br>
Password: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
Jest to prosty formularz HTML, który pozwala użytkownikowi wprowadzić swoją nazwę użytkownika i hasło.
Strona powitalna (welcome.php)
Ten plik wyświetla wiadomość powitalną po pomyślnym zalogowaniu się użytkownika.
Weryfikacja sesji
session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
header("Location: login.php");
exit;
}
Ponownie rozpoczynamy sesję i sprawdzamy, czy użytkownik jest zalogowany. Jeśli nie, przekierowujemy go z powrotem do strony logowania.
Wyświetlanie wiadomości powitalnej i linku do wylogowania
echo "Witaj, " . htmlspecialchars($_SESSION['username']) . "!";
echo "<br><a href='logout.php'>Wyloguj się</a>";
Wyświetlamy powitanie dla użytkownika, używając jego nazwy z sesji. Używamy htmlspecialchars
dla bezpieczeństwa, aby zapobiec atakom typu XSS. Udostępniono także link do wylogowania się.
3. Wylogowanie (logout.php)
Ten skrypt kończy sesję użytkownika, efektywnie wylogowując go.
Zakończenie sesji
session_start();
$_SESSION = array();
session_destroy();
Rozpoczynamy sesję, czyścimy zmienne sesji i niszczymy sesję.
Przekierowanie do strony logowania
header("Location: login.php");
exit;
Po zakończeniu sesji przekierowujemy użytkownika z powrotem do strony logowania.
Bezpieczeństwo
Chociaż ten skrypt zawiera podstawowe środki bezpieczeństwa, takie jak haszowanie haseł i regeneracja ID sesji, w prawdziwym środowisku produkcyjnym należy wziąć pod uwagę dodatkowe kwestie, takie jak ochrona przed atakami SQL Injection (przez użycie przygotowanych zapytań), ochrona przed atakami CSRF, walidacja i sanityzacja danych wejściowych oraz inne praktyki związane z bezpieczeństwem aplikacji internetowych.