P-Programowanie

System logowania i rejestracji

Ostatania modyfikacja: 28 września 2017, kategoria: Php

System logowania i rejestracji jest bardzo przydatną funkcjonalnością na każdej stronie. Umożliwia sprawną identyfikację i zarządzanie użytkownikami. Strona ze skryptem logowania nabiera dużej wartości. Zarejestrowani użytkownicy mogą się komunikować, tworzą swoją odrębną społeczność. Często zwiększa to zainteresowania stroną i ruch na niej. Konta mogą mieć dużo funkcjonalności takich jak dodawanie zdjęć, system komentarzy czy ankiety.

Baza danych do przechowywania użytkowników

Informacje dotyczące kont użytkowników najlepiej przechowywać w bazie MySQL. Na prawdę – nie warto bawić się w pliki tekstowe pisząc tak rozbudowane skrypty. Tabela będzie przechowywać podstawowe informacje takie jak id, login, hasło, email, data rejestracji, data logowania oraz adres IP.

Posiadając bazę danych proponuję od razu dodać do niej pierwszego użytkownika – administratora. Dzięki temu od razu będziemy widzieć efekty pracy. Dane logowania to:

Login: admin

Hasło: haslo

Hasło będziemy przechowywać w bazie danych w postaci zakodowanego ciągu MD5. Dzięki temu w razie włamania do serwisu, włamywacz nie będzie posiadał listy haseł, a jedynie ich zakodowane odpowiedniki. Podczas logowania hasło wpisane przez użytkownika także jest od razu kodowane i porównywane z wartością z bazy.

Uwaga! Warto wspomnieć, że w obecnych czasach kodowanie MD5 jest bardzo łatwe do złamania (mimo że jest to kodowanie jednostronne). Z tego powodu, pisząc bezpieczny skrypt należy skorzystać z innej funkcji szyfrującej hasła niż MD5. Dobrym i często stosowanym rozwiązaniem jest także użycie „soli” (z ang. salt). Polega to na szyfrowaniu haseł poddanych jakiejś transformacji tekstu.

Dodajmy konto administratora do bazy danych:

Formularz HTML rejestracji użytkownika

Formularz rejestracji ma za zadanie pobrać od użytkownika niezbędne dane wymagane do utworzenia konta. Dane zostaną wysłane do skryptu PHP metodą POST po kliknięciu w przycisk. Formularz znajduje się w pliku rejestracja.php.

Skrypt rejestracji PHP

Skrypt dopisujmy do tego samego pliku co formularz.  Przed utworzeniem konta, w skrypcie należy wykonać poniższe kroki:

  1. Połączyć się z bazą MySQL
  2. Pobrać i przefiltrować dane formularza z tablicy super globalnej $_POST.
  3. Sprawdzić czy login nie jest zajęty.
  4. Zapisać w bazie danych.
  5. Zamknąć połączenie MySQL.

Zawsze przed zapisem jakichkolwiek danych do bazy danych, należy odpowiednio przygotować zapisywaną zmienną. Inaczej skrypt będzie źle zabezpieczony. Ataki SQL Injection to ciągle jedne  z najczęstszych ataków. Ja utworzyłem specjalną funkcję, która zabezpiecza dane pochodzące od użytkownika:

Formularz HTML logowania użytkownika

Mając gotową rejestrację i strukturę bazy danych, można wziąć się za skrypt logowania. Będzie w nim wymagane użycie sesji. Sesje startuje się na samym początku dokumentu, jeszcze przed kodem HTML. Podobnie jak przy rejestracji, dane są przesyłane do bazy metodą POST. Warto dodać też połączenie z bazą danych na górze dokumentu, tam gdzie startujemy sesję. Nazwa pliku to logowanie.php.

Skrypt PHP odpowiedzialny za logowanie umieścimy w tym samym pliku co formularz. Logując się filtrujemy dane. Następnie sprawdzamy czy określony login i hasło występują w bazie, jeżeli tak – logujemy użytkownika. W momencie logowania należy uaktualnić informacje o użytkowniku czyli datę logowania oraz aktualny adres IP.

Uwagi na koniec

Skrypt jest okrojony. Nie ma sensu ubierać go w bajery ponieważ jest on napisany do celów naukowych. Starałem się napisać jak najkrótszy kod, który będzie w stanie rejestrować/logować oraz który będzie miał jakiekolwiek zabezpieczenia.

W internecie można znaleźć wiele długich gotowców z wieloma funkcjami, ale nie tędy droga. 20 stron a4 przeplatanych kodem HTML trudno jest zrozumieć i przyswoić, a kopiować takich rzeczy nie ma sensu – jeżeli chcesz kopiować to przerzuć się na gotowy system CMS.

Jeżeli chcesz wykorzystać ten skrypt u siebie musisz go ulepszyć. Skrypty PHP trzyma się w osobnych plikach a formularze w osobnych. To samo dotyczy obsługi połączenia z bazą danych. Dodatkowo trzeba bezwzględnie sprawdzać długość wprowadzanych danych! Zabezpieczyć je zarówno od strony HTML ograniczając długość pół formularzy, ale przede wszystkim od strony PHP (funkcja strlen).

Cały skrypt jest dostępny do pobrania na samym dole strony. Jest w nim kompletna rejestracja i logowanie. Po zalogowaniu wyświetla się powitanie i możliwość wylogowania. W tym artykule fragmentu kodu odpowiedzialnego za moment po zalogowaniu i wylogowanie nie umieściłem, ponieważ niepotrzebnie by wszystko skomplikował (a jest bardzo prosty). Podczas testowania skryptu zacznij od utworzenia bazy danych.

Kompletny działający skrypt logowania i rejestracji możesz pobrać klikając w link: http://p-programowanie.pl/pliki/logowanie.rar

Użytkownik WujcioMattt napisał:

24 stycznia 2013


Mysle ze to bardzo fajny pomysl dla tych co nie potrafia robic formularz :) wrecz doskonaly :)

Użytkownik Piotr napisał:

13 października 2013


U mnie za kazdym razem wyskakuje, ze haslo jest zle :(

Użytkownik Karol napisał:

13 października 2013


Przyczyn może być na prawdę wiele. Może nie dodałeś do bazy rekordu z informacjami o koncie administratora?

Użytkownik MaxRooster napisał:

24 listopada 2013


u mnie na stronie logowania pojawia się następujący błąd
Notice: Undefined index: zalogowany in C:\xampp\htdocs\Projekty\zaliczenie\logowanie.php on line 55

Notice: Undefined index: zalogowany in C:\xampp\htdocs\Projekty\zaliczenie\logowanie.php on line 63

Użytkownik Karol napisał:

25 listopada 2013


Witaj. Czyżbyś odpalał stronkę na lokalnym serwerze XAMPP lub WAMP? Tak czy inaczej, błąd oznacza odwołanie się do nie zadeklarowanej zmiennej.

Aby błąd nie wyświetlał się, należy użyć składni:
„if (isset(zmienna))”. Komenda „isset” sprawdza czy zmienna istnieje, zanim nastąpi odwołanie.

Drugim sposobem jest wyłączenie powiadomień o „Undefined index”. Nie jest to błąd, a jedynie zwrócenie uwagi programisty, że coś ze skryptem może być nie tak. Na publicznych hostingach przeważnie takie ostrzeżenia są wyłączone w configu.

Użytkownik szymon napisał:

05 grudnia 2013


Jak to zainstalować?

Użytkownik Wojtek napisał:

07 stycznia 2014


Mam problem, w phpmyadmin w tabeli nie wyświetla mi się data i email ? Ip zaś wyswietla się.

Proszę o pomoc

Użytkownik Karol napisał:

07 stycznia 2014


Problem występuje po zarejestrowaniu nowego konta? Co z pozostałymi polami? Login hasło?

Użytkownik wojtek napisał:

07 stycznia 2014


Pozostałe pola w porządku

Użytkownik Karol napisał:

07 stycznia 2014


Jeżeli nie wyświetla się żaden błąd, ciężko stwierdzić co może być przyczyną. Sprawdź co zwracają poszczególne zmienne przez zapisaniem ich w bazie. Być może zmieniłeś nazwy pól formularzy. Sprawdź czy funkcja [em]time()[/em], zwraca jakąś wartość. Polecam wrzucenie Twojego kodu formularza i skryptu PHP na jakieś forum, szybko wyłapią Twój błąd.

Użytkownik afasd napisał:

10 lutego 2014


„Hasło jest zakodowane w MD5”
hihihi :D

Użytkownik Maksio napisał:

24 lutego 2014


Gdzie mam wklejić do phpmyadmin:
CREATE TABLE IF NOT EXISTS uzytkownicy (
id int(10) NOT NULL AUTO_INCREMENT,
login varchar(255) NOT NULL,
haslo varchar(255) NOT NULL,
email varchar(255) NOT NULL,
rejestracja int(10) NOT NULL,
logowanie int(10) NOT NULL,
ip varchar(15) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Użytkownik Karol napisał:

24 lutego 2014


Po wybraniu interesującej Cię bazy danych, w phpmyadmin pojawia się na poziomej belce pozycja SQL.

Możesz tam napisać/wkleić dowolny kod SQL dotyczących Twoich tabel. Poniżej jest także przycisk „Wykonaj”, aby przetworzyć zapytanie.

Użytkownik Piotr napisał:

17 marca 2014


A czy przypadkiem funkcja „stripslashes” oprócz usuwania pojedynczych nie zamienia podwójnych backslashy na pojedyncze? :-) Może bezpieczeniej byłoby przefiltrować zmienne dwa razy, żeby żaden się nie przedostał?

Sam skrypt bardzo przydatny, właśnie mi się przydał :-)

Użytkownik Mateusz napisał:

28 października 2015


Mam jeden problem z formularzem rejestracji. Po wprowadzeniu danych do formularza i kliknięciu przycisku, zamiast komunikatu o pomyślnej/nieudanej rejestracji, w przeglądarce pokazuje mi się… cały napisany kod php. Co może być nie tak?

Użytkownik Admez napisał:

31 października 2015


Czemu zawsze łączy się z tabelą jako „admin, haslo”? I czemu jest localhost? Gdybym normalnie napisał to na stronę, to by wszystko dobrze działało?

Użytkownik Mariusz napisał:

10 listopada 2015


Witam mam pytanko ;) Tworze walsnie system logowania. jak sprawdzic czy haslo zawiera duze litery i cyfry??

Użytkownik Karol napisał:

10 listopada 2015


Najsensowniejszym rozwiązaniem jest użycie wyrażeń regularnych sprawdzających czy ciąg znaków (hasło) spełnia wzorzec np. chociaż jedna duża litera i cyfra. Przykłady znajdziesz w internecie.

Użytkownik Artur napisał:

05 stycznia 2016


Czy taką strukturę bazy danych (jako tekst) można dodać poprzez skopiowanie tego tekstu:

CREATE TABLE IF NOT EXISTS uzytkownicy (
id int(10) NOT NULL AUTO_INCREMENT,
login varchar(255) NOT NULL,
haslo varchar(255) NOT NULL,
email varchar(255) NOT NULL,
rejestracja int(10) NOT NULL,
logowanie int(10) NOT NULL,
ip varchar(15) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

do phpmyadmin ?
Czy trzeba ręcznie ją tworzyć? Coś mi nie chce do końca działać i szukam błędu ..

Użytkownik Karol napisał:

05 stycznia 2016


Zamień te dziwne znaki ograniczające zmienne tekstowe na zwykłe apostrofy albo cudzysłowy.

Użytkownik Bartek napisał:

17 lutego 2016


Witam
Mam problem z rejestracja.php. Wyskakują mi aż 4 błędy takie same (co ciekawe dla tej samej linijki).
Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, string given in C:\xampp\htdocs\Projekt\rejestracja.php on line 28
Szczerze mowiac nie wiem co mam z tym zrobic. Probowałem tworzyc zmienna $con i przypisywac ja do polaczenia z baza i potem wstawiac ja do tej linijki . Jednak chyba nie w tym problem .

Użytkownik Bartek napisał:

17 lutego 2016


Dodam jeszcze ,że musiałem pozmieniać nazwy operacji z mysql na mysqli. Może to jest powodem takiej sytuacji

Użytkownik stikleez napisał:

10 maja 2016


Jak wpisuje byle co to i tak zalogowuje się :-(

Użytkownik King napisał:

28 kwietnia 2017


Nie moge przejsc przez logowanie. Dostaje komentarz zle haslo lub login pomimo iz istnieje taki uzutkownik i haslo. Czy musi byc jakis kod w connection.php zeby polaczyc login page z baza danych oprocz servera username password i dbname i standardowego sql kodu live or die???

Użytkownik Karol napisał:

28 kwietnia 2017


Nie jest wymagany żaden dodatkowy kod. Hasło w bazie danych musi być zakodowane, inaczej logowanie się nie uda.

Użytkownik Sławek napisał:

12 listopada 2017


Witam a mam pytanie chciałem użyć Pana skryptu do wewnętrznego projektu , ale jako średnio znający się na pehape potrzebuję podpowiedzi po otwarciu sesji chce aby zalodowany user mial dostęp do zawartości strony składającej się z kilku plików , ale po wylogowaniu chciałbym aby krzyczało mu że aby mieć dostęp trzeba się zalogować. Jak to zrobić poprawnie ? Będę wdzięczny za pomoc

Użytkownik Karol napisał:

14 listopada 2017


@Sławek
Nie powinno się samemu pisać mechanizmów autoryzacyjnych, szczególnie średnio umiejąc PHP. Pomijając fakt zmarnowania dużej ilości czasu, będzie to mechanizm podatny na włamania. Autor strony odpowiada wtedy prawnie za dane użytkowników, które zostaną skradzione. Dodatkowo, włamanie bardzo często wiąże się z utratą strony, zainstalowaniem na niej złośliwych skryptów, co z kolei wiążę się z usunięciem z wyszukiwarki Google. Istnieją gotowe platformy i rozwiązania umożliwiające autoryzację – pisane przez ekspertów. Większość popularnych CMSów umożliwia jakąś formę autoryzacji.

Użytkownik Andrzej napisał:

30 listopada 2017


Po dodaniu „isset” do if (isset($_SESSION[‚zalogowany’])==true) opcja wyloguj nie działa.

Użytkownik Andgelika napisał:

10 grudnia 2017


Witam, jak wykonać poniższe punkty?
1.Pobrać i przefiltrować dane formularza z tablicy super globalnej $_POST.
2.Sprawdzić czy login nie jest zajęty.
3.Zapisać w bazie danych.
Na dodatek utworzenie konta kończy się wyświetlonym kodem php na osobnej stronie

Użytkownik Robert napisał:

27 kwietnia 2018


A możesz podpowiedzieć jak to najprpsiciej zrobić aby hasła były zabezpieczone solą?

Zachęcam Cię do zostawienia komentarza!

Ilość znaków: 0