Autentykacja użytkowników - podstawy
Wprowadzenie
Dział zatytułowany „Wprowadzenie”Autentykacja to proces weryfikacji tozsamosci użytkownika - odpowiada na pytanie “Kim jestes?”. Jest to pierwszy krok w zabezpieczaniu aplikacji webowych, niezbedny przed udostepnieniem chronionych zasobow.
Nie należy mylic autentykacji z autoryzacja:
- Autentykacja - weryfikacja tozsamosci (login)
- Autoryzacja - sprawdzenie uprawnien (co możesz robić)
Kluczowe pojecia
Dział zatytułowany „Kluczowe pojecia”Dane uwierzytelniajace (Credentials)
Dział zatytułowany „Dane uwierzytelniajace (Credentials)”Informacje używane do potwierdzenia tozsamosci:
- Login i hasło (najczesciej)
- Token (np. JWT)
- Certyfikat
- Dane biometryczne
Jednokierunkowa funkcja przekształcająca dane w unikalny ciag znakow:
hasło123 → $2y$10$N9qo8uLOickgx2ZMRZoMy...Mechanizm przechowywania informacji o zalogowanym uzytkowniku miedzy zadaniami HTTP.
Ciag znakow reprezentujacy tozsamosc użytkownika (np. JWT).
Jak działa autentykacja?
Dział zatytułowany „Jak działa autentykacja?”┌─────────────────┐ ┌─────────────────┐│ UZYTKOWNIK │ │ SERWER │└────────┬────────┘ └────────┬────────┘ │ │ │ 1. Formularz: login + hasło │ │ ────────────────────────────────► │ │ │ │ 2. Znajdz usera w bazie │ 3. Porownaj hash hasła │ 4. Utworz sesje │ │ │ 5. Set-Cookie: PHPSESSID=abc123 │ │ ◄──────────────────────────────── │ │ │ │ 6. Nastepne zadanie z cookie │ │ ────────────────────────────────► │ │ │ │ 7. Serwer rozpoznaje użytkownika │ │ ◄──────────────────────────────── │Hashowanie haseł
Dział zatytułowany „Hashowanie haseł”Dlaczego hashujemy hasła?
Dział zatytułowany „Dlaczego hashujemy hasła?”PLAIN TEXT (ZLE):| id | username | password ||----|----------|-------------|| 1 | jan | hasło123 | ← Widoczne dla atakujacego!| 2 | anna | qwerty |
HASH (DOBRZE):| id | username | password_hash ||----|----------|----------------------------------------|| 1 | jan | $2y$10$N9qo8uLOickgx2ZMRZoMyeE3... || 2 | anna | $2y$10$vI8aWBnW3fID.ZQ4/zo1G.q1... |Hashowanie w PHP
Dział zatytułowany „Hashowanie w PHP”<?php// REJESTRACJA - hashowanie hasła$hasło = $_POST['password'];$hash = password_hash($hasło, PASSWORD_DEFAULT);
// Zapisz $hash do bazy danych$stmt = $pdo->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)");$stmt->execute([$_POST['username'], $hash]);<?php// LOGOWANIE - weryfikacja hasła$hasło = $_POST['password'];$username = $_POST['username'];
// Pobierz hash z bazy$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");$stmt->execute([$username]);$user = $stmt->fetch();
// Porownaj hasło z hashemif ($user && password_verify($hasło, $user['password_hash'])) { // Hasło poprawne - zaloguj użytkownika session_start(); $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = $user['username'];} else { // Hasło niepoprawne echo "Błędny login lub hasło";}Mechanizm sesji
Dział zatytułowany „Mechanizm sesji”Jak działa sesja?
Dział zatytułowany „Jak działa sesja?”- Użytkownik loguje się poprawnie
- Serwer tworzy sesje i generuje unikalny identyfikator (PHPSESSID)
- ID sesji jest wysyłane do przegladarki jako cookie
- Przegladarka wysyła cookie z każdym żądaniem
- Serwer odczytuje sesje i wie kim jest użytkownik
Implementacja sesji w PHP
Dział zatytułowany „Implementacja sesji w PHP”<?php// Rozpoczecie sesji (na początku każdej strony)session_start();
// Sprawdzenie czy użytkownik jest zalogowanyif (!isset($_SESSION['user_id'])) { header('Location: /login.php'); exit;}
// Dostep do danych sesjiecho "Witaj, " . $_SESSION['username'];
// Wylogowaniefunction logout() { session_start(); session_unset(); // Usun wszystkie zmienne session_destroy(); // Zniszcz sesje setcookie(session_name(), '', time() - 3600); // Usun cookie}Ataki na autentykacje
Dział zatytułowany „Ataki na autentykacje”Brute Force
Dział zatytułowany „Brute Force”Proba odgadniecia hasła przez wielokrotne logowanie:
Proba 1: hasło = "123456" → BłędneProba 2: hasło = "password" → BłędneProba 3: hasło = "qwerty" → Błędne...Proba N: hasło = "hasło123" → Sukces!Obrona:
<?php// Blokada po 5 nieudanych probach$attempts = getLoginAttempts($_POST['username']);
if ($attempts >= 5) { echo "Konto zablokowane na 15 minut"; exit;}Session Hijacking
Dział zatytułowany „Session Hijacking”Kradziez ID sesji przez atakujacego.
Obrona:
<?php// Regeneruj ID sesji po zalogowaniusession_regenerate_id(true);
// Sprawdzaj IP i User-Agent$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];SQL Injection
Dział zatytułowany „SQL Injection”Wstrzykiwanie złośliwego SQL:
Username: admin' OR '1'='1Password: cokolwiekObrona:
<?php// ZAWSZE uzywaj prepared statements$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");$stmt->execute([$_POST['username']]);Dobre praktyki
Dział zatytułowany „Dobre praktyki”Wymagania dotyczace haseł
Dział zatytułowany „Wymagania dotyczace haseł”<?phpfunction walidujHaslo($password) { if (strlen($password) < 8) { return "Hasło musi mieć min. 8 znakow"; } if (!preg_match('/[A-Z]/', $password)) { return "Hasło musi zawierac wielka litere"; } if (!preg_match('/[0-9]/', $password)) { return "Hasło musi zawierac cyfre"; } return true;}Bezpieczna konfiguracja sesji
Dział zatytułowany „Bezpieczna konfiguracja sesji”<?php// php.ini lub .htaccessini_set('session.cookie_httponly', 1); // Brak dostepu z JSini_set('session.cookie_secure', 1); // Tylko HTTPSini_set('session.use_strict_mode', 1); // Odrzucaj nieznane IDNajczestsze błędy
Dział zatytułowany „Najczestsze błędy”Podsumowanie
Dział zatytułowany „Podsumowanie”- Autentykacja weryfikuje tozsamosc użytkownika
- Hasła musza być hashowane (password_hash w PHP)
- Weryfikacja hasła przez password_verify()
- Sesje przechowuja informacje o zalogowanym uzytkowniku
- Chron się przed brute force, session hijacking i SQL injection
- Uzywaj HTTPS i bezpiecznych ustawien cookie
PHP: password_hash Dokumentacja funkcji hashowania
OWASP Authentication Najlepsze praktyki bezpieczeństwa
PHP Sessions Dokumentacja sesji w PHP