Dom Stomatologia dziecięca Rejestracja wykonawcza php. Prosty system rejestracji użytkowników

Rejestracja wykonawcza php. Prosty system rejestracji użytkowników

Utworzenie witryny opartej na członkostwie wydaje się początkowo trudnym zadaniem. Jeśli kiedykolwiek chciałeś zrobić to sam, ale poddałeś się, gdy zacząłeś myśleć, jak to połączyć, korzystając ze swoich umiejętności PHP, ten artykuł jest dla Ciebie. Przeprowadzimy Cię przez każdy aspekt tworzenia witryny opartej na członkostwie, z bezpieczną strefą członkowską chronioną hasłem.

Cały proces składa się z dwóch dużych części: rejestracji użytkownika i uwierzytelnienia użytkownika. W pierwszej części zajmiemy się tworzeniem formularza rejestracyjnego i przechowywaniem danych w bazie MySQL. W drugiej części utworzymy formularz logowania i za jego pomocą umożliwimy użytkownikom dostęp do bezpiecznego obszaru.

Pobierz kod

Cały kod źródłowy systemu rejestracji/logowania możesz pobrać pod linkiem poniżej:

Konfiguracja i przesyłanie
Plik ReadMe zawiera szczegółowe instrukcje.

Otworzyć źródło\include\membersite_config.php plik w edytorze tekstu i zaktualizuj konfigurację. (Login do bazy danych, nazwa Twojej witryny, adres e-mail itp.).

Prześlij całą zawartość katalogu. Przetestuj rejestr.php, przesyłając formularz.

Formularz rejestracyjny

Aby założyć konto użytkownika, musimy zebrać od użytkownika minimalną ilość informacji. Potrzebujemy jego imienia i nazwiska, adresu e-mail oraz żądanej nazwy użytkownika i hasła. Oczywiście w tym momencie możemy poprosić o więcej informacji, ale długi formularz zawsze zniechęca. Ograniczmy się więc tylko do tych dziedzin.

Oto formularz rejestracyjny:

Rejestr

Mamy więc pola tekstowe na imię i nazwisko, adres e-mail i hasło. Pamiętaj, że używamy dla lepszej użyteczności.

Walidacja formularza

W tym momencie warto umieścić jakiś kod weryfikacyjny formularza, dzięki czemu upewnimy się, że posiadamy wszystkie dane potrzebne do założenia konta użytkownika. Musimy sprawdzić, czy imię i nazwisko oraz adres e-mail i hasło zostały wpisane oraz czy wiadomość e-mail ma odpowiedni format.

Obsługa przesyłania formularza

Teraz musimy zająć się przesłanymi danymi formularza.

Oto sekwencja (zobacz plik fg_membersite.php w pobranym źródle):

funkcja RegisterUser() ( if(!isset($_POST["przesłany"])) (zwróć false; ) $formvars = array(); if(!$this->ValidateRegistrationSubmission()) (zwróć false; ) $this- >CollectRegistrationSubmission($formvars); if(!$this->SaveToDatabase($formvars)) (zwróć wartość false; ) if(!$this->SendUserConfirmationEmail($formvars)) (zwróć wartość false; ) $this->SendAdminIntimationEmail($ formvars); zwróć wartość true; )

Najpierw zatwierdzamy przesłanie formularza. Następnie zbieramy i „oczyszczamy” dane przesłane z formularza (zawsze rób to przed wysłaniem wiadomości e-mail, zapisaniem w bazie danych itp.). Przesłany formularz jest następnie zapisywany w tabeli bazy danych. Wysyłamy e-mail do użytkownika z prośbą o potwierdzenie. Następnie informujemy administratora, że ​​użytkownik się zarejestrował.

Zapisywanie danych w bazie danych

Teraz, gdy zebraliśmy już wszystkie dane, musimy zapisać je w bazie danych.
Oto jak zapisujemy przesłane formularze do bazy danych.

funkcja SaveToDatabase(&$formvars) ( if(!$this->DBLogin()) ( $this->HandleError("Logowanie do bazy danych nie powiodło się!"); return false; ) if(!$this->Ensuretable()) ( return false; ) if(!$this->IsFieldUnique($formvars,"email")) ( $this->HandleError("Ten e-mail jest już zarejestrowany"); return false; ) if(!$this->IsFieldUnique( $formvars,"username")) ( $this->HandleError("Ta nazwa użytkownika jest już używana. Spróbuj użyć innej nazwy użytkownika"); return false; ) if(!$this->InsertIntoDB($formvars)) ( $this- >HandleError("Wstawianie do bazy danych nie powiodło się!"); return false; ) return true; )

Pamiętaj, że dane logowania do bazy danych zostały skonfigurowane w pliku membersite_config.php. W większości przypadków można użyć „localhost” jako hosta bazy danych.
Po zalogowaniu sprawdzamy, czy tabela istnieje. (Jeśli nie, skrypt utworzy wymaganą tabelę).
Następnie upewniamy się, że nazwa użytkownika i adres e-mail są unikalne. Jeśli nie jest unikalny, zwracamy błąd użytkownikowi.

Struktura tabeli bazy danych

Taka jest struktura tabeli. Funkcja CreateTable() w pliku fg_membersite.php tworzy tabelę. Oto kod:

funkcja CreateTable() ( $qry = "Utwórz tabelę $this->nazwa tabeli (". "id_user INT NOT NULL AUTO_INCREMENT", "nazwa VARCHAR(128) NOT NULL", "e-mail VARCHAR(64) NOT NULL", " "numer_telefonu VARCHAR(16) NOT NULL ”, „nazwa użytkownika VARCHAR(16) NOT NULL”, „hasło VARCHAR(32) NOT NULL”, „kod potwierdzenia VARCHAR(32)”, „KLUCZ PODSTAWOWY (id_użytkownika).” „)”; if( !mysql_query($qry,$this->connection)) ( $this->HandleDBError("Błąd podczas tworzenia tabeli \nzapytania był\n $qry"); return false; ) return true; )

Pole id_user będzie zawierać unikalny identyfikator użytkownika i jest jednocześnie kluczem podstawowym tabeli. Zwróć uwagę, że w polu hasła dopuszczamy 32 znaki. Robimy to, ponieważ jako dodatkowy środek bezpieczeństwa będziemy przechowywać hasło w bazie danych zaszyfrowane przy użyciu MD5. Należy pamiętać, że ponieważ MD5 jest metodą szyfrowania jednokierunkowego, nie będziemy w stanie odzyskać hasła, jeśli użytkownik je zapomni.

Wstawienie rejestracji do tabeli

Oto kod, którego używamy do wstawiania danych do bazy danych. Wszystkie nasze dane będą dostępne w tablicy $formvars.

funkcja InsertIntoDB(&$formvars) ( $confirmcode = $this->MakeConfirmationMd5($formvars["email"]); $insert_query = "wstaw do ".$this->nazwa tabeli."(nazwa, adres e-mail, nazwa użytkownika, hasło, kod potwierdzenia) wartości („” . $this->SanitizeForSQL($formvars["nazwa"]) . "", "" . $this->SanitizeForSQL($formvars["email"]) . "", "" .$ this->SanitizeForSQL($formvars["nazwa użytkownika"]) . "", "" .md5($formvars["hasło"]) . "", "" . $confirmcode . """; if(! mysql_query( $insert_query ,$this->połączenie)) ( $this->HandleDBError("Błąd podczas wstawiania danych do tabeli\nquery:$insert_query"); return false; ) return true; )

Zauważ, że używamy funkcji PHP md5() do szyfrowania hasła przed wstawieniem go do bazy danych.
Tworzymy również unikalny kod potwierdzający z adresu e-mail użytkownika.

Wysyłać maile

Teraz, gdy mamy rejestrację w naszej bazie danych, wyślemy użytkownikowi wiadomość e-mail z potwierdzeniem. Aby zakończyć proces rejestracji, użytkownik musi kliknąć łącze w wiadomości e-mail z potwierdzeniem.

funkcja SendUserConfirmationEmail(&$formvars) ( $mailer = new PHPMailer(); $mailer->CharSet = "utf-8"; $mailer->AddAddress($formvars["email"],$formvars["nazwa"]) ; $mailer->Subject = "Twoja rejestracja w ".$this->sitename; $mailer->From = $this->GetFromAddress(); $confirmcode = urlencode($this->MakeConfirmationMd5($formvars["email" ])); $confirm_url = $this->GetAbsoluteURLFolder()."/confirmreg.php?code=".$confirmcode; $mailer->Body ="Witajcie ".$formvars["name"]."\r\ n\r\n". "Dziękujemy za rejestrację w ".$this->sitename."\r\n". "Kliknij poniższy link, aby potwierdzić rejestrację.\r\n." "$confirm_url\r \n". "\r\n". "Pozdrowienia,\r\n". "Webmaster\r\n". $this->sitename; if(!$mailer->Send()) ( $this-> HandleError("Nie udało się wysłać e-maila z potwierdzeniem rejestracji."); return false; ) return true; )

Aktualizacje

9 stycznia 2012 r
Dodano funkcje Resetuj hasło/Zmień hasło
Kod jest teraz udostępniany w GitHubie.

Witamy spowrotemPełna nazwa użytkownika(); ?>!

Licencja


Kod udostępniany jest na licencji LGPL. Można go swobodnie używać na komercyjnych i niekomercyjnych stronach internetowych.

Brak pokrewnych postów.

Komentarze do tego wpisu są zamknięte.

Aby podzielić odwiedzających witrynę na określone grupy, na stronie należy zainstalować mały system rejestracja w php. W ten sposób warunkowo dzielisz odwiedzających na dwie grupy po prostu przypadkowych gości i na bardziej uprzywilejowaną grupę użytkowników, którym przekazujesz bardziej wartościowe informacje.

W większości przypadków stosuje się bardziej uproszczony system rejestracji, który jest napisany w php w jednym pliku zarejestruj się.php.

No to trochę odeszliśmy i teraz przyjrzymy się bliżej plikowi rejestracyjnemu.

Plik Register.php

Aby nie zajmowało to dużo Twojego czasu, stworzymy system, który będzie zbierał użytkowników, przyjmując od nich minimalne dane kontaktowe. W tym wypadku wszystko wpiszemy do bazy mysql. Aby uzyskać jak największą prędkość bazy danych, tabelę użytkowników utworzymy w formacie MyISAM i w kodowaniu utf-8.

Notatka! Wszystkie skrypty muszą być zawsze napisane w tym samym kodowaniu. Wszystkie pliki witryny i baza danych MySql muszą mieć to samo kodowanie. Najpopularniejsze kodowania to UTF-8 i Windows-1251.

Dlaczego musisz pisać wszystko w jednym kodowaniu, porozmawiamy o tym później. Na razie traktuj te informacje jako ścisłą zasadę tworzenia skryptów, w przeciwnym razie będziesz mieć problemy ze skryptami w przyszłości. Oczywiście jest w porządku, ale stracisz mnóstwo czasu na szukanie błędów w skrypcie.

Jak będzie działał sam skrypt?

Chcemy wszystko uprościć i uzyskać szybkie rezultaty. Dlatego od użytkowników otrzymamy jedynie login, adres e-mail i hasło. Aby chronić się przed robotami spamującymi, zainstalujemy małą captcha. W przeciwnym razie jakiś chłopak z Londynu napisze mały parser robota, który w ciągu kilku minut zapełni całą bazę danych fałszywymi użytkownikami i będzie się cieszył z jego geniuszu i bezkarności.

Oto sam skrypt. Wszystko jest zapisane w jednym pliku zarejestruj się.php:

! `; // czerwony znak zapytania $sha=$sh."scripts/pro/"; //ścieżka do głównego folderu $bg=` bgcolor="#E1FFEB"`; // kolor tła wierszy?> Przykładowy skrypt rejestracyjny Register.php style.css" />

W tym przypadku skrypt odnosi się do siebie. I jest to formularz oraz podmiot przetwarzający dane wprowadzane do formularza. Należy pamiętać, że plik jest skompresowany jako archiwum zip i zawiera plik konfiguracyjny config.php, zrzut bazy danych użytkowników, plik zawierający funkcje pomocniczefunctions.php, plik stylów style.css i sam plik Register.php. Istnieje również kilka plików odpowiedzialnych za działanie i generowanie symboli captcha.

Cześć! Teraz postaramy się zaimplementować najprostszą rejestrację na stronie za pomocą PHP + MySQL. Aby to zrobić, na komputerze musi być zainstalowany Apache. Zasada działania naszego skryptu pokazana jest poniżej.

1. Zacznijmy od utworzenia tabeli użytkowników w bazie danych. Będzie zawierać dane użytkownika (login i hasło). Przejdźmy do phpmyadmin (jeśli tworzysz bazę danych na swoim komputerze http://localhost/phpmyadmin/). Utwórz tabelę użytkownicy, będzie miał 3 pola.

Tworzę go w bazie danych mysql, możesz utworzyć go w innej bazie danych. Następnie ustaw wartości jak na rysunku:

2. Wymagane jest połączenie z tą tabelą. Utwórzmy plik bd.php. Jego zawartość:

$db = mysql_connect("twój serwer MySQL","login do tego serwera","hasło do tego serwera");
mysql_select_db („nazwa bazy danych, z którą się łączymy”, $db);
?>

W moim przypadku wygląda to tak:

$db = mysql_connect("localhost","użytkownik","1234");
mysql_select_db("mysql",$db);
?>

Ratować bd.php.
Świetnie! Mamy tabelę w bazie danych i połączenie z nią. Teraz możesz przystąpić do tworzenia strony, na której użytkownicy będą zostawiać swoje dane.

3. Utwórz plik reg.php z zawartością (wszystkie komentarze w środku):



Rejestracja


Rejestracja


















4. Utwórz plik, który wprowadzi dane do bazy i zapisze użytkownika. zapisz_użytkownika.php(komentarze w środku):



{
}
//jeśli zostanie podany login i hasło, to je przetwarzamy, aby tagi i skrypty nie działały, nigdy nie wiadomo, co ktoś może wpisać


//usuń dodatkowe spacje
$login = trim($login);
$hasło = trim($hasło);
//połącz się z bazą danych
// sprawdź, czy istnieje użytkownik o tym samym loginie
$result = mysql_query("WYBIERZ identyfikator OD użytkowników GDZIE login="$login"",$db);
if (!empty($myrow["id"])) (
exit("Przepraszamy, podany login jest już zarejestrowany. Proszę podać inny login.");
}
// jeśli tak nie jest, zapisz dane
$result2 = mysql_query("WSTAW DO użytkowników (login,hasło) WARTOŚCI("$login","$hasło")");
// Sprawdź, czy występują błędy
jeśli ($result2=="TRUE")
{
echo "Zarejestrowałeś się pomyślnie! Teraz możesz wejść na stronę. Strona główna";
}
w przeciwnym razie(
echo "Błąd! Nie jesteś zarejestrowany.";
}
?>

5. Teraz nasi użytkownicy mogą się zarejestrować! Następnie musisz utworzyć „drzwi” dla już zarejestrowanych użytkowników, aby mogli wejść na stronę. indeks.php(komentarze w środku):

// cała procedura działa w sesjach. To w nim przechowywane są dane użytkownika podczas jego pobytu na stronie. Bardzo ważne jest, aby uruchomić je na samym początku strony!!!
początek_sesji();
?>


Strona główna


Strona główna











Rejestr



// Sprawdź, czy zmienne login i identyfikator użytkownika są puste
if (pusty($_SESSION["login"]) lub pusty($_SESSION["id"]))
{
// Jeśli puste, to nie wyświetlamy linku
echo "Jesteś zalogowany jako gość
Ten link jest dostępny tylko dla zarejestrowanych użytkowników";
}
w przeciwnym razie
{

W pliku indeks.php Wyświetlimy link, który będzie otwarty tylko dla zarejestrowanych użytkowników. O to właśnie chodzi w skrypcie - aby ograniczyć dostęp do dowolnych danych.

6. Pozostaje plik z weryfikacją wprowadzonego loginu i hasła. testreg.php (komentarze w środku):

session_start();// cała procedura działa na sesjach. To w nim przechowywane są dane użytkownika podczas jego pobytu na stronie. Bardzo ważne jest, aby uruchomić je na samym początku strony!!!
if (isset($_POST["login"])) ( $login = $_POST["login"]; if ($login == "") ( unset($login);) ) //wprowadź login wprowadzony przez użytkownika do zmiennej $login, jeśli jest pusta, zniszcz zmienną
if (isset($_POST["hasło"])) ( $hasło=$_POST["hasło"]; if ($hasło =="") ( unset($hasło);) )
//wpisz hasło wprowadzone przez użytkownika w zmiennej $password, jeśli jest pusta, zniszcz zmienną
if (empty($login) lub pusty($password)) //jeżeli użytkownik nie podał loginu lub hasła to zgłaszamy błąd i zatrzymujemy skrypt
{
exit("Nie podałeś wszystkich informacji, wróć i wypełnij wszystkie pola!");
}
//jeśli zostanie podany login i hasło, to je przetwarzamy, aby tagi i skrypty nie działały, nigdy nie wiadomo, co ktoś może wpisać
$login = stripslashes($login);
$login = htmlspecialchars($login);
$hasło = paski ukośników($hasło);
$hasło = htmlspecialchars($hasło);
//usuń dodatkowe spacje
$login = trim($login);
$hasło = trim($hasło);
//połącz się z bazą danych
include("bd.php");// plik bd.php musi znajdować się w tym samym folderze co wszystkie pozostałe, jeśli nie, po prostu zmień ścieżkę

$result = mysql_query("WYBIERZ * OD użytkowników GDZIE login="$login"",$db); //pobierz z bazy wszystkie dane o użytkowniku z wprowadzonym loginem
$myrow = mysql_fetch_array($wynik);
if (pusty($myrow["hasło"]))
{
//jeżeli użytkownik o podanym loginie nie istnieje
}
w przeciwnym razie(
//jeśli istnieje, sprawdź hasła
if ($myrow["hasło"]==$hasło) (
//jeśli hasła są zgodne, uruchamiamy sesję dla użytkownika! Można mu pogratulować, dostał się!
$_SESSION["login"]=$myrow["login"];
$_SESSION["id"]=$myrow["id"];//te dane są wykorzystywane bardzo często, dlatego zalogowany użytkownik będzie je „nosił przy sobie”
echo "Wszedłeś pomyślnie na stronę! Strona główna";
}
w przeciwnym razie(
//jeśli hasła nie pasują

Wyjdź („Przepraszamy, wprowadzony login lub hasło jest nieprawidłowe.”);
}
}
?>

OK, już wszystko! Lekcja może być nudna, ale bardzo przydatna. Pokazana jest tu tylko idea rejestracji, potem można ją ulepszyć: dodać ochronę, wygląd, pola danych, wczytać awatary, wylogować się z konta (w tym celu wystarczy po prostu zniszczyć zmienne z sesji funkcją nieoprawny) i tak dalej. Powodzenia!

Sprawdziłem wszystko, działa poprawnie!

Dzisiaj przyjrzymy się wykorzystaniu krytycznej 1-dniowej luki w popularnym systemie CMS Joomla, która eksplodowała w Internecie pod koniec października. O lukach będziemy rozmawiać w liczbach CVE-2016-8869, CVE-2016-8870 I CVE-2016-9081. Wszystkie trzy pochodzą z jednego fragmentu kodu, który przez pięć długich lat pozostawał w głębi frameworka, czekając na skrzydłach, by następnie uwolnić się i nieść ze sobą chaos, zhakowane strony i łzy niewinnych użytkowników tej Joomli. Tylko najdzielniejsi i odważni programiści, których oczy są czerwone od światła monitorów i których klawiatury są zasłane okruchami chleba, byli w stanie rzucić wyzwanie szalejącym złym duchom i położyć głowę na ołtarzu poprawek.

OSTRZEŻENIE

Wszystkie informacje podane są wyłącznie w celach informacyjnych. Ani redakcja, ani autor nie ponoszą odpowiedzialności za ewentualne szkody wyrządzone przez materiały zawarte w tym artykule.

Gdzie wszystko się zaczęło

6 października 2016 roku Demis Palma utworzył temat na Stack Exchange, w którym zapytał: dlaczego w Joomla w wersji 3.6 istnieją dwie metody rejestrowania użytkowników o tej samej nazwie Register()? Pierwszy znajduje się w kontrolerze UsersControllerRegistration, a drugi w kontrolerze UsersControllerUser. Damis chciał wiedzieć, czy gdzieś użyto metody UsersControllerUser::register(), czy też był to po prostu ewolucyjny anachronizm pozostały po starej logice. Jego obawą było to, że nawet jeśli ta metoda nie jest używana w żadnym widoku, można ją wywołać za pomocą spreparowanego zapytania. Na co otrzymałem odpowiedź od programisty o pseudonimie itoctopus, który potwierdził: problem naprawdę istnieje. I wysłał raport do programistów Joomla.

Wtedy wydarzenia rozwijały się najszybciej. 18 października programiści Joomla zaakceptowali raport Damisa, który do tego czasu przygotował PoC umożliwiający rejestrację użytkownika. Opublikował notatkę na swojej stronie internetowej, w której ogólnie opowiedział o napotkanym problemie i swoich przemyśleniach na ten temat. Tego samego dnia zostaje wypuszczona nowa wersja Joomla 3.6.3, która w dalszym ciągu zawiera lukę w kodzie.

Następnie Davide Tampellini odwraca błąd do tego stopnia, że ​​rejestruje nie prostego użytkownika, ale administratora. A 21 października do zespołu ds. bezpieczeństwa Joomla trafia nowa sprawa. Mówi się już o zwiększeniu przywilejów. Tego samego dnia na stronie Joomla pojawia się komunikat, że we wtorek 25 października ukaże się kolejna wersja o numerze seryjnym 3.6.3, która naprawia krytyczną lukę w jądrze systemu.

25 października Zespół Joomla Security Strike Team znajduje najnowszy problem spowodowany fragmentem kodu odkrytym przez Damisa. Następnie zatwierdzenie z 21 października o niepozornej nazwie „Preparing 3.6.4 Stable Release” zostaje wypychane do głównej gałęzi oficjalnego repozytorium Joomla, co naprawia niefortunny błąd.

Po tym wydaniu do społeczności programistów dołącza wiele zainteresowanych osób, które zaczynają promować lukę i przygotowywać exploity.

27 października badacz Harry Roberts przesyła do repozytorium Xiphos Research gotowy exploit, który może przesłać plik PHP na serwer z podatnym na ataki systemem CMS.

Detale

Cóż, tło się skończyło, przejdźmy do najciekawszej części - analizy podatności. Zainstalowałem Joomla 3.6.3 jako wersję testową, więc wszystkie numery linii będą istotne dla tej wersji. Wszystkie ścieżki do plików, które zobaczysz poniżej, zostaną wskazane w odniesieniu do katalogu głównego zainstalowanego CMS-a.

Dzięki odkryciu Damisa Palmy wiemy, że istnieją dwie metody dokonujące rejestracji użytkownika w systemie. Pierwszy z nich jest używany przez CMS i znajduje się w pliku /components/com_users/controllers/registration.php:108. Drugi (ten, który będziemy musieli wywołać) znajduje się w /components/com_users/controllers/user.php:293. Przyjrzyjmy się temu bliżej.

286: /** 287: * Metoda rejestracji użytkownika. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: */ 293: funkcja publiczna Register() 294: ( 295: JSession::checkToken("post") lub jexit(JText::_ („JINVALID_TOKEN”)); ... 300: // Pobierz dane formularza. 301: $data = $this->input->post->get("user", array(), "array"); . .. 315: $return = $model->validate($form, $data); 316: 317: // Sprawdź błędy 318: if ($return === false) 319: ( ... 345: / / Zakończ rejestrację 346: $return = $model->register($data);

Tutaj zostawiłem tylko ciekawe linie. Pełną wersję podatnej metody można obejrzeć w repozytorium Joomla.

Zastanówmy się, co dzieje się podczas normalnej rejestracji użytkownika: jakie dane są przesyłane i jak są przetwarzane. Jeżeli w ustawieniach włączona jest rejestracja użytkownika, formularz znajdziesz pod adresem http://joomla.local/index.php/component/users/?view=registration.


Prawidłowe żądanie rejestracji użytkownika wygląda jak na poniższym zrzucie ekranu.


Za współpracę z użytkownikami odpowiada komponent com_users. Zwróć uwagę na parametr task w żądaniu. Ma format $controller.$method . Przyjrzyjmy się strukturze plików.

Nazwy skryptów w folderze kontrolery odpowiadają nazwom wywoływanych kontrolerów. Ponieważ nasze żądanie zawiera teraz $controller = "registration" , plik zostanie wywołany rejestracja.php i jego metoda Register().

Uwaga, pytanie: jak przenieść przetwarzanie rejestracji do wrażliwego miejsca w kodzie? Prawdopodobnie już się tego domyśliłeś. Nazwy metod podatnych i metod rzeczywistych są takie same (rejestr), więc wystarczy zmienić nazwę wywoływanego kontrolera. Gdzie znajduje się nasz wrażliwy kontroler? Zgadza się, w pliku użytkownik.php. Okazuje się, że $controller = "user" . Łącząc wszystko otrzymujemy task = user.register . Teraz żądanie rejestracji jest przetwarzane w sposób, którego potrzebujemy.


Drugą rzeczą, którą musimy zrobić, to wysłać dane w odpowiednim formacie. Tutaj wszystko jest proste. Uprawniona rejestracja() oczekuje od nas tablicy o nazwie jform , w której przekazujemy dane rejestracyjne - imię i nazwisko, login, hasło, adres e-mail (patrz zrzut ekranu z żądaniem).

  • /components/com_users/controllers/registration.php: 124: // Pobierz dane użytkownika. 125: $requestData = $this->input->post->get("jform", array(), "array");

Nasz klient pobiera te dane z tablicy zwanej user.

  • /components/com_users/controllers/user.php: 301: // Pobierz dane formularza. 302: $data = $this->input->post->get("użytkownik", tablica(), "tablica");

Dlatego zmieniamy nazwy wszystkich parametrów w żądaniu z jfrom na user .

Naszym trzecim krokiem jest znalezienie prawidłowego tokena CSRF, ponieważ bez niego nie będzie rejestracji.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") lub jexit(JText::_("JINVALID_TOKEN"));

Wygląda jak skrót MD5 i możesz go pobrać na przykład z formularza autoryzacyjnego na stronie /index.php/component/users/?view=login.


Teraz możesz tworzyć użytkowników przy użyciu żądanej metody. Jeśli wszystko się udało, gratulacje - właśnie wykorzystałeś lukę CVE-2016-8870„Brak kontroli uprawnień do rejestracji nowych użytkowników.”

Tak to wygląda w „działającej” metodzie Register() z kontrolera UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Jeśli rejestracja jest wyłączona - Przekieruj do strony logowania. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= login", fałsz)); 117: 118: zwróć fałsz; 119: )

I tak w przypadku bezbronności:

  • /components/com_users/controllers/user.php:

Tak, nie ma mowy.

Aby zrozumieć drugi, znacznie poważniejszy problem, wyślijmy utworzone przez nas żądanie i zobaczmy, jak jest ono wykonywane w różnych częściach kodu. Oto element odpowiedzialny za weryfikację danych przesłanych przez użytkownika w metodzie roboczej:

Kontynuacja jest dostępna tylko dla członków

Opcja 1. Dołącz do społeczności „site”, aby zapoznać się ze wszystkimi materiałami w serwisie

Członkostwo w społeczności w określonym terminie zapewni Ci dostęp do WSZYSTKICH materiałów Hackera, zwiększy Twoją osobistą zniżkę kumulacyjną i pozwoli Ci zgromadzić profesjonalną ocenę Xakep Score!

W tym artykule dowiesz się jak utworzyć formularz rejestracji i autoryzacji przy użyciu HTML, JavaScript, PHP i MySql. Formularze takie stosowane są niemal na każdej stronie internetowej, niezależnie od jej typu. Tworzone są z myślą o forum, sklepie internetowym, portalach społecznościowych (takich jak Facebook, Twitter, Odnoklassniki) i wielu innych typach serwisów.

Jeśli masz witrynę internetową na swoim komputerze lokalnym, mam nadzieję, że już ją masz serwer lokalny zainstalowany i uruchomiony. Bez tego nic nie będzie działać.

Tworzenie tabeli w bazie danych

Aby zaimplementować rejestrację użytkowników, potrzebujemy przede wszystkim Bazy Danych. Jeśli już go masz, to świetnie, w przeciwnym razie musisz go stworzyć. W artykule szczegółowo wyjaśniam, jak to zrobić.

I tak mamy bazę danych (w skrócie DB), teraz musimy stworzyć tabelę użytkownicy w którym będziemy dodawać naszych zarejestrowanych użytkowników.

W artykule wyjaśniłem również, jak utworzyć tabelę w bazie danych. Przed utworzeniem tabeli musimy określić, jakie pola będzie ona zawierać. Pola te będą odpowiadać polom z formularza rejestracyjnego.

Pomyśleliśmy więc, wyobraziliśmy sobie, jakie pola miałby nasz formularz i stworzyliśmy tabelę użytkownicy z tymi polami:

  • ID- Identyfikator. Pole ID Każda tabela w bazie danych powinna to mieć.
  • imię- Aby zapisać nazwę.
  • nazwisko- Aby zachować nazwisko.
  • e-mail- Aby zapisać adres pocztowy. Jako loginu będziemy używać adresu e-mail, dlatego pole to musi być unikalne, czyli posiadać indeks UNIQUE.
  • status_e-maila- Pole wskazujące, czy wiadomość została potwierdzona, czy nie. Jeśli wiadomość zostanie potwierdzona, będzie miała wartość 1, w przeciwnym razie wartość będzie wynosić 0.
  • hasło- Aby zapisać hasło.


Jeśli chcesz, aby Twój formularz rejestracyjny zawierał jeszcze inne pola, możesz dodać je również tutaj.

To wszystko, nasz stół użytkownicy gotowy. Przejdźmy do następnego etapu.

Połączenie z bazą danych

Stworzyliśmy bazę danych, teraz musimy się z nią połączyć. Połączymy się za pomocą rozszerzenia PHP MySQLi.

W folderze naszej witryny utwórz plik o nazwie dbconnect.php i napisz w nim następujący skrypt:

Błąd połączenia z bazą danych. Opis błędu: „.mysqli_connect_error().”

"; exit(); ) // Ustaw kodowanie połączenia $mysqli->set_charset("utf8"); // Dla wygody dodaj tutaj zmienną, która będzie zawierać nazwę naszej witryny $address_site = "http://testsite .local" ;?>

Ten plik dbconnect.php będzie musiał być podłączony do procedur obsługi formularzy.

Zwróć uwagę na zmienną $adres_witryny, tutaj wskazałem nazwę mojej witryny testowej, nad którą będę pracować. Podaj odpowiednio nazwę swojej witryny.

Struktura witryny

Przyjrzyjmy się teraz strukturze HTML naszej witryny.

Nagłówek i stopkę strony przeniesiemy do osobnych plików, nagłówek.php I stopka.php. Umieścimy je na wszystkich stronach. Mianowicie na stronie głównej (plik indeks.php), do strony z formularzem rejestracyjnym (plik form_register.php) oraz do strony z formularzem autoryzacji (plik form_auth.php).

Blokuj naszymi linkami, rejestracja I upoważnienie, dodaj je do nagłówka witryny, aby były wyświetlane na wszystkich stronach. Jeden link zostanie wprowadzony pod adresem strona formularza rejestracyjnego(plik form_register.php), a drugi do strony z formularz autoryzacyjny(plik form_auth.php).

Zawartość pliku header.php:

Nazwa naszej witryny

W rezultacie nasza strona główna wygląda następująco:


Oczywiście Twoja witryna może mieć zupełnie inną strukturę, ale nie jest to teraz dla nas istotne. Najważniejsze jest to, że istnieją linki (przyciski) do rejestracji i autoryzacji.

Przejdźmy teraz do formularza rejestracyjnego. Jak już rozumiesz, mamy to w aktach form_register.php.

Przejdź do Bazy Danych (w phpMyAdmin), otwórz strukturę tabeli użytkownicy i zobacz, jakich pól potrzebujemy. Oznacza to, że potrzebujemy pól do wpisania imienia i nazwiska, pola do wpisania adresu pocztowego (Email) oraz pola do wpisania hasła. A ze względów bezpieczeństwa dodamy pole do wpisania captcha.

Na serwerze w wyniku przetwarzania formularza rejestracyjnego mogą wystąpić różne błędy, przez które użytkownik nie będzie mógł się zarejestrować. Dlatego, aby użytkownik zrozumiał dlaczego rejestracja się nie powiodła, konieczne jest wyświetlenie komunikatów o tych błędach.

Przed wyświetleniem formularza dodaj blok wyświetlający komunikaty o błędach z sesji.

I jeszcze jedno jeśli użytkownik jest już autoryzowany i z ciekawości przechodzi bezpośrednio na stronę rejestracji wpisując w pasku adresu przeglądarki adres_witryny/form_register.php, wówczas w tym przypadku zamiast formularza rejestracyjnego wyświetlimy nagłówek informujący, że jest on już zarejestrowany.

Ogólnie kod pliku form_register.php mamy to:

Jesteś już zarejestrowany

W przeglądarce strona z formularzem rejestracyjnym wygląda następująco:


Używając wymagany atrybut, wszystkie pola uczyniliśmy obowiązkowymi.

Zwróć uwagę na kod formularza rejestracyjnego, gdzie wyświetla się captcha:


Ścieżkę do pliku podaliśmy w wartości atrybutu src dla obrazu captcha.php, który generuje tę captcha.

Spójrzmy na kod pliku captcha.php:

Kod jest dobrze skomentowany, więc skupię się tylko na jednym punkcie.

Wewnątrz funkcji obrazTtfTekst(), określona jest ścieżka do czcionki verdana.ttf. Aby więc captcha działała poprawnie, musimy utworzyć folder czcionki i umieść tam plik czcionki verdana.ttf. Możesz go znaleźć i pobrać z Internetu lub pobrać z archiwum z materiałami tego artykułu.

Skończyliśmy ze strukturą HTML, czas działać dalej.

Sprawdzanie ważności poczty e-mail za pomocą jQuery

Każdy formularz wymaga sprawdzenia poprawności wprowadzonych danych, zarówno po stronie klienta (za pomocą JavaScript, jQuery), jak i po stronie serwera.

Szczególną uwagę musimy zwrócić na pole E-mail. Bardzo ważne jest, aby wprowadzony adres pocztowy był ważny.

Dla tego pola wejściowego ustawiamy typ wiadomości e-mail (type="email"), co nieco ostrzega nas przed nieprawidłowymi formatami. Ale to nie wystarczy, bo poprzez inspektora kodu, który udostępnia nam przeglądarka, w łatwy sposób możemy zmienić wartość atrybutu typ Z e-mail NA tekst i tyle, nasz czek nie będzie już ważny.


I w tym przypadku musimy przeprowadzić bardziej wiarygodną kontrolę. W tym celu skorzystamy z biblioteki jQuery z JavaScript.

Aby połączyć bibliotekę jQuery, w pliku nagłówek.php pomiędzy tagami , przed tagiem zamykającym , dodaj tę linię:

Zaraz po tej linii dodamy kod weryfikacyjny adresu e-mail. Tutaj dodamy kod pozwalający sprawdzić długość wprowadzonego hasła. Jego długość musi wynosić co najmniej 6 znaków.

Za pomocą tego skryptu sprawdzamy poprawność wprowadzonego adresu e-mail. Jeśli użytkownik wprowadził nieprawidłowy adres e-mail, wyświetlimy komunikat o błędzie i wyłączymy przycisk przesyłania formularza. Jeśli wszystko jest w porządku, usuwamy błąd i aktywujemy przycisk przesyłania formularza.

Skończyliśmy więc z walidacją formularzy po stronie klienta. Teraz możemy wysłać go na serwer, gdzie również dokonamy kilku kontroli i dodamy dane do bazy danych.

Rejestracja Użytkownika

Formularz przesyłamy do pliku w celu przetworzenia zarejestruj się.php, metodą POST. Nazwa tego pliku obsługi jest określona w wartości atrybutu działanie. Sposób wysyłania jest określony w wartości atrybutu metoda.

Otwórz ten plik zarejestruj się.php i pierwszą rzeczą, którą musimy zrobić, to napisać funkcję uruchamiania sesji i podłączyć utworzony wcześniej plik dbconnect.php(W tym pliku wykonaliśmy połączenie z bazą danych). A także od razu zadeklarujmy komórki komunikaty_błędów I wiadomości_sukcesu w globalnej tablicy sesji. W komunikaty o błędach będziemy rejestrować wszystkie komunikaty o błędach, które wystąpią podczas przetwarzania formularza oraz w wiadomości_sukcesu, nagramy radosne wiadomości.

Zanim będziemy kontynuować, musimy to sprawdzić czy formularz w ogóle został przesłany?. Osoba atakująca może sprawdzić wartość atrybutu działanie z formularza i dowiedz się, który plik przetwarza ten formularz. Być może wpadnie na pomysł, aby przejść bezpośrednio do tego pliku, wpisując następujący adres w pasku adresu przeglądarki: http://adres_strony/register.php

Musimy więc sprawdzić, czy w globalnej tablicy POST znajduje się komórka, której nazwa odpowiada nazwie naszego przycisku „Zarejestruj się” z formularza. W ten sposób sprawdzamy, czy został kliknięty przycisk „Zarejestruj się”.

Jeśli osoba atakująca spróbuje przejść bezpośrednio do tego pliku, otrzyma komunikat o błędzie. Przypomnę, że zmienna $address_site zawiera nazwę serwisu i została ona zadeklarowana w pliku dbconnect.php.

Błąd! Strona główna.

"); } ?>

Wartość captcha w sesji została dodana w pliku podczas jej generowania captcha.php. Dla przypomnienia pokażę Ci jeszcze raz ten fragment kodu z pliku captcha.php, gdzie do sesji dodawana jest wartość captcha:

Przejdźmy teraz do samej weryfikacji. W pliku zarejestruj się.php, wewnątrz bloku if, gdzie sprawdzamy, czy został kliknięty przycisk „Zarejestruj się”, czy raczej gdzie jest wskazany komentarz „” // (1) Miejsce na następny fragment kodu"piszemy:

//Sprawdź odebrane captcha //Przytnij spacje na początku i na końcu linii $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Porównaj otrzymaną wartość z wartością z sesji. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Jeżeli captcha jest niepoprawna to wracamy użytkownika na stronę rejestracji i tam wyświetlimy mu komunikat o błędzie, że wprowadził błędne captcha .$komunikat o błędzie = "

Błąd! Wpisałeś złe captcha

"; // Zapisz komunikat o błędzie w sesji. $_SESSION["error_messages"] = $error_message; // Wróć użytkownika do strony rejestracji header("HTTP/1.1 301 Przeniesiono na stałe"); header("Lokalizacja: " .$address_site ."/form_register.php"); //Zatrzymaj skrypt exit(); ) // (2) Miejsce na kolejny fragment kodu )else( //Jeśli captcha nie została przekazana lub jest pusta, wyjście („

Błąd! Nie ma kodu weryfikacyjnego, czyli kodu captcha. Możesz przejść do strony głównej.

"); }

Następnie musimy przetworzyć otrzymane dane z tablicy POST. Przede wszystkim musimy sprawdzić zawartość globalnej tablicy POST, czyli czy znajdują się tam komórki, których nazwy odpowiadają nazwom pól wejściowych z naszego formularza.

Jeżeli komórka istnieje to odcinamy spacje na początku i na końcu wiersza tej komórki, w przeciwnym wypadku przekierowujemy użytkownika z powrotem na stronę z formularzem rejestracyjnym.

Następnie po przycięciu spacji dodajemy linijkę do zmiennej i sprawdzamy czy zmienna jest pusta, jeśli nie jest pusta to przechodzimy dalej, w innym wypadku przekierowujemy użytkownika z powrotem na stronę z formularzem rejestracyjnym.

Wklej ten kod we wskazane miejsce” // (2) Miejsce na następny fragment kodu".

/* Sprawdza, czy w tablicy globalnej $_POST są wysyłane dane z formularza i zawija przesłane dane w zwykłe zmienne.*/ if(isset($_POST["first_name"]))( //Przytnij spacje od początku i koniec łańcucha $first_name = trim($_POST["first_name"]); //Sprawdź, czy zmienna jest pusta if(!empty($first_name))( // Dla bezpieczeństwa przekonwertuj znaki specjalne na encje HTML $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty_błędów"] .= "

Wpisz swoje imię

Brak pola nazwy

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); //Zatrzymaj wyjście skryptu(); ) if( isset($_POST["last_name"]))( //Przytnij spacje od początku i końca linii $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // Dla bezpieczeństwa przekonwertuj znaki specjalne na encje HTML $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty o błędach"] .= "

Proszę podać swoje nazwisko

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); //Zatrzymaj wyjście skryptu(); ) )else ( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty o błędach"] .= "

Brak pola nazwiska

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); //Zatrzymaj wyjście skryptu(); ) if( isset($_POST["email"]))( //Przytnij spacje na początku i na końcu linii $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Lokalizacja kodu do sprawdzania formatu adresu e-mail i jego unikalności )else( // Zapisz komunikat o błędzie w sesji. $_SESSION["error_messages"] .= "

Wprowadź swój email

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); //Zatrzymaj wyjście skryptu(); ) )else ( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty o błędach"] .= "

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); //Zatrzymaj wyjście skryptu(); ) if( isset($_POST["hasło"]))( //Przytnij spacje na początku i na końcu łańcucha $password = trim($_POST["hasło"]); if(!empty($hasło)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Zaszyfruj hasło $password = md5($password.top_secret"); )else( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty o błędach"] .= "

Wprowadź hasło

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); //Zatrzymaj wyjście skryptu(); ) )else ( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty o błędach"] .= "

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); //Zatrzymaj wyjście skryptu(); ) // (4) Miejsce na kod dodania użytkownika do bazy danych

Szczególnie ważne jest pole e-mail. Musimy sprawdzić w bazie format otrzymanego adresu pocztowego i jego unikalność. To znaczy, czy jest już zarejestrowany użytkownik o tym samym adresie e-mail?

We wskazanym miejscu” // (3) Lokalizacja kodu w celu sprawdzenia formatu adresu pocztowego i jego unikalności" dodaj następujący kod:

//Sprawdź format otrzymanego adresu e-mail, używając wyrażenia regularnego $reg_email = "/^**@(+(*+)*\.)++/i"; //Jeśli format otrzymanego adresu e-mail nie jest zgodny z wyrażeniem regularnym if(!preg_match($reg_email, $email))( // Zapisz komunikat o błędzie w sesji. $_SESSION["error_messages"] .= "

Wpisałeś nieprawidłowy adres e-mail

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); //Zatrzymaj wyjście skryptu(); ) // Sprawdzamy, czy taki adres jest już w bazie $result_query = $mysqli->query("WYBIERZ `email` Z `użytkowników` GDZIE `email`=".$email."""); / /Jeśli liczba otrzymanych wiadomości jest dokładnie w jednym wierszu, co oznacza, że ​​użytkownik o tym adresie e-mail jest już zarejestrowany if($result_query->num_rows == 1)( //Jeśli uzyskany wynik nie jest fałszywy if(($row = $result_query->fetch_assoc()) != false) ( // Zapisz komunikat o błędzie w sesji. $_SESSION["error_messages"] .= "

Użytkownik o tym adresie e-mail jest już zarejestrowany

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); )else( // Zapisz komunikat o błędzie do sesji $_SESSION["komunikaty o błędach"] .= "

Błąd w zapytaniu do bazy danych

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); ) /* zamknięcie wyboru */ $ result_query->close(); //Zatrzymaj skrypt exit(); ) /* zamknięcie zaznaczenia */ $result_query->close();

I tak mamy już za sobą wszystkie sprawdzenia, czas dodać użytkownika do bazy danych. We wskazanym miejscu” // (4) Miejsce na kod dodania użytkownika do bazy danych" dodaj następujący kod:

//Zapytanie o dodanie użytkownika do bazy danych $result_query_insert = $mysqli->query("WSTAW DO `użytkowników` (imię, nazwisko, adres e-mail, hasło) WARTOŚCI ("".$pierwsze imię."", "".$nazwisko ." ", ".$e-mail.", ".$hasło."")"); if(!$result_query_insert)( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty o błędach"] .= "

Błąd w żądaniu dodania użytkownika do bazy danych

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); //Zatrzymaj wyjście skryptu(); )else( $_SESSION["wiadomości_success"] = "

Rejestracja zakończona pomyślnie!!!
Teraz możesz zalogować się przy użyciu swojej nazwy użytkownika i hasła.

"; //Wyślij użytkownika na stronę autoryzacji header("HTTP/1.1 301 Przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_auth.php"); ) /* Zakończenie żądania */ $ result_query_insert->close(); //Zamknij połączenie z bazą danych $mysqli->close();

Jeżeli w żądaniu dodania użytkownika do bazy wystąpił błąd, dodajemy komunikat o tym błędzie do sesji i odsyłamy użytkownika na stronę rejestracji.

W przeciwnym razie, jeśli wszystko poszło dobrze, również dodajemy wiadomość do sesji, ale tym razem jest ona przyjemniejsza, a mianowicie informujemy użytkownika, że ​​rejestracja przebiegła pomyślnie. I przekierowujemy go na stronę z formularzem autoryzacji.

Skrypt sprawdzający format adresu e-mail i długość hasła znajduje się w pliku nagłówek.php, więc będzie dotyczyć także pól z tego formularza.

Sesja jest również uruchamiana w pliku nagłówek.php, więc w pliku form_auth.php Nie ma potrzeby rozpoczynania sesji, ponieważ otrzymamy błąd.


Jak już mówiłem, tutaj działa również skrypt sprawdzający format adresu e-mail i długość hasła. Dlatego jeśli użytkownik wprowadzi błędny adres e-mail lub krótkie hasło, natychmiast otrzyma komunikat o błędzie. Przycisk wejść stanie się nieaktywny.

Po naprawieniu błędów przycisk wejść stanie się aktywny, a użytkownik będzie mógł przesłać formularz na serwer, gdzie zostanie on przetworzony.

Autoryzacja użytkownika

Aby przypisać wartość działanie handicap autoryzacyjny ma określony plik autoryzacja.php, oznacza to, że formularz będzie przetwarzany w tym pliku.

I tak otwórz plik autoryzacja.php i napisz kod przetwarzający formularz autoryzacji. Pierwszą rzeczą, którą musisz zrobić, to rozpocząć sesję i podłączyć plik dbconnect.php aby połączyć się z bazą danych.

//Zadeklaruj komórkę, w której zostaną dodane błędy mogące wystąpić podczas przetwarzania formularza. $_SESSION["komunikaty o błędach"] = ""; //Zadeklaruj komórkę do dodawania pomyślnych wiadomości $_SESSION["success_messages"] = "";

/* Sprawdza, czy formularz został przesłany, czyli czy został kliknięty przycisk Zaloguj. Jeśli tak, to przechodzimy dalej, jeśli nie, wyświetlimy użytkownikowi komunikat o błędzie wskazujący, że uzyskał bezpośredni dostęp do tej strony. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) Miejsce na następny fragment kodu )else( exit("

Błąd! Uzyskałeś bezpośredni dostęp do tej strony, więc nie ma żadnych danych do przetworzenia. Możesz przejść do strony głównej.

"); }

//Sprawdź otrzymaną captcha if(isset($_POST["captcha"]))( //Przytnij spacje od początku i końca linii $captcha = trim($_POST["captcha"]); if(! pusty($captcha ))( //Porównaj otrzymaną wartość z wartością z sesji. if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != "")) ( // Jeżeli captcha jest niepoprawna to zwracamy użytkownika na stronę autoryzacyjną i tam wyświetlamy mu komunikat o błędzie, że wprowadził błędne captcha. $error_message = "

Błąd! Wpisałeś złe captcha

"; // Zapisz komunikat o błędzie w sesji. $_SESSION["error_messages"] = $error_message; // Wróć użytkownika do strony autoryzacji header("HTTP/1.1 301 Przeniesiono na stałe"); header("Lokalizacja: " .$address_site ."/form_auth.php"); //Zatrzymaj skrypt exit(); ) )else( $error_message = "

Błąd! Pole wprowadzania captcha nie może być puste.

"; // Zapisz komunikat o błędzie w sesji. $_SESSION["error_messages"] = $error_message; // Wróć użytkownika do strony autoryzacji header("HTTP/1.1 301 Przeniesiono na stałe"); header("Lokalizacja: " .$address_site ."/form_auth.php"); //Zatrzymaj skrypt exit(); ) //(2) Miejsce przetwarzania adresu e-mail //(3) Miejsce przetwarzania hasła //(4) Miejsce dla tworzenie zapytania do bazy danych )else ( //Jeśli captcha nie została przekazana, exit("

Błąd! Nie ma kodu weryfikacyjnego, czyli kodu captcha. Możesz przejść do strony głównej.

"); }

Jeśli użytkownik poprawnie wprowadził kod weryfikacyjny, przechodzimy dalej, w przeciwnym razie zwracamy go na stronę autoryzacji.

Sprawdzanie adresu pocztowego

//Przytnij spacje na początku i na końcu linii $email = trim($_POST["email"]); if(isset($_POST["email"]))( if(!empty($email))( $email = htmlspecialchars($email, ENT_QUOTES); //Sprawdź format otrzymanego adresu e-mail za pomocą wyrażenia regularnego $ reg_email = " /^**@(+(*+)*\.)++/i"; //Jeśli format otrzymanego adresu e-mail nie jest zgodny z wyrażeniem regularnym if(!preg_match($reg_email, $email ))( // Zapisz w komunikacie o błędzie sesji. $_SESSION["komunikaty_błędów"] .= "

Wpisałeś nieprawidłowy adres e-mail

"; //Powrót użytkownika do strony autoryzacji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_auth.php"); //Zatrzymaj wyjście skryptu(); ) )else ( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty o błędach"] .= "

Pole do wpisania adresu pocztowego (e-mail) nie może być puste.

"; //Powrót użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_register.php"); //Zatrzymaj wyjście skryptu(); ) )else ( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty o błędach"] .= "

Brak pola wprowadzania adresu e-mail

"; //Powrót użytkownika do strony autoryzacji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_auth.php"); //Zatrzymaj wyjście skryptu(); ) // (3) Obszar przetwarzania hasła

Jeżeli użytkownik podał adres e-mail w złym formacie lub wartość pola adresu e-mail jest pusta, to zwracamy go na stronę autoryzacyjną, gdzie wyświetlamy komunikat w tej sprawie.

Weryfikacja hasła

Kolejnym polem do przetworzenia jest pole hasła. We wskazane miejsce” //(3) Miejsce przetwarzania haseł", piszemy:

If(isset($_POST["hasło"]))( //Przytnij spacje na początku i na końcu łańcucha $password = trim($_POST["hasło"]); if(!empty($hasło))( $password = htmlspecialchars($password, ENT_QUOTES); //Zaszyfruj hasło $password = md5($password."top_secret"); )else( //Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty o błędach"] . = "

Wprowadź hasło

"; //Powróć użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_auth.php"); //Zatrzymaj wyjście skryptu(); ) )else ( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty o błędach"] .= "

Brak pola hasła

"; //Powróć użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_auth.php"); //Zatrzymaj wyjście skryptu(); )

Tutaj używamy funkcji md5() do szyfrowania otrzymanego hasła, ponieważ nasze hasła są w bazie danych w formie zaszyfrowanej. Dodatkowe tajne słowo w szyfrowaniu, w naszym przypadku „ ściśle tajne" musi być tym, który został użyty podczas rejestracji użytkownika.

Teraz należy wykonać zapytanie do bazy danych, aby wybrać użytkownika, którego adres e-mail jest równy otrzymanemu adresowi e-mail i którego hasło jest takie samo jak otrzymane hasło.

//Zapytanie w bazie danych na podstawie wyboru użytkownika. $result_query_select = $mysqli->query("WYBIERZ * Z `użytkowników` GDZIE email = ".$email."" AND hasło = ".$hasło."""); if(!$result_query_select)( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty_błędów"] .= "

Błąd zapytania podczas wybierania użytkownika z bazy danych

"; //Powróć użytkownika do strony rejestracji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_auth.php"); //Zatrzymaj wyjście skryptu(); )else( //Sprawdź, czy w bazie nie ma użytkownika posiadającego takie dane, a następnie wyświetl komunikat o błędzie if($result_query_select->num_rows == 1)( // Jeżeli wprowadzone dane odpowiadają danym z bazy, to zapisz login i hasło do tablicy sesji. $_SESSION["email"] = $email; $_SESSION["hasło"] = $hasło; //Powrót użytkownika do nagłówka strony głównej("HTTP/1.1 301 Przeniesiono na stałe" ); header("Lokalizacja: ".$address_site ."/index.php"); )else( // Zapisz komunikat o błędzie w sesji. $_SESSION["komunikaty_błędów"] .= "

Nieprawidłowy login i/lub hasło

"; //Powrót użytkownika do strony autoryzacji header("HTTP/1.1 301 przeniesiony na stałe"); header("Lokalizacja: ".$address_site."/form_auth.php"); //Zatrzymaj wyjście skryptu(); ) )

Wyjdź z witryny

Ostatnią rzeczą, którą wdrażamy, jest procedura opuszczenia serwisu. W tej chwili w nagłówku wyświetlamy linki do strony autoryzacji i strony rejestracji.

W nagłówku witryny (plik nagłówek.php), za pomocą sesji sprawdzamy, czy użytkownik jest już autoryzowany. Jeżeli nie to wyświetlamy linki rejestracyjne i autoryzacyjne, w przeciwnym wypadku (jeśli jest on autoryzowany) wówczas zamiast linków rejestracyjnych i autoryzacyjnych wyświetlamy link Wyjście.

Zmodyfikowany fragment kodu z pliku nagłówek.php:

Rejestracja

Wyjście

Po kliknięciu linku wyjściowego ze strony zostajemy przeniesieni do pliku wyloguj się.php, gdzie po prostu niszczymy komórki zawierające adres e-mail i hasło z sesji. Następnie zwracamy użytkownika z powrotem na stronę, na której kliknął link Wyjście.

Kod pliku wyloguj.php:

To wszystko. Teraz wiesz jak wdrażać i przetwarzać formularze rejestracyjne i autoryzacyjne użytkownika na Twojej stronie. Formularze te znajdują się niemal na każdej stronie internetowej, dlatego każdy programista powinien wiedzieć, jak je utworzyć.

Dowiedzieliśmy się także jak walidować dane wejściowe, zarówno po stronie klienta (w przeglądarce, przy użyciu JavaScript, jQuery), jak i po stronie serwera (przy użyciu PHP). Dowiedzieliśmy się również wdrożyć procedurę opuszczenia obiektu.

Wszystkie skrypty zostały przetestowane i działają. Możesz pobrać archiwum z plikami tej małej witryny pod tym linkiem.

W przyszłości napiszę artykuł, w którym opiszę. Planuję też napisać artykuł, w którym to wyjaśnię (bez przeładowywania strony). Aby więc być na bieżąco z publikacjami nowych artykułów, możesz zapisać się do mojej witryny.

Jeśli masz jakieś pytania, skontaktuj się ze mną, a jeśli zauważysz jakiś błąd w artykule, daj mi znać.

Scenariusz lekcji (część 5):

  1. Stworzenie struktury HTML dla formularza autoryzacji
  2. Przetwarzamy otrzymane dane
  3. Powitanie użytkownika wyświetlamy w nagłówku witryny

Spodobał Ci się artykuł?



Nowość na stronie

>

Najbardziej popularny