Przejdź do głównej zawartości

Autentykacja użytkowników - podstawy

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ć)

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).

┌─────────────────┐ ┌─────────────────┐
│ 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 │
│ ◄──────────────────────────────── │
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... |
<?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 hashem
if ($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";
}
  1. Użytkownik loguje się poprawnie
  2. Serwer tworzy sesje i generuje unikalny identyfikator (PHPSESSID)
  3. ID sesji jest wysyłane do przegladarki jako cookie
  4. Przegladarka wysyła cookie z każdym żądaniem
  5. Serwer odczytuje sesje i wie kim jest użytkownik
<?php
// Rozpoczecie sesji (na początku każdej strony)
session_start();
// Sprawdzenie czy użytkownik jest zalogowany
if (!isset($_SESSION['user_id'])) {
header('Location: /login.php');
exit;
}
// Dostep do danych sesji
echo "Witaj, " . $_SESSION['username'];
// Wylogowanie
function logout() {
session_start();
session_unset(); // Usun wszystkie zmienne
session_destroy(); // Zniszcz sesje
setcookie(session_name(), '', time() - 3600); // Usun cookie
}

Proba odgadniecia hasła przez wielokrotne logowanie:

Proba 1: hasło = "123456" → Błędne
Proba 2: hasło = "password" → Błędne
Proba 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;
}

Kradziez ID sesji przez atakujacego.

Obrona:

<?php
// Regeneruj ID sesji po zalogowaniu
session_regenerate_id(true);
// Sprawdzaj IP i User-Agent
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];

Wstrzykiwanie złośliwego SQL:

Username: admin' OR '1'='1
Password: cokolwiek

Obrona:

<?php
// ZAWSZE uzywaj prepared statements
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_POST['username']]);
<?php
function 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;
}
<?php
// php.ini lub .htaccess
ini_set('session.cookie_httponly', 1); // Brak dostepu z JS
ini_set('session.cookie_secure', 1); // Tylko HTTPS
ini_set('session.use_strict_mode', 1); // Odrzucaj nieznane ID
  • 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