Dataniedziela, 9 sierpnia 2026 Czas07:30:45
← Aplikacje internetowe (PHP)

Lekcja 14. Rejestracja użytkownika (formularz, baza danych, hasło)

Trudny / egzaminacyjny

Po co się tego uczymy?

Każdy prawdziwy serwis internetowy z kontami użytkowników — a Twój projekt serwisu filmowego na pewno taki jest — zaczyna się od rejestracji. To też pierwsza lekcja, w której dotykasz prawdziwego, poważnego bezpieczeństwa: przechowywania haseł.

Teoria

Rejestracja łączy wszystko, czego się do tej pory nauczyłeś: formularz (Lekcja 7), walidację (Lekcja 8) i zapis do bazy (Lekcja 10) — z jednym bardzo ważnym dodatkiem: hasła NIGDY nie zapisuje się w bazie danych jako zwykły tekst.

PHP ma wbudowaną, gotową funkcję do bezpiecznego "haszowania" haseł: password_hash($haslo, PASSWORD_DEFAULT) — zamienia hasło w długi, nieczytelny ciąg znaków, z którego nie da się (praktycznie) odtworzyć oryginalnego hasła. To właśnie ten zahaszowany ciąg zapisujesz do bazy, NIGDY oryginalnego hasła.

Do sprawdzania hasła przy logowaniu (Lekcja 15) służy funkcja password_verify($wpisaneHaslo, $hashZBazy) — porównuje wpisane hasło z zapisanym hashem i zwraca true/false.

Warto też sprawdzić PRZED rejestracją, czy e-mail nie jest już zajęty (zapytanie SELECT sprawdzające, czy taki e-mail już istnieje w tabeli).

Przykład z życia

Zakładając konto w dowolnym serwisie internetowym, nigdy nie zobaczysz swojego hasła "z powrotem" — administrator strony też go nie widzi w bazie danych, tylko jego zahaszowaną wersję. To standard branżowy, którego nauczysz się stosować od pierwszej napisanej rejestracji.

Kod (PHP)

<?php
$polaczenie = mysqli_connect("localhost", "root", "", "serwis_filmowy");

if (isset($_POST["email"]) && isset($_POST["haslo"])) {
    $email = mysqli_real_escape_string($polaczenie, $_POST["email"]);
    $haslo = $_POST["haslo"];

    // sprawdzenie, czy e-mail jest już zajęty
    $sprawdzenie = mysqli_query($polaczenie, "SELECT id_uzytkownika FROM Uzytkownicy WHERE email = '$email'");

    if (mysqli_num_rows($sprawdzenie) > ) {
        echo "Ten adres e-mail jest już zarejestrowany.";
    } elseif (strlen($haslo) < 8) {
        echo "Hasło musi mieć co najmniej 8 znaków.";
    } else {
        $hashHasla = password_hash($haslo, PASSWORD_DEFAULT);

        $zapytanie = "INSERT INTO Uzytkownicy (email, haslo) VALUES ('$email', '$hashHasla')";

        if (mysqli_query($polaczenie, $zapytanie)) {
            echo "Rejestracja zakończona sukcesem! Możesz się teraz zalogować.";
        } else {
            echo "Błąd rejestracji: " . mysqli_error($polaczenie);
        }
    }
}

mysqli_close($polaczenie);

Komentarz i wyjaśnienie kodu

Zapytanie SELECT sprawdzające zajęty e-mail wykonuje się PRZED próbą rejestracji — to zapobiega dwóm kontom na ten sam adres. password_hash($haslo, PASSWORD_DEFAULT) tworzy bezpieczny hash — PASSWORD_DEFAULT oznacza "użyj najlepszego dostępnego obecnie algorytmu", co jest zalecane zamiast wybierania konkretnego algorytmu ręcznie. Do bazy trafia $hashHasla, NIGDY oryginalne $haslo — nawet Ty, jako twórca strony, nie jesteś w stanie odczytać hasła użytkownika z bazy danych.

Ćwiczenie samodzielne

Dodaj do formularza rejestracji pole "powtórz hasło" i sprawdź (przed haszowaniem), czy oba pola są identyczne.

Zadania do pracy własnej

  1. Napisz formularz rejestracji z polami e-mail i hasło oraz skrypt zapisujący dane do tabeli Uzytkownicy z zahaszowanym hasłem.

  2. Rozbuduj rejestrację o pole "imię" oraz walidację e-maila (filter_var z Lekcji 8) przed zapisem.

  3. Zbuduj kompletny formularz rejestracji z polami: imię, e-mail, hasło, powtórz hasło — z pełną walidacją (niepuste pola, poprawny e-mail, zgodność haseł, minimalna długość hasła, sprawdzenie unikalności e-maila w bazie) i czytelnymi komunikatami błędów dla każdego przypadku osobno.

Typowe błędy

Najpoważniejszy możliwy błąd to zapisanie hasła do bazy BEZ haszowania (zwykłym tekstem) — to poważna luka bezpieczeństwa, nawet w projekcie szkolnym warto wyrobić sobie dobry nawyk. Drugi błąd: brak sprawdzenia unikalności e-maila przed rejestracją, co prowadzi do wielu kont na ten sam adres (chyba że kolumna email ma UNIQUE w bazie — wtedy INSERT zwyczajnie się nie uda, ale lepiej sprawdzić to wcześniej i dać czytelny komunikat). Trzeci: mylenie password_hash z funkcjami takimi jak md5() czy sha1() — te ostatnie są dziś uznawane za niewystarczająco bezpieczne do haseł.

Nawiązanie do egzaminu zawodowego

To rozwinięcie efektów INF.03.5.4.4-5 w praktycznym, kompletnym scenariuszu — rejestracja użytkownika to jeden z najbardziej rozpoznawalnych "pełnych" projektów aplikacji internetowej, jakie mogą pojawić się w części praktycznej egzaminu.