Lekcja 14. Rejestracja użytkownika (formularz, baza danych, hasło)
Trudny / egzaminacyjnyPo 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
Napisz formularz rejestracji z polami e-mail i hasło oraz skrypt zapisujący dane do tabeli Uzytkownicy z zahaszowanym hasłem.
Rozbuduj rejestrację o pole "imię" oraz walidację e-maila (filter_var z Lekcji 8) przed zapisem.
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.