Dlaczego włączenie parametru Register_globals w PHP jest niebezpieczne? Stworzenie prostego systemu rejestracji użytkowników w PHP i MySQL Rejestr bezosobowy indeks php

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/). Tworzymy tabelę użytkowników, będzie ona miała 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 treść:

W moim przypadku wygląda to tak:

Zapisz 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


Twój login:




Twoje hasło:








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

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




Strona główna


Strona główna


Twój login:


Twoje hasło:






Rejestr



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

Sprawdziłem wszystko, działa poprawnie!

Reg.ru: domeny i hosting

Największy rejestrator i dostawca usług hostingowych w Rosji.

Ponad 2 miliony nazw domen w obsłudze.

Promocja, poczta domenowa, rozwiązania biznesowe.

Wyboru dokonało już ponad 700 tysięcy klientów na całym świecie.

*Najedź myszą, aby wstrzymać przewijanie.

Powrót do przodu

Stworzenie prostego systemu rejestracji użytkowników w PHP i MySQL

Stworzenie systemu rejestracji jest bardzo pracochłonne. Musisz napisać kod, który weryfikuje adresy e-mail, wysyła wiadomość e-mail potwierdzającą rejestrację, a także sprawdza poprawność innych pól formularza i wiele więcej.

I nawet jak to wszystko napiszesz, użytkownicy będą niechętni do rejestracji, bo... wymaga to od nich pewnego wysiłku.

W tym samouczku stworzymy bardzo prosty system rejestracji, który w ogóle nie wymaga i nie przechowuje haseł! Wynik będzie łatwy do modyfikacji i dodania do istniejącej witryny PHP. Chcesz dowiedzieć się jak to działa? Czytaj poniżej.



Oto jak będzie działać nasz super prosty system:

Połączymy formularz autoryzacji i rejestrację. Formularz ten będzie zawierał pole do wpisania adresu e-mail oraz przycisk rejestracji;
- W przypadku wypełnienia pola adresem e-mail, kliknięcie przycisku rejestracji spowoduje utworzenie rekordu o nowym użytkowniku, ale tylko w przypadku, gdy wprowadzony adres e-mail nie został odnaleziony w bazie danych.

Następnie tworzony jest losowy, unikalny zestaw znaków (token), który wysyłany jest na wskazany przez użytkownika adres e-mail w postaci linku, który będzie ważny przez 10 minut;
- Link prowadzi użytkownika do naszej strony internetowej. System stwierdza obecność tokena i autoryzuje użytkownika;

Zalety tego podejścia:

Nie ma potrzeby przechowywania haseł ani sprawdzania poprawności pól;
- Nie ma potrzeby odzyskiwania hasła, pytań zabezpieczających itp.;
- Od momentu rejestracji/logowania użytkownika zawsze masz pewność, że znajdzie się on w Twojej strefie dostępu (że jego adres e-mail jest prawdziwy);
- Niesamowicie prosty proces rejestracji;

Wady:

Bezpieczeństwo konta użytkownika. Jeśli ktoś ma dostęp do poczty użytkownika, może się zalogować.
- E-mail nie jest bezpieczny i może zostać przechwycony. Należy pamiętać, że to pytanie ma znaczenie również w przypadku, gdy hasło zostało zapomniane i wymaga przywrócenia go lub w dowolnym systemie autoryzacyjnym, który nie wykorzystuje protokołu HTTPS do przesyłania danych (login/hasło);
- Jeśli prawidłowo skonfigurujesz swój serwer pocztowy, istnieje ryzyko, że wiadomości zawierające linki autoryzacyjne trafią do spamu;

Porównując zalety i wady naszego systemu, można stwierdzić, że system charakteryzuje się dużą użytecznością (maksymalna wygoda dla użytkownika końcowego), a jednocześnie charakteryzuje się niskim wskaźnikiem bezpieczeństwa.

Dlatego sugeruje się używanie go do rejestracji na forach i usługach, które nie działają z ważnymi informacjami.

Jak korzystać z tego systemu

Jeśli potrzebujesz po prostu użyć systemu do autoryzacji użytkowników w swojej witrynie i nie chcesz niszczyć tej lekcji, wykonaj następujące czynności:

Należy pobrać źródła dołączone do lekcji
- Znajdź w archiwum plik Tables.sql i zaimportuj go do swojej bazy danych za pomocą opcji importu w phpMyAdmin. Alternatywny sposób: otwórz ten plik za pomocą edytora tekstu, skopiuj zapytanie SQL i wykonaj je;
- Otwórz plik include/main.php i uzupełnij ustawienia połączenia z bazą danych (podaj użytkownika i hasło do połączenia z bazą danych, a także hosta i nazwę bazy danych). W tym samym pliku należy podać także adres e-mail, który będzie używany jako oryginalny adres dla wiadomości wysyłanych przez system. Niektóre hosty blokują wychodzące wiadomości e-mail, chyba że formularz zawiera prawdziwy adres e-mail, który został utworzony w panelu sterowania hosta, więc podaj prawdziwy adres;
- Prześlij wszystkie pliki i zasoby Index.php, chronione.php oraz foldery poprzez FTP do swojego hosta;
- Dodaj poniższy kod do każdej strony PHP, na której chcesz wyświetlić formularz logowania;

Require_once "zawiera/main.php"; $użytkownik = nowy użytkownik(); if(!$user->loggedIn())( redirect("index.php"); )
- Gotowy!

Dla tych, którzy są ciekawi, jak to wszystko działa, przeczytaj poniżej!

Pierwszym krokiem jest napisanie kodu HTM dla formularza autoryzacyjnego. Kod ten znajduje się w pliku Index.php. Plik ten zawiera również kod PHP obsługujący dane formularzy i inne przydatne funkcje systemu logowania. Więcej na ten temat dowiesz się w poniższej sekcji poświęconej przeglądowi kodu PHP.

indeks.php

Poradnik: Super prosty system rejestracji z PHP i MySQL Zaloguj się lub zarejestruj

Wpisz powyżej swój adres e-mail, a my wyślemy
ci link do logowania.

Zaloguj się/Zarejestruj się

W sekcji nagłówka (pomiędzy tagami i) umieściłem główne style (nie są one omówione w tym poradniku, więc możesz je przejrzeć samodzielnie. Folder Assets/css/style.css). Przed tagiem zamykającym umieściłem bibliotekę jQuery oraz plik script.js, który napiszemy i przeanalizujemy poniżej.


JavaScript

jQuery śledzi stan przycisku „Zarejestruj się/Zaloguj” za pomocą tej funkcji e.preventDefault() i wysyła żądania AJAX. W zależności od odpowiedzi serwera wyświetla ten lub inny komunikat i określa dalsze działania/

aktywa/js/script.js

$(funkcja())( var formularz = $("#login-register"); form.on("prześlij", funkcja(e)( if(form.is(.loading, .loggedIn"))( return false ; ) var email = form.find("input").val(), MessageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (e-mail: e-mail), funkcja (m)( if(m.error)( form.addClass("błąd"); MessageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); MessageHolder .text(m.message); ) )); )); $(dokument).ajaxStart(funkcja())( form.addClass("ładowanie"); )); $(dokument).ajaxComplete(funkcja()) (formularz. usuńKlasę("ładowanie"); )); ));

do formularza dodano możliwość wyświetlenia aktualnego stanu żądania AJAX (było to możliwe dzięki metodom ajaxStart()) I ajaxComplete(), który znajdziesz na końcu pliku).

Klasa ta wyświetla obracający się animowany plik GIF (jakby miała zasygnalizować nam, że żądanie jest przetwarzane), a także pełni funkcję flagi uniemożliwiającej ponowne przesłanie formularza (gdy przycisk rejestracji został już raz kliknięty). Kolejną flagą jest klasa .loggedIn - ustawiana jest w chwili wysłania wiadomości e-mail. Flaga ta natychmiast blokuje dalsze działania z formularzem.

Schemat bazy danych

Nasz niezwykle prosty system logowania wykorzystuje 2 tabele MySQL (kod SQL znajduje się w pliku Tables.sql). Pierwsza przechowuje dane o kontach użytkowników. Drugi przechowuje informację o liczbie prób logowania.


Schemat tabeli użytkowników.

System nie wykorzystuje haseł, co widać na schemacie. Na nim widać kolumnę tokenów z tokenami sąsiadującymi z kolumną token_validity. Token jest instalowany w momencie, gdy użytkownik połączy się z systemem i ustawi swój adres e-mail do wysłania wiadomości (więcej na ten temat w kolejnym bloku). Kolumna token_validity ustawia czas 10 minut później, po upływie którego token traci ważność.


Schemat tabeli zliczającej liczbę prób autoryzacji.

W obu tabelach adres IP zapisany jest w formie przetworzonej, przy wykorzystaniu funkcji ip2long w polu typu integer.

Teraz możemy napisać trochę kodu PHP. Główna funkcjonalność systemu przypisana jest do klasy User.class.php, co widać poniżej.

Ta klasa aktywnie korzysta z idorm (docs), biblioteki te stanowią minimum niezbędnych narzędzi do pracy z bazami danych. Obsługuje dostęp do bazy danych, generowanie tokenów i weryfikację tokenów. Zapewnia prosty interfejs, który ułatwia podłączenie systemu rejestracji do Twojej witryny, jeśli korzysta ona z PHP.

Użytkownik.klasa.php

Klasa User( // Prywatny przypadek ORM private $orm; /** * Znajdź użytkownika po tokenie. Rozpatrywane są tylko ważne tokeny. Token jest generowany tylko przez 10 minut od momentu jego utworzenia * @param string $token To jest ten token, którego szukamy * @return User Zwraca wartość funkcji User */ public staticfunction findByToken($token)( // znajdź token w bazie danych i upewnij się, że ustawiony jest poprawny znacznik czasu $result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > TERAZ()") ->find_one(); if(!$result)( return false; ) zwróć nowego użytkownika($result); ) /** * Autoryzuj lub zarejestruj użytkownika * @param string $email Adres e-mail użytkownika * @return Użytkownik */ publiczna funkcja statyczna loginOrRegister($email)( // Jeśli taki użytkownik już istnieje istnieje, zwróć wartość funkcji User z podanego adresu e-mail zapisanego w bazie danych if(User::exists($email))( return new User($email); ) // W przeciwnym razie utwórz nowego użytkownika w bazie danych i zwróć wartość funkcji User::create z podanego adresu e-mail. return User::create($email ); ) /** * Utwórz nowego użytkownika i zapisz w bazie danych * @param string $email. Adres e-mail użytkownika * @return Użytkownik */ prywatna funkcja statyczna create($email)( // Napisz nowego użytkownika i zwróć wynik funkcji User na podstawie tych wartości $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Sprawdź, czy taki użytkownik istnieje w bazie danych i zwróć wartość logiczną zmienna * @param string $email. Adres e-mail użytkownika * @return boolean */ publiczna funkcja statyczna istnieje($email)( // Czy użytkownik istnieje w bazie danych? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Utwórz nowy obiekt użytkownika * @param instancja $param ORM , id, e-mail lub 0 * @return Użytkownik */ funkcja publiczna __construct($param = null) ( if($param instancja ORM)( // Sprawdzenie ORM zakończone pomyślnie $this->orm = $param; ) else if(is_string($param))( // Sprawdzenie ORM zakończone pomyślnie $this->orm = ORM:: for_table („reg_users”) ->where(”email”, $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // wartość zmiennej $param wynosi przekazywany do identyfikatora użytkownika $id = $param; ) else if(isset($_SESSION["loginid"]))( // W przeciwnym razie zobacz sesję $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Generuje nowy token autoryzacyjny SHA1, zapisuje go do bazy danych i zwraca jego wartość * @return string */ funkcja publiczna generateToken( )( // Wygeneruj token dla autoryzowanego użytkownika i zapisz go w bazie $token = sha1($this->email.time().rand(0, 1000000)); // Zapisz token w bazie danych // I oznacz go jako ważny tylko na kolejne 10 minut $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(TERAZ(),"0:10")"); $this->orm->save(); zwróć $token; ) /** * Autoryzuj użytkownika * @return void */ funkcja publiczna login())( // Oznacz użytkownika jako zalogowanego $_SESSION["loginid"] = $this->orm->id; // Zaktualizuj wartość pola bazy danych last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Zniszcz sesję i wyloguj użytkownika * @return void */ wylogowanie funkcji publicznej ()( $_SESSION = array(); unset($_SESSION); ) /** * Sprawdzanie, czy użytkownik jest zalogowany * @return boolean */ funkcja publiczna zalogowana())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Sprawdza, czy użytkownik jest administratorem * @return boolean */ public funkcja isAdmin())( return $this->rank() = = "administrator"; ) /** * Znajdź typ użytkownika, może to być administrator lub zwykły * @return string */ funkcja publiczna rank())( if ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Metoda pozwalająca uzyskać prywatne informacje o użytkowniku jako * właściwości obiektu User * @ param string $key Nazwa właściwości, która uzyskuje dostęp * @return mieszany */ funkcja publiczna __get($key)( if(isset($this->orm->$key))( return $this->orm-> $klucz; ) zwróć wartość null; ) )

Tokeny generowane są przy użyciu algorytmu SHA1 i przechowywane w bazie danych. Używam funkcji pomiaru czasu MySQL, aby ustawić 10-minutowy limit czasu ważności tokena.

Kiedy token zostanie zweryfikowany, bezpośrednio mówimy obsłudze, że bierzemy pod uwagę tylko tokeny, które jeszcze nie wygasły i są przechowywane w kolumnie token_validity.

Pamiętaj, że używam metody magicznej __Dostawać docs na końcu pliku, aby przechwycić dostęp do właściwości obiektu User.

Dzięki temu możliwy staje się dostęp do informacji przechowywanych w bazie danych dzięki właściwościom $user->email, $user->token itp. W kolejnym fragmencie kodu przyjrzymy się jak na przykładzie wykorzystać te klasy .


Chroniona strona

Kolejnym plikiem przechowującym użyteczną i niezbędną funkcjonalność jest plikfunctions.php. Istnieje kilka tzw. pomocników – funkcji asystentów, które pozwalają na tworzenie czystszego i bardziej czytelnego kodu w innych plikach.

funkcje.php

Funkcja send_email($from, $to, $temat, $message)( // Pomocnik wysyłający e-mail $headers = "Wersja MIME: 1.0" . "\r\n"; $headers .= "Typ zawartości: tekst /plain; charset=utf-8" . "\r\n"; $headers .= "Od: ".$from . "\r\n"; wiadomość zwrotna($do, $temat, $wiadomość, $nagłówki ); ) funkcja get_page_url())( // Określ adres URL pliku PHP $url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://" .$_SERVER ["NAZWA_SERWERA"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) else( $url. = $_SERVER["PATH_INFO"]; ) return $url; ) funkcjarate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Liczba prób logowania w ciągu ostatniej godziny na ten adres IP $ count_hour = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > PODCZAS(TERAZ(),"1:00 ")") ->count(); // Liczba prób logowania w ciągu ostatnich 10 minut pod tym adresem IP $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u ", ip2long($ ip))) ->where_raw("ts > PODCZAS(TERAZ(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( wyrzuć nowy wyjątek("Zbyt wiele prób logowania!"); ) ) funkcjarate_limit_tick($ip, $email)( // Utwórz nowy rekord w tabeli która liczy liczbę prób logowania $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->save(); ) funkcja przekierowanie($url)( header("Lokalizacja: $url"); wyjście; )

Funkcje ograniczenie szybkości I stawka_limit_tick monitorować liczbę prób autoryzacji w okresie czasu, jaki upłynął od pierwszej próby. Próba logowania zapisywana jest w bazie danych w kolumnie reg_login_attempt. Funkcje te są wywoływane podczas przetwarzania i przesyłania danych formularza, jak widać z poniższego fragmentu kodu.

Poniższy kod pochodzi z pliku Index.php i obsługuje przesyłanie formularza. Zwraca odpowiedź JSON, która z kolei jest przetwarzana przez jQuery w pliku Assets/js/script.js, który oglądaliśmy wcześniej.

indeks.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Wyprowadź nagłówek nagłówka JSON("Typ zawartości: aplikacja/json"); // Czy ten adres e-mail jest prawidłowy, jeśli (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( rzut nowy wyjątek("Wprowadź poprawny adres e-mail."); ) // Sprawdź, czy użytkownik mógł się zalogować, czy przekroczył liczbę dozwolonych połączeń? (plikfunctions.php, aby uzyskać więcej informacji)rate_limit($_SERVER["REMOTE_ADDR"]); // Zarejestruj tę próbę logowaniarate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Wyślij e-mail do użytkownika $message = ""; $email = $_POST["email"]; $subject = "Twój link do logowania"; if(!User:: istnieje($email) )( $subject = "Dziękujemy za rejestrację!"; $message = "Dziękujemy za rejestrację na naszej stronie!\n\n"; ) // Próba autoryzacji lub rejestracji użytkownika $user = Użytkownik ::loginOrRegister($_POST[ "email"]); $message.= "Możesz zalogować się z tego adresu URL:\n"; $message.= get_page_url().”?tkn=".$user->generateToken()."\n\n"; $message.= "Link wygaśnie automatycznie po 10 minutach."; $result = send_email($fromEmail, $_POST["email"], $temat, $wiadomość); if(!$result)( rzut nowy wyjątek("Wystąpił błąd podczas wysyłania wiadomości e-mail. Spróbuj ponownie."); ) die(json_encode(array("message" => "Dziękujemy! Wysłaliśmy link do swojej skrzynki odbiorczej. Sprawdź także folder ze spamem."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() ))); )

Po udanym logowaniu/rejestracji powyższy kod wyśle ​​użytkownikowi link do logowania. Token staje się dostępny, ponieważ jest ona przekazywana jako zmienna w wygenerowanym łączu przez metodę $_GET ze znacznikiem tkn

indeks.php

If(isset($_GET["tkn"]))( // Czy ten token jest ważny do autoryzacji? $user = User::findByToken($_GET["tkn"]); if($user)( // Tak, is. Przekieruj na chronioną stronę $user->login(); redirect("protected.php"); ) // Nie, token jest nieprawidłowy. Przekieruj na stronę z formularzem autoryzacji/rejestracji redirect("index. php"); )

$użytkownik->login()

utworzy niezbędne zmienne dla sesji, dzięki czemu użytkownik przeglądając kolejne strony serwisu, przez cały czas pozostanie autoryzowany.

Przetwarzanie funkcji wyjścia z systemu odbywa się w podobny sposób.

indeks.php

If(isset($_GET["logout"]))( $user = nowy użytkownik(); if($user->loggedIn())( $user->logout(); ) redirect("index.php") ;)

Na koniec kodu ponownie ustawiam przekierowanie na indeks.php, więc parametr ?wyloguj=1 przesyłane za pośrednictwem adresu URL nie jest wymagane.

Nasz plik Index.php wymaga dodatkowych. ochrona - nie chcemy, aby osoby, które zalogowały się do systemu, ponownie zobaczyły formularz rejestracyjny. Do tych celów używamy metody $użytkownik->zalogowany().

indeks.php

$użytkownik = nowy użytkownik(); if($user->loggedIn())(redirect("protected.php"); )

Na koniec oto fragment kodu, który pozwala chronić strony Twojej witryny i udostępniać je dopiero po autoryzacji.

chroniony.php

// Aby chronić każdą stronę w swojej witrynie, dołącz plik main.php // i utwórz nowy obiekt użytkownika. Jakie to proste! require_once "zawiera/main.php"; $użytkownik = nowy użytkownik(); if(!$user->loggedIn())( redirect("index.php"); )

Po tym sprawdzeniu możesz mieć pewność, że użytkownik został pomyślnie autoryzowany. Dostęp do informacji przechowywanych w bazie danych można także uzyskać za pomocą właściwości obiektu $użytkownik. Aby wyświetlić adres e-mail i status użytkownika, użyj tego kodu:

Echo "Twój e-mail: ".$user->email; echo "Twoja ranga: ".$user->rank();

metoda ranga() jest tutaj używane, ponieważ baza danych zwykle przechowuje liczby (0 dla zwykłego użytkownika, 1 dla administratora) i musimy te dane przekonwertować na statusy, do których należą, w czym pomaga nam ta metoda.

Aby uczynić zwykłego użytkownika administratorem, po prostu edytuj wpis użytkownika za pomocą phpMyAdmin (lub dowolnego innego programu umożliwiającego zarządzanie bazami danych). Status administratora nie daje żadnych uprawnień, w tym przykładzie strona wyświetli, że jesteś administratorem - i to wszystko.

Ale co z tym zrobić, pozostawiamy Twojemu uznaniu; możesz sam napisać i skomponować kod, który ustawi pewne uprawnienia i możliwości dla administratorów.

Skończyliśmy!

Skończyliśmy z tym niesamowicie super quasi prostym kształtem! Możesz go używać w swoich witrynach PHP, jest to całkiem proste. Możesz także zmodyfikować go dla siebie i uczynić go tak, jak chcesz.

Materiał przygotował Denis Malyshok specjalnie na potrzeby serwisu

P.S. Chcesz pójść dalej w opanowaniu PHP i OOP? Zwróć uwagę na lekcje premium dotyczące różnych aspektów tworzenia stron internetowych, w tym programowania w PHP, a także bezpłatny kurs tworzenia własnego systemu CMS w PHP od podstaw przy użyciu OOP:

Spodobał Ci się materiał i chcesz mi podziękować?
Po prostu udostępnij znajomym i współpracownikom!


Z uwagi na to, że bardzo często pojawiają się pytania dotyczące zmiennych globalnych oraz problemów związanych z wyłączeniem dyrektywy Register_globals, postaramy się nieco przybliżyć ten temat w tym artykule.

Najpierw zdefiniujmy, czym są zmienne zewnętrzne. Są to dowolne zmienne, które przychodzą do programu z zewnątrz, tj. nie są zdefiniowane w samym programie. W przypadku skryptu php wszystkie zmienne przekazywane przez linię przeglądarki lub formularz są zewnętrzne.
Przyjrzyjmy się, jak powstają.

Jeżeli na serwerze (w php.ini) włączona jest dyrektywa Register_globals = On, to przy przekazywaniu zmiennych przez formularz lub przez linię przeglądarki, w skrypcie, do którego te zmienne są przeznaczone, zostaną one utworzone automatycznie. Te. jeśli w linii przeglądarki masz napisane: www.server.ru/index.php?var=1, to w skrypcie Index.php automatycznie utworzona zostanie zmienna $var o wartości równej 1.

Komentarz

Dyrektywa ta jest jednym z najbardziej kontrowersyjnych punktów w języku PHP. Z jednej strony jego użycie rzeczywiście może spowodować realne problemy z ochroną skryptów PHP, jeśli nie zostaną odpowiednio uwzględnione możliwe sytuacje błędów, a wielu programistów słusznie zauważa, że ​​pisanie skryptów bez użycia zmiennych globalnych zmniejsza podatność skryptów na różnego rodzaju ataki o 90%. Z drugiej strony, u zarania PHP twórcom języków ufało ponad tysiąc użytkowników (do PHP 4.3 ta dyrektywa była domyślnie włączona), dzięki czemu obecnie istnieją miliony faktycznie działających skryptów napisanych przy użyciu zmiennych globalnych (jest to warto zaznaczyć, że dla celów edukacyjnych czasami całkowicie warto pisać skrypty wykorzystujące zmienne globalne, gdyż zastąpienie ich tablicami superglobalnymi znacznie pogarsza czytelność kodu).

Obecnie większość dostawców usług hostingowych ma włączoną tę dyrektywę i prawdopodobnie pozostanie włączona przez długi czas, ponieważ w przeciwnym razie może to spowodować przerwanie ciągłości kodu.

Gdy dyrektywa Register_globals jest wyłączona, dostęp do takich zmiennych możliwy jest na dwa sposoby:

  • poprzez tablice asocjacyjne HTTP_***_VARS (HTTP_POST_VARS itp.)
  • poprzez tablice superglobalne ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES itp.)

Tablice superglobalne są dostępne w dowolnym zakresie. Programiści PHP zalecają wyłączenie dyrektywy Register_globals na serwerze i pracę ze zmiennymi poprzez tablice superglobalne. To zalecenie wynika z problemów bezpieczeństwa, które mogą wystąpić po włączeniu dyrektywy Register_globals.

Chociaż do niedawna dyrektywa Register_globals pozostawała włączona w witrynach hostingowych. Sytuacja zaczęła się zmieniać wraz z wydaniem PHP 5, gdzie ta dyrektywa jest domyślnie wyłączona, a hosterzy nie spieszą się z jej włączeniem (może i słusznie).

Co dokładnie należy zrobić, aby uzyskać zmienne?Musisz je pobrać z tablic superglobalnych. Na przykład, aby przekazać zmienne przez linię przeglądarki, użyj tablicy $_GET. Powiedzmy, że linia przeglądarki mówi www.server.ru/index.php?var=1.Następnie, aby uzyskać zmienną var w pliku Index.php, musisz napisać:

$zmienna=$_GET["zmienna"];

I żeby np. otrzymać zmienne przeniesione z formularza metodą POST, w skrypcie obsługi formularza należy napisać:

$zmienna=$_POST["zmienna"];

W tym artykule dowiesz się, jak utworzyć formularz rejestracji i logowania 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 komputerze lokalnym, mam nadzieję, że masz już zainstalowany i działający serwer lokalny. 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:

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 będzie prowadził do strony z formularzem rejestracyjnym (plik form_register.php), a drugi do strony z formularzem autoryzacji (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:


Korzystając z wymaganego atrybutu, wszystkie pola stały się obowiązkowe.

Zwróć uwagę na kod formularza rejestracyjnego, w którym 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 przejdziemy dalej, musimy 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.

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

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 wdrożyć i przetwarzać formularze rejestracji i autoryzacji użytkowników na swojej stronie internetowej. 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ę także jak wdrożyć procedurę opuszczenia serwisu.

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

  • Stworzenie struktury HTML dla formularza autoryzacji
  • Przetwarzamy otrzymane dane
  • Powitanie użytkownika wyświetlamy w nagłówku witryny
  • Spodobał Ci się artykuł?

    Nie wiem dlaczego… nie, wiem dlaczego nie można włączyć dyrektywy „registr_globals”, ale nie wiem, dlaczego w literaturze z reguły nic się na ten temat nie mówi.

    W tym artykule postaram się wyciągnąć z czołgu wszystkich, którzy w nim siedzą i wyjaśnić, co jest co (szczególnie tym, którzy są w pociągu pancernym – przyp. red.). Nie bez powodu niektórzy hostingodawcy wyłączają tę dyrektywę. Więc…

    Jak to działa

    W ustawieniach PHP (plik php.ini) znajduje się taka dyrektywa Register_globals. Oznacza to, że jeśli jest włączona (register_globals = on), to wszystkie zmienne przekazywane za pomocą GET i POST zostaną automatycznie zarejestrowane jako globalne. Co to znaczy?

    Przykładowo przekazujemy metodę GET do skryptu indeks.php jakąś wartość strony: indeks.php?page=2. Przekazana wartość jest przechowywana w tablicy GET i może zostać użyta w skrypcie jako $_GET["strona"]. Jeśli jednak mamy włączoną funkcję Register_globals, wówczas dla przekazanej wartości zostanie utworzona zmienna $page, która jest dostępna w dowolnej części skryptu Index.php.

    Małe podsumowanie i uzupełnienie. Gdy opcja Register_globals jest włączona, tworzone są trzy kopie zmiennej: w tablicy GET, w tablicy GLOBALS i po prostu sama zmienna ($_GET["strona"], $GLOBALS["strona"], $strona), natomiast gdy funkcja Register_globals jest wyłączona, przekazana wartość może być dostępna tylko poprzez tablicę GET ($_GET["strona"]). Pamiętać.

    Niebezpieczeństwo użytkowania

    Spójrzmy na prosty przykład, aby zrozumieć, co nas czeka (od 3 do 5 lat - notatka redaktora). Żeby było łatwiej od razu powiem, że $login i $password to zmienne przekazywane metodą GET/POST.

    Krótko o działaniu skryptu:

      Linia 2. Składamy żądanie do bazy danych w celu wyciągnięcia prawdziwego hasła do wprowadzonego przez użytkownika loginu.

      Linia 3. Otrzymujemy to hasło i przypisujemy je do zmiennej $real_pass.

      Linia 4. Porównujemy prawdziwe i wprowadzone hasło i jeśli są zgodne, wówczas zmiennej $check zostanie przypisana wartość true.

      Linie 5-8. Jeżeli $check ma wartość true, to piszemy, że autoryzacja przebiegła pomyślnie itd.

    Zaproponowany scenariusz z założenia jest najbardziej nieszczelny na świecie, a teraz pokażę Wam te dziury. Warunek: rejestr_globalny jest włączony.

    Załóżmy, że transfer odbywa się metodą GET. Następnie adres URL będzie wyglądał mniej więcej tak:
    www.site.com/index.php?login =admin&hasło =qwerty
    Oczywiste jest, że natychmiast tworzone są zmienne globalne $login i $password. Teraz spójrz na skrypt. Zawiera zmienną $check. Co się stanie, jeśli przekażesz go przez adres URL?

    www.site.com/index.php?login =admin&hasło =qwerty&check =1
    Następnie pomijana jest kontrola dopasowania hasła i użytkownik zostaje natychmiast autoryzowany (w końcu pamiętasz, że 1 to prawda, a 0 to fałsz?). Ten sam rezultat wystąpi, jeśli napiszemy www.strona.com/indeks.php?sprawdzać =1 . I nawet jeśli użyjesz metody POST, wszystkie tego typu oszustwa nadal będą działać, ponieważ gdy włączona jest funkcja Register_globals, nie ma znaczenia, jakiej metody użyjesz - GET czy POST.

    Chyba ktoś ma pytanie, skąd cracker ma wiedzieć o zmiennej check, że jest ona za wszystko odpowiedzialna? Jeśli nikomu nie pokazałeś scenariusza, jest mało prawdopodobne, że się o tym dowie. Nie każdy jednak korzysta z własnych skryptów, CMS-ów itp., lecz korzysta z tego, co jest dostępne w sieci. W takich przypadkach cracker może na przykład badać kod CMS i atakować strony utworzone za jego pomocą.

    Jednak nie wszyscy dostawcy usług hostingowych wyłączają funkcję Register_globals i nawet jeśli Twoje skrypty są zaprojektowane tak, aby nie mieć włączonej funkcji Register_globals, cracker nadal może zhakować Twój skrypt, wykorzystując lukę w tej dyrektywie.

    Weźmy nasz przykład. Aby go chronić w przypadku włączenia rejestru_globals, po linii jeśli ($hasło==$prawdziwy_przepustka) $sprawdź =PRAWDA; dodaj następujące informacje: jeszcze $sprawdź =FAŁSZ;. W tym przypadku, nawet jeśli metodą GET zostanie przekazana zmienna sprawdzająca równa jeden, skrypt i tak ustawi $check=false, jeśli hasło będzie nieprawidłowe.

    Tak, chciałbym również zwrócić Twoją uwagę na fakt, że jeśli wyłączysz Register_globals, to nasz przykład nie zadziała. Aby to zadziałało, musisz napisać $login = $_POST["login"]; $hasło = $_POST["hasło"];

    Podsumujmy to...

    i wyciągnij dwa główne wnioski:

    1) Gdy włączona jest funkcja Register_globals, można przekazywać różne zmienne, których wartości nie zostały obliczone do odbioru poprzez GET lub POST.

    2) Sam Register_globals nie jest tak niebezpieczny, jak krzywo napisany skrypt.

    To wszystko na dzisiaj! Będzie mi bardzo miło poznać Wasze komentarze, uwagi, sugestie i po prostu opinie. Dlatego pisz, nie wstydź się!

    Z życzeniami udanego tygodnia,
    Aleksander SZUJSKI