System Logowania (Sesje)
Zadanie 101: System Logowania i Bezpieczeństwo
Wstęp
W tym zadaniu zbudujesz fundamenty bezpieczeństwa aplikacji webowych: system logowania i rejestracji. Nauczysz się, jak łączyć PHP z bazą danych MySQL, jak bezpiecznie przechowywać hasła użytkowników (nigdy jawnym tekstem!) oraz jak wykorzystać mechanizm sesji do zapamiętywania zalogowanego użytkownika pomiędzy przeładowaniami strony. To kluczowe skillsy dla każdego back-end developera.
Cel zadania
Stworzenie prostej aplikacji z chronionym panelem, do którego dostęp mają tylko zalogowani użytkownicy.
Wymagania techniczne
- Baza danych: Tabela
usersz kolumnamiid,username,password(hash). - Bezpieczeństwo: Hasła muszą być hashowane (np. funkcją
password_hash). - Mechanizm: Użycie zmiennej superglobalnej
$_SESSION.
Kroki do wykonania
1. Przygotowanie Bazy Danych
Stwórz bazę danych (np. kurs_php) i tabelę users.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Dodaj ręcznie jednego użytkownika testowego (pamiętaj, że hasło w bazie musi być hashem! Możesz wygenerować hash np. w PHP funkcją password('tajnehaslo', PASSWORD_DEFAULT) i wkleić go do bazy w phpMyAdmin, lub napisać krótki skrypt rejestracji).
[!IMPORTANT] Commit 1: Stworzenie struktury bazy danych (zapisz zapytania SQL w pliku np.
db.sql).
2. Połączenie z Bazą Danych
Stwórz plik db.php, który będzie łączył się z Twoją bazą danych (użyj PDO lub mysqli).
<?php
$host = 'localhost';
$db = 'kurs_php';
$user = 'root';
$pass = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Błąd połączenia: " . $e->getMessage());
}
?>
[!IMPORTANT] Commit 2: Utworzenie pliku połączenia z bazą.
3. Formularz Logowania
Stwórz plik index.php (lub login.php). Powinien zawierać prosty formularz HTML z polami login i password.
<form action="login.php" method="POST">
<label>Login: <input type="text" name="login"></label>
<label>Hasło: <input type="password" name="password"></label>
<button type="submit">Zaloguj</button>
</form>
[!IMPORTANT] Commit 3: Stworzenie formularza logowania HTML.
4. Logika Logowania (Weryfikacja)
W pliku obsługującym formularz (np. login.php):
- Odbierz dane z
$_POST. - Pobierz z bazy użytkownika o podanym loginie.
- Sprawdź poprawność hasła używając
password_verify($haslo_z_formularza, $hash_z_bazy). - Jeśli OK:
- Rozpocznij sesję:
session_start(). - Zapisz ID lub login usera do sesji:
$_SESSION['user_id'] = $user['id']. - Przekieruj do panelu:
header('Location: dashboard.php').
- Rozpocznij sesję:
- Jeśli BŁĄD: Wyświetl komunikat "Błędny login lub hasło".
[!IMPORTANT] Commit 4: Implementacja logiki weryfikacji użytkownika.
5. Panel Użytkownika (Ochrona Zasobów)
Stwórz plik dashboard.php. Na samym początku tego pliku musisz sprawdzić, czy użytkownik jest zalogowany.
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: index.php'); // Brak sesji? Wypad do logowania!
exit();
}
?>
<h1>Witaj w tajnym panelu!</h1>
<p>Jesteś zalogowany.</p>
<a href="logout.php">Wyloguj się</a>
[!IMPORTANT] Commit 5: Stworzenie chronionej strony dashboard.
6. Wylogowanie
Stwórz logout.php, który niszczy sesję i przekierowuje do logowania.
<?php
session_start();
session_unset();
session_destroy();
header('Location: index.php');
[!IMPORTANT] Commit 6: Implementacja wylogowania.
Git Help - Jak commitować?
Pamiętaj o regularnym zapisywaniu postępów (commitowaniu).
- Konfiguracja (jeśli robisz to pierwszy raz): Otwórz terminal w folderze projektu i wpisz (podstawiając sw