Vartotojų registro php klaida. Neįtikėtinai paprastos registracijos sistemos kūrimas PHP ir MySQL

Jei vieną iš savo svetainės skilčių reikia padaryti prieinamą ribotam, bet neapibrėžtam žmonių ratui, paprasčiausias būdas tai padaryti – užsiregistruoti ir suteikti naudotojų įgaliojimus. Yra daug būdų, kaip autorizuoti vartotojus. Galite naudoti tiek žiniatinklio serverio įrankius, tiek programavimo kalbos įrankius. Mes kalbėsime apie atvejį, kai naudojami PHP seansai.

Tikriausiai norėtumėte pamatyti modernesnį šios formos kūrimo būdą. Vis dar turiu planų visapusiškai ją pateikti šiuolaikiškai ir aktualiai, bet matote, kad grįžtamojo ryšio formą galima sukurti naudojant PHP objektinius metodus.

Pirmiausia aptarkime visus veiksmus, kurių imsimės toliau. Ko mums net reikia? Mums reikia scenarijaus, kuris užregistruos vartotoją, autorizuos vartotoją, po autorizavimo vartotoją kur nors nukreips. Taip pat turėsime sukurti puslapį, kuris būtų apsaugotas nuo neteisėtų vartotojų prieigos. Norėdami užsiregistruoti ir autorizuoti, turėsime sukurti HTML formas. Informaciją apie registruotus vartotojus saugosime duomenų bazėje. Tai reiškia, kad mums vis tiek reikia scenarijaus prisijungimui prie DBVS. Visas mūsų darbas bus atliktas funkcijomis, kurias rašome patys. Šias funkcijas išsaugosime atskirame faile.

Taigi, mums reikia šių failų:

  • prisijungimas prie DBVS;
  • individualizuotos funkcijos;
  • leidimas;
  • registracija;
  • apsaugotas puslapis;
  • vartotojo išjungimo scenarijus;
  • scenarijus, tikrinantis vartotojo autorizacijos būseną;
  • stiliaus lapas, skirtas paprasčiausiam mūsų puslapių dizainui.

Visa tai bus beprasmiška, jei duomenų bazėje neturėsite atitinkamos lentelės. Paleiskite DBVS valdymo įrankį (PhpMyAdmin arba komandų eilutę, kuri patogesnė) ir paleiskite joje šią užklausą:

KURTI LENTELĘ "naudotojai" ("id" int(11) NOT NULL AUTO_INCREMENT, "prisijungimo" simbolis(16) NOT NULL, "slaptažodis" char(40) NOT NULL, "reg_date" laiko žyma NOT NULL NUMATYTOJI CURRENT_TIMESTAMP ("PRENDIMAS" id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Mūsų scenarijaus failus pavadinsiu taip (jie visi bus viename kataloge):

  • duomenų bazė.php;
  • funkcijos.php;
  • prisijungimas.php;
  • registracija.php;
  • index.php;
  • logout.php;
  • checkAuth.php;
  • stilius.css.

Kiekvieno iš jų tikslas, esu tikras, jums aiškus. Pradėkime nuo prisijungimo prie DBVS scenarijaus. Jūs tai jau matėte. Tiesiog išsaugokite šio scenarijaus kodą faile duomenų bazė.php. Pasirinktines funkcijas deklaruosime functions.php faile. Kaip visa tai veiks? Neteisėtas vartotojas bando prieiti prie saugomo dokumento index.php, sistema patikrina, ar vartotojas autorizuotas, jei vartotojas neautorizuotas, jis nukreipiamas į autorizacijos puslapį. Prisijungimo puslapyje vartotojas turėtų matyti įgaliojimo formą. Padarykime tai.

Vartotojo įgaliojimas

užsiregistruoti.



Dabar mūsų formai reikia suteikti tam tikrą formą. Tuo pačiu metu nustatysime taisykles kitiems elementams. Žvelgdamas į ateitį, pateiksiu visą stiliaus lapo turinį.

/* style.css failas */ .row ( margin-bottom:10px; width:220px; ) .row label ( display:block; font-weight:bold; ) .row input.text ( šrifto dydis:1.2em; padding:2px 5px; .to_reg ( font-size:0.9em; ) .instruction ( šrifto dydis:0.8em; color:#aaaaaa; margin-left:2px; cursor:default; ) .error ( spalva:raudona; paraštė kairėje: 3 pikseliai )

Jei viskas padaryta teisingai, naršyklėje turėtų būti:

Žinoma, kol kas neturime nei vieno registruoto vartotojo, o norint prisijungti, reikia užsiregistruoti. Padarykime registracijos formą.

Vartotojo registracija

" />


Tikriausiai pastebėjote, kad HTML kode yra PHP kintamųjų. Tai formų teksto laukų atributų turinys, konteinerių, skirtų klaidoms rodyti, turinys. Tačiau mes šių kintamųjų nepainicijuojome. Padarykime tai.

Vartotojo registracija

" />
Vartotojo varde gali būti tik lotyniški simboliai, skaičiai ir simboliai „_“, „-“, „.“. Vartotojo vardas turi būti ne trumpesnis nei 4 simbolių ir ne ilgesnis nei 16 simbolių
Slaptažodyje galite naudoti tik lotyniškus simbolius, skaičius ir simbolius „_“, „!“, „(“, „)“. Slaptažodis turi būti ne trumpesnis nei 6 simbolių ir ne ilgesnis nei 16 simbolių
Pakartokite anksčiau įvestą slaptažodį


Formos žymos veiksmo atribute nenurodytas joks parametras. Tokiu atveju, kai pateikiami formos duomenys, jie bus apdorojami tuo pačiu scenarijumi, iš kurio buvo išsiųsti. Tai reiškia, kad turime parašyti kodą, kuris apdoroja formos duomenis. Bet pirmiausia aptarkime jų apdorojimo algoritmą.

Turime, kad prisijungimo ir slaptažodžio laukai nebūtų tušti. Tada turite patikrinti prisijungimo vardą, ar jis atitinka reikalavimus. Slaptažodis taip pat turi atitikti aprašytus reikalavimus, o pakartotinai nurodytas slaptažodis turi atitikti jį ir, be to, turi būti identiški. Jei kuri nors iš šių sąlygų neįvykdoma, formos duomenų apdorojimas turi būti sustabdytas, į klaidos pranešimų masyvą turi būti įrašytas atitinkamas įspėjimas ir jis turi būti rodomas vartotojui. Vartotojo patogumui jo įvestą prisijungimo vardą (jei jis nurodė) išsaugosime įrašydami jo reikšmę į $fields masyvą.

Jei viskas gerai, naršyklės lange, kai prisijungiate prie registravimo.php dokumento, turėtumėte pamatyti kažką panašaus į tai:

Tarkime, kad vartotojas paspaudė registracijos mygtuką ir neužpildė formos laukų. Pagal mūsų algoritmą prisijungimo vardas ir slaptažodis negali būti tušti. Jei ši sąlyga nesilaikoma, registracija negalima. Turime omenyje, kad formos duomenys apdorojami pagal dabartinį scenarijų. Tai reiškia, kad turime pakeisti jo kodą pridėdami atitinkamus patikrinimus. Nedelsdami aptarkime šiuos patikrinimus. Jei įvedėte ir prisijungimo vardą, ir slaptažodį, turite patikrinti jų atitiktį nurodytiems reikalavimams. Norėdami patikrinti prisijungimo vardą ir slaptažodį, faile functions.php sukursime pasirinktines funkcijas.

/** * functions.php * Failas su pasirinktomis funkcijomis */ // Prijunkite failą su ryšio parametrais prie DBVS Reikaling_once("database.php"); // Vartotojo vardo funkcijos patikrinimas checkLogin($str) ( // Inicijuoti kintamąjį su galimu klaidos pranešimu $error = ""; // Jei trūksta prisijungimo eilutės, grąžinkite klaidos pranešimą if(!$str) ( $error = " Jūs neįvedėte vartotojo vardo" return $error ) /** * Patikrinkite vartotojo vardą naudodami įprastus posakius * Prisijungimo vardas turi būti ne trumpesnis nei 4, ne ilgesnis nei 16 simbolių * Jame turi būti lotyniškos abėcėlės simboliai; skaičiai, * gali būti simboliai "_", "-", "." */ $pattern = "/^[-_.a-z\d](4,16)$/i"; ($pattern, $str) // Jei patikrinti nepavyksta, grąžinkite klaidos pranešimą if(!$result) ( $error = "Netinkami simboliai vartotojo varde arba vartotojo vardas per trumpas (ilgas)"; return $error; ) // Jei viskas gerai, grąžinkite reikšmę true return true ) // Tikrinama vartotojo slaptažodžio funkcija checkPassword($str) ( // Inicijuoti kintamąjį su galimu klaidos pranešimu $error = ""; // Jei yra; nėra prisijungimo eilutės, grąžinkite klaidos pranešimą if(!$ str) ( $error = "Neįvedėte slaptažodžio";

grąžinti $klaida;

Sėkmingai užsiregistravote sistemoje. Dabar būsite nukreipti į prisijungimo puslapį. Jei taip neatsitiks, spustelėkite tiesioginę nuorodą.

"; header("Refresh: 5; URL = login.php"); ) // Kitu atveju informuokite vartotoją apie klaidą kitur ( $errors["full_error"] = $reg; ) ) ) ?> Vartotojo registracija
" />
Vartotojo varde gali būti tik lotyniški simboliai, skaičiai ir simboliai „_“, „-“, „.“. Vartotojo vardas turi būti ne trumpesnis nei 4 simbolių ir ne ilgesnis nei 16 simbolių
Slaptažodyje galite naudoti tik lotyniškus simbolius, skaičius ir simbolius „_“, „!“, „(“, „)“. Slaptažodis turi būti ne trumpesnis nei 6 simbolių ir ne ilgesnis nei 16 simbolių
Pakartokite anksčiau įvestą slaptažodį


Turėjote pastebėti dar vieną naują scenarijaus funkciją - registracija() . Bet mes to dar nepaskelbėme. Padarykime tai.

// Vartotojo registracijos funkcija funkcija registracija($login, $password) ( // Inicijuoti kintamąjį su galimu klaidos pranešimu $error = ""; // Jei nėra prisijungimo eilutės, grąžinkite klaidos pranešimą if(!$login) ( $ error = "Nenurodytas prisijungimas"; return $error; ) elseif(!$password) ( $error = "Nenurodytas slaptažodis"; return $error; ) // Patikrinkite, ar vartotojas jau užsiregistravęs // Prisijunkite prie DBMS connect() ; // Parašykite užklausos eilutę $sql = "SELECT `id` FROM `users` WHERE `login`="" . $login . """ // Padarykite užklausą duomenų bazėje $query = mysql_query( $sql) arba die( "") // Pažiūrėkite, kiek vartotojų turi šį prisijungimą, jei yra bent vienas, // grąžinkite klaidos pranešimą if(mysql_num_rows($query) > 0) ( $error = "); Vartotojas su nurodytu prisijungimu jau registruotas"; return $ error; ) // Jei tokio vartotojo nėra, užregistruokite // Parašykite užklausos eilutę $sql = "INSERT INTO `users` (`id`,`login` ,`password`) VERTĖS (NULL, "" . $prisijungimas . " ","" . $slaptažodis. "")"; // Padarykite užklausą duomenų bazėje $query = mysql_query($sql) arba die("

Nepavyko pridėti vartotojo: " . mysql_error() . ". Klaida įvyko eilutėje " . __LINE__ . "

"); // Nepamirškite atsijungti nuo DBVS mysql_close(); // Grąžinkite reikšmę true, nurodant sėkmingą vartotojo registraciją return true; )

Jei viskas gerai, jūsų vartotojas bus užregistruotas. Galite išbandyti formą. Pabandykite registruoti vartotojus su tais pačiais prisijungimo duomenimis. Po sėkmingos registracijos vartotojas bus nukreiptas į autorizacijos formą. Anksčiau mes tiesiog sukūrėme žymėjimą, kad būtų rodoma ši forma. Kadangi jo veiksmo atribute nėra nurodyto parametro, formos pateikti duomenys bus apdorojami tuo pačiu scenarijumi. Tai reiškia, kad turime parašyti apdorojimo kodą ir pridėti jį prie login.php dokumento.

Vartotojo įgaliojimas

;">

Jei nesate užsiregistravę sistemoje, registruokitės.



Tikriausiai pastebėjote, kad autorizacijos scenarijuje dabar turime dar vieną nepažįstamą funkciją – autorizacijos() . Ši funkcija turi įgalioti vartotoją pirmiausia patikrindama, ar duomenų bazėje yra registruotas vartotojas su tuo pačiu prisijungimo vardu ir slaptažodžiu. Jei toks vartotojas nerastas, autorizacija bus nutraukta ir bus rodomas pranešimas apie gedimą. Jei patikrinimas bus sėkmingas, funkcija autorizacijos () paleis sesiją ir į ją įrašys vartotojo prisijungimo ir slaptažodžio reikšmes, informuos scenarijų, kad autorizacija buvo sėkminga, o scenarijus nukreips vartotoją į apsaugoto šaltinio puslapį.

/** * Vartotojo autorizacijos funkcija.

* Vartotojo autorizacija bus vykdoma * naudojant PHP seansus.

*/ funkcijos autorizacija($login, $slaptažodis) ( // Inicijuoti kintamąjį su galimu klaidos pranešimu $error = ""; // Jei nėra prisijungimo eilutės, grąžinkite klaidos pranešimą if(!$login) ( $error = " Prisijungimas nenurodytas"; return $klaida ); // Turime patikrinti, ar toks vartotojas yra tarp registruotųjų // Sukurti užklausos eilutę $sql = "SELECT `id` FROM `users` WHERE `login`="".$login."" AND ` password`="".$password ."""; // Vykdykite užklausą $query = mysql_query($sql) arba die("

Nepavyko vykdyti užklausos: " . mysql_error() . ". Klaida įvyko eilutėje " . __LINE__ . "

Funkcija checkAuth($login, $password) ( // Jei nėra prisijungimo vardo ar slaptažodžio, grąžinkite false if(!$login || !$password) return false; // Patikrinkite, ar toks vartotojas yra registruotas // Prisijunkite prie DBMS connect(); // Sukurkite užklausos eilutę $sql = "SELECT `id` FROM `users` WHERE `login`="".$login."" AND `password`="".$slaptažodis.""" // Vykdykite užklausą $ query = mysql_query($sql) arba die("

* Vartotojo autorizacija bus vykdoma * naudojant PHP seansus.

"); // Jei nėra vartotojo su tokiais duomenimis, grąžinkite false; if(mysql_num_rows($query) == 0) ( return false; ) // Nepamirškite uždaryti ryšio su duomenų baze mysql_close(); // Priešingu atveju grąžinkite tikrąją grąžą true)

Dabar, kai vartotojas atvyko į apsaugotą puslapį, turime iškviesti funkciją, kad patikrintume autorizacijos duomenis. Iškvietimą ir patvirtinimo scenarijų įdėsime į atskirą checkAuth.php failą ir prijungsime prie tų puslapių, kurie bus uždaryti viešai.

/** * Vartotojo įgaliojimų tikrinimo scenarijus */ // Pradėti seansą, iš kurio išskirsime įgaliotų vartotojų prisijungimo vardą ir slaptažodį // session_start(); // Prijunkite failą su pasirinktinėmis funkcijomis request_once("functions.php"); /** * Norėdami nustatyti, ar vartotojas yra įgaliotas, turime * patikrinti, ar duomenų bazėje yra jo prisijungimo * ir slaptažodžio įrašų. Norėdami tai padaryti, naudosime pasirinktinę funkciją *, kad patikrintume prisijungusio vartotojo duomenų teisingumą.

* Jei ši funkcija grąžina false, leidimo nėra.

* Jei leidimo nėra, tiesiog nukreipiame * vartotoją į autorizacijos puslapį.

*/ // Jei sesijoje yra ir prisijungimo, ir slaptažodžio duomenų, // patikrinkite juos if(isset($_SESSION["prisijungti"]) && $_SESSION["prisijungti"] && isset($_SESSION["slaptažodis" ]) && $_SESSION["slaptažodis"]) ( // Jei nepavyksta patikrinti esamų duomenų if(!checkAuth($_SESSION["login"], $_SESSION["slaptažodis"])) ( // Peradresuoti vartotoją į prisijungimo puslapio antraštę( "location: login.php"); // Sustabdyti scenarijaus vykdymą exit ) ) // Jei nėra duomenų apie vartotojo prisijungimą ar slaptažodį, // darome prielaidą, kad nėra prieigos, nukreipiame vartotoją // į autorizaciją page else ( header("location: login.php"); // Sustabdyti scenarijaus išėjimo vykdymą;

Dabar sukurkime kodą mūsų saugiam puslapiui. Tai bus gana paprasta.



Kaip matote, į apsaugotą dokumentą įtraukiame tik vieną failą – checkAuth.php. Visi kiti failai yra sujungti kitais scenarijais. Todėl mūsų kodas neatrodo sudėtingas. Organizavome vartotojų registraciją ir autorizavimą. Dabar turite leisti vartotojams atsijungti. Norėdami tai padaryti, mes sukursime scenarijų logout.php faile.

/** * Vartotojo atsijungimo scenarijus. Kadangi vartotojai * prisijungia per seansus, jų prisijungimo vardas ir slaptažodis yra saugomi * $_SESSION superglobaliame masyve. Norėdami * atsijungti nuo sistemos, tiesiog sunaikinkite $_SESSION["login"] ir $_SESSION["password"] masyvo reikšmes*, po to mes * nukreipiame vartotoją į prisijungimo puslapį */ // Būkite būtinai pradėkite sesiją session_start(); unset($_SESSION["prisijungti"]); unset($_SESSION["slaptažodis"]); header("vieta: login.php");

Vartotojo registracijos, autorizacijos ir patvirtinimo scenarijus paruoštas. Galite naudoti sau, papildyti, keisti pagal savo poreikius. Jei turite klausimų, galite juos užduoti komentaruose. Galite atsisiųsti visus čia aptartus failus, supakuotus į vieną archyvą.

P.S. Žinau, kad geriau rašyti objektinį kodą, žinau, kad neapsimoka siųsti ir saugoti slaptažodžio aiškiu tekstu, kad į duomenų bazę įvestą informaciją reikia iš anksto patikrinti. zinau. Aš apie tai čia nekalbėsiu.

Daugelyje svetainių yra registracijos forma, kurią vartotojai gali užsiregistruoti, todėl gali pasinaudoti tam tikra privilegija svetainėje. Šiame straipsnyje pamatysime, kaip sukurti registracijos formą PHP ir MySQL.

Kurdami Sign-Up.html tinklalapį, naudosime paprastas žymas, taip pat naudosime lentelės žymą. Pradėkime:

Sąrašas 1: registracija.html

Prisiregistravimas

Registracijos forma
Vardas
El. paštas
Vartotojo vardas
Slaptažodis
Patvirtinkite slaptažodį



1 paveikslas:

Sing-in.html tinklalapio aprašymas:

Kaip matote 1 paveiksle, yra registracijos forma, kurioje prašoma nedaug duomenų apie vartotoją. Tai yra įprasti duomenys, kuriuos bet kuri svetainė prašo savo vartotojų ar lankytojų sukurti ir ID bei slaptažodį. Lentelės žymą naudojome, nes norėdami tinklalapio formos laukus rodyti sutvarkyta forma, kaip matote 1 paveiksle. Tai atrodo taip paprasta, nes dar nenaudojome joje CSS stiliaus, dabar naudokime CSS stilius ir susiesime CSS stiliaus failas su sing-up.html tinklalapiu.

2 sąrašas: style.css

/*CSS failas, skirtas prisiregistruoti tinklalapiui*/ #body-color( background-color:#6699CC; ) #Sign-Up( background-image:url("sign-up.png"); background-size:500px 500px ; šrifto svoris: paryškintas; šrifto dydis: 20 pikselių;

3 sąrašas: susiekite style.css su sign-up.html tinklalapiu



2 pav.

Failo style.css aprašymas:

Išoriniame CSS faile naudojome keletą stilių, kurie jums gali atrodyti nauji. Kaip fone naudojome vaizdą ir nustatėme jį tinklalapio centre. Kurį lengva naudoti naudojant html div žymą. Kaip naudojome tris div žymų ID. #button, #sing-up ir #body-color ir mes pritaikėme jiems visus CSS stilius ir dabar galite pamatyti 2 paveikslą, kaip jis atrodo gražiai ir patraukliai. Jame galite naudoti daugybę kitų CSS stilių, pavyzdžiui, 2D ir 3D CSS stilius. Jis atrodys gražiau nei atrodo dabar.

Atlikę visus šiuos paprastus darbus, dabar sukursime duomenų bazę ir lentelę, kurioje visi duomenys būtų saugomi naujų vartotojų duomenų bazėje. Prieš pradėdami kurti lentelę, turėtume žinoti, ko reikalaujame iš vartotojo. Kurdami formą mes sukursime lentelę pagal registracijos formą, kurią galite pamatyti 1 ir 2 pav.

3 sąrašas: MySQL lentelės užklausa

KURTI LENTELĘ Svetainės vartotojai (naudotojo ID int(9) NOT NULL auto_increment, pilnas vardas VARCHAR(50) NOT NULL, vartotojo vardas VARCHAR(40) NOT NULL, el. paštas VARCHAR(40) NOT NULL, perduoti VARCHAR(40) NOT NULL, KEY(us) PRIMARY );

3 sąrašo aprašymas:

Turėtumėte žinoti vieną dalyką: jei neturite MySQL galimybės naudoti šią užklausą, vadovaukitės mano ankstesniu straipsniu apie . iš šios nuorodos galėsite suprasti diegimą ir reikalavimus. Ir kaip mes galime tai panaudoti.

3 sąrašo užklausoje panaudojome visus tuos dalykus, kurių mums reikia registracijos formai. Kadangi yra el. pašto, viso vardo, slaptažodžio ir vartotojo vardo kintamieji. Šie kintamieji saugos vartotojo duomenis, kuriuos jis įves į registracijos formą 2 pav.

Atlikę visus šiuos darbus, dirbsime su PHP programavimu, kuri yra serverio pusės programavimo kalba. Štai kodėl reikia sukurti ryšį su duomenų baze.

Sąrašas 4: Duomenų bazės ryšys

4 sąrašo aprašymas:

Sukūrėme ryšį tarp duomenų bazės ir mūsų tinklalapių. Bet jei nežinote, ar jis veikia, ar ne, paskutiniame 5 patikrinimo sąraše naudokite dar vieną dalyką.

Sąrašas 5: tikrinamas duomenų bazės ryšio ryšys

5 aprašo sąrašas:

5 sąraše aš ką tik bandžiau parodyti, kad galite patikrinti ir patvirtinti ryšį tarp duomenų bazės ir PHP. Ir dar vienas dalykas, mes nenaudosime 5 sąrašo kodo savo prisijungimo svetainėje. Nes tai tik tam, kad suprastumėte, kaip galite patikrinti MySQL ryšį.

Dabar parašysime PHP programavimo programą, kad pirmiausia patikrintume, ar vartotojas yra prieinamas, o tada išsaugosime vartotoją, jei jis yra naujas tinklalapio vartotojas.

Sąrašas 6: connectivity-sign-up.php

Connectivity-sign-up.php aprašymas

Šioje PHP programoje naudojau paprasčiausią būdą tinklalapių registracijos programai sukurti. Kaip matote, pirmiausia sukuriame ryšį, pvz., 4 sąrašą. Ir tada panaudojome dvi funkcijas, pirmoji funkcija yra SignUP(), kurią iškviečia if sakinys iš paskutinės programos, kur ji pirmiausia patvirtina registracijos paspaudimą. mygtuką. Jei bus paspaustas, bus iškviesta SingUp funkcija ir ši funkcija naudos SELECT užklausą, kad gautų duomenis ir palygintų juos su vartotojo vardu ir el. pašto adresu, kurį šiuo metu įvedė vartotojas. Jei vartotojo vardas ir el. pašto adresas jau yra duomenų bazėje, tai atsiprašau, kad jau esate užsiregistravę

Jei vartotojas yra naujas, nes jo šiuo metu vartotojo vardo ir el. pašto ID nėra duomenų bazėje, If sakinys iškvies NewUser (), kur bus saugoma visa naujojo vartotojo informacija. Ir vartotojas taps tinklalapio dalimi.



3 pav

3 paveiksle vartotojas įveda duomenis, kad prisiregistruotų, jei pagal duomenų bazės įrašus vartotojas yra senas šio tinklalapio vartotojas. Taigi tinklalapyje bus rodomas pranešimas, kad vartotojas jau užsiregistravęs, jei vartotojas yra naujas, todėl tinklalapyje bus rodomas pranešimas, kad vartotojo registracija baigta.



4 pav.

Kadangi įvedėme duomenis į registracijos formą (4 pav.), pagal duomenų bazę, kurį vartotojo vardą ir el. pašto adresą įvedėme registracijos formoje, jis jau yra duomenų bazėje. Taigi, norėdami prisiregistruoti naudodami naują ID ir slaptažodį, turėtume išbandyti naują vartotojo vardą ir el. pašto adresą.



5 pav

5 paveiksle ji mums patvirtina, kurį vartotojo vardą ir el. pašto ID vartotojas įvedė. Abiejų duomenų bazės įrašuose nėra. Taigi dabar sukuriamas naujas ID ir slaptažodis, o vartotojas gali naudoti savo naują ID ir slaptažodį, kad kitą kartą galėtų prisijungti.

Išvada:

Šiame straipsnyje sužinojome, kaip paprasčiausiai sukurti registracijos tinklalapį. Taip pat sužinojome, kaip ji veikia su duomenų baze, jei naudojame PHP ir MySQL. Bandžiau suteikti jums pagrindinių žinių apie prisiregistravimo tinklalapio funkcijas. Kaip jis veikia galinėje dalyje ir kaip galime pakeisti jo išvaizdą priekinėje dalyje. Jei turite klausimų, nedvejokite ir komentuokite.

„Laravel“ reikalauja, kad „Composer“ valdytų projekto priklausomybes. Taigi prieš diegdami „Laravel“ įsitikinkite, kad jūsų sistemoje yra įdiegtas „Composer“. Jei apie Composer girdite pirmą kartą, tai php priklausomybės valdymo įrankis, panašus į node's npm.

Norėdami įdiegti Composer savo kompiuteryje, patikrinkite šį įrašą:

„Laravel“ diegimas sistemoje „Windows“:

Norėdami įdiegti „Laravel“ „Windows“ kompiuteryje, atlikite toliau nurodytus veiksmus. Nesvarbu, ar turite xampp / wamp stack, jis veikia abiem. WAMP sistemoje būtinai įdiekite laravel aplanke „www“ ir XAMPP, žinoma, „htdocs“.

1 ŽINGSNIS) Atidarykite XAMPP aplanką „htdocs“, laikykite nuspaudę klavišą SHIFT ir dešiniuoju pelės mygtuku spustelėkite aplanką ir pasirinkite „atidaryti komandų langą čia“. Arba galite atidaryti komandų langą ir pakeisti katalogą į "xampp/htdocs".

2 ŽINGSNIS) Įveskite šią komandą.

Kompozitorius kurti-projektas laravel/laravel my_laravel_site --prefer-dist

Čia „mano_laravel_svetainė“ yra aplanko, kuriame bus įdiegti laravel failai, pavadinimas. Pakeiskite tai pagal savo skonį.

3 ŽINGSNIS) Dabar laikas apsišarvuoti kantrybe, nes laravel diegimas užtruks.

4 ŽINGSNIS) Įdiegę komandų eilutėje pakeiskite katalogą į „my_laravel_site“ (cd „my_laravel_site“) ir įveskite toliau pateiktą komandą.

Php amatininkų aptarnavimas

5 ŽINGSNIS) Bus rodomas pranešimas, panašus į „Laravel plėtros serveris paleistas:“ kartu su URL.

6 ŽINGSNIS) Nukopijuokite ir įklijuokite URL naršyklėje. Jei viskas klostysis gerai, pamatysite laravel pasveikinimo ekraną.

7 ŽINGSNIS) Atlikta! Sėkmingai įdiegėte laravel „Windows“ kompiuteryje ir esate pasiruošę naudoti.

Programos rakto nustatymas:

Po įdiegimo Laravel reikia mažai konfigūracijos. Tam reikia nustatyti programos raktą. Tai atsitiktinė 32 simbolių ilgio eilutė, naudojama seansui ir kitiems jautriems duomenims užšifruoti. Paprastai tai bus nustatyta automatiškai, kai įdiegiate laravel naudodami kompozitorių arba laravel diegimo programą.

Jei jis nenustatytas, turite tai padaryti rankiniu būdu. Pirmiausia būtinai pervardykite failą „.env.example“ į „.env“ savo programos šaknyje. Tada atidarykite komandų eilutę ir pakeiskite į laravel projekto aplanką. Dabar paleiskite žemiau esančią komandą, kad sugeneruotumėte raktą.

Php amatininko raktas: generuoti

Nukopijuokite šį sugeneruotą raktą į APP_KEY kintamąjį „.env“ faile. Išsaugokite ir viskas.

Konkrečios „Laravel“ versijos diegimas:

Aukščiau pateiktas metodas privers kompozitorių atsisiųsti ir įdiegti naujausią „Laravel“ versiją. Jei savo kompiuteryje norite įdiegti ankstesnes laravel versijas, komandoje create-project būtinai įtraukite atitinkamą versijos numerį.

Kompozitorius kurti-projektas laravel/laravel=5.4 jūsų-projekto pavadinimas --prefer-dist Taip pat skaitykite:

Taip pat galite lengvai įdiegti laravel naudodami kompozitorių ant langų. Tikiuosi, kad ši pamoka jums bus naudinga. Pasidalinkite ja savo socialiniame rate, jei patiko.

Šiandien apžvelgsime kritinio 1 dienos pažeidžiamumo išnaudojimą populiarioje TVS Joomla, kuri internete sprogo spalio pabaigoje. Apie pažeidžiamumą kalbėsime su skaičiais CVE-2016-8869, CVE-2016-8870 Ir CVE-2016-9081. Visi trys yra iš vieno kodo, kuris penkerius ilgus metus gulėjo sistemos gilumoje ir laukė sparnuose, kad paskui išsilaisvintų ir atsineštų chaosą, įsilaužtas svetaines ir nekaltų šios Joomla vartotojų ašaras. Tik patys narsiausi ir drąsiausi kūrėjai, kurių akys paraudo nuo monitorių šviesos, o klaviatūros nusėtas duonos trupiniais, sugebėjo mesti iššūkį siautėjančioms piktosioms dvasioms ir padėti galvą ant pataisymų altoriaus.

ĮSPĖJIMAS

Visa informacija pateikiama tik informaciniais tikslais. Nei redaktoriai, nei autorius neatsako už bet kokią galimą žalą, padarytą dėl šio straipsnio medžiagos.

Kur viskas prasidėjo

2016 m. spalio 6 d. Demis Palma sukūrė temą „Stack Exchange“, kurioje paklausė: kodėl iš tikrųjų Joomla 3.6 versijoje yra du būdai registruoti vartotojus su tuo pačiu vardu register()? Pirmasis yra UsersControllerRegistration valdiklyje, o antrasis yra UsersControllerUser valdiklyje. Damis norėjo sužinoti, ar kažkur buvo naudojamas UsersControllerUser::register() metodas, ar tai tik evoliucinis anachronizmas, likęs iš senosios logikos. Jam rūpėjo tai, kad net jei šio metodo nenaudoja joks vaizdas, jį galima iškviesti naudojant sukurtą užklausą. Į kurį gavau atsakymą iš kūrėjo slapyvardžiu itoctopus, kuris patvirtino: problema tikrai egzistuoja. Ir išsiuntė ataskaitą Joomla kūrėjams.

Tada įvykiai vystėsi greičiausiai. Spalio 18 d. Joomla kūrėjai priėmė ataskaitą iš Damis, kuris iki to laiko buvo parengęs PoC, kuris leistų registruotis vartotoją. Savo svetainėje jis paskelbė pastabą, kurioje bendrai papasakojo apie rastą problemą ir savo mintis šiuo klausimu. Tą pačią dieną išleidžiama nauja Joomla 3.6.3 versija, kurioje vis dar yra pažeidžiamas kodas.

Po to Davide'as Tampellini išsuka klaidą taip, kad užregistruotų ne paprastą vartotoją, o administratorių. O spalio 21 d. Joomla apsaugos komandai atkeliauja naujas atvejis. Jau kalbama apie privilegijų didinimą. Tą pačią dieną Joomla svetainėje pasirodo pranešimas, kad antradienį, spalio 25 d., bus išleista kita versija 3.6.3 serijos numeriu, kuri ištaisys kritinį sistemos branduolio pažeidžiamumą.

Spalio 25 d. Joomla Security Strike Team randa naujausią problemą, kurią sukūrė Damiso aptikta kodo dalis. Tada spalio 21 d. įsipareigojimas nepastebimu pavadinimu „Prepare 3.6.4 Stable Release“ perkeliamas į pagrindinę oficialios „Joomla“ saugyklos šaką, kuri ištaiso apgailėtiną klaidą.

Po šio pasirodymo daugybė suinteresuotų asmenų prisijungia prie kūrėjų bendruomenės - jie pradeda reklamuoti pažeidžiamumą ir rengti išnaudojimus.

Spalio 27 d. mokslininkas Harry Robertsas įkelia paruoštą išnaudojimą į „Xiphos Research“ saugyklą, galinčią įkelti PHP failą į serverį su pažeidžiama TVS.

Detalės

Na, fonas baigėsi, pereikime prie įdomiausios dalies – pažeidžiamumo analizės. Joomla 3.6.3 įdiegiau kaip bandomąją versiją, todėl visi eilučių numeriai bus svarbūs šiai versijai. Ir visi keliai į failus, kuriuos pamatysite žemiau, bus nurodyti, palyginti su įdiegtos TVS šaknimis.

Damis Palmos atradimo dėka žinome, kad yra du būdai, kurie atlieka vartotojo registraciją sistemoje. Pirmąjį naudoja TVS ir jis yra faile /components/com_users/controllers/registration.php:108. Antrasis (kurį turėsime vadinti) yra /components/com_users/controllers/user.php:293. Pažvelkime į tai atidžiau.

286: /** 287: * Vartotojo registravimo būdas. 288: * 289: * @return loginis 290: * 291: * @nuo 1.6 292: */ 293: viešosios funkcijos registras() 294: ( 295: JSession::checkToken("post") arba jexit(JText::_ ("JINVALID_TOKEN")); ... 315: $return = $model->validate($form, $data) 318: if ($return === false) Užbaikite registraciją 346: $return = $modelis->register($duomenys);

Čia palikau tik įdomias eilutes. Visą pažeidžiamo metodo versiją galima peržiūrėti Joomla saugykloje.

Išsiaiškinkime, kas vyksta įprasto vartotojo registracijos metu: kokie duomenys siunčiami ir kaip jie apdorojami. Jei nustatymuose įjungta vartotojo registracija, formą galite rasti adresu http://joomla.local/index.php/component/users/?view=registration.


Teisėta vartotojo registracijos užklausa atrodo taip, kaip šioje ekrano kopijoje.


Komponentas com_users yra atsakingas už darbą su vartotojais. Atkreipkite dėmesį į užduoties parametrą užklausoje. Jis turi formatą $controller.$method . Pažvelkime į failo struktūrą.

Aplanke esančių scenarijų pavadinimai valdikliai atitinka iškviestų valdiklių pavadinimus. Kadangi mūsų užklausoje dabar yra $controller = "registration" , failas bus iškviestas registracija.php ir jo registras() metodas.

Dėmesio, klausimas: kaip perkelti registracijos apdorojimą į pažeidžiamą kodo vietą? Tikriausiai jau atspėjote. Pažeidžiamų ir realių metodų pavadinimai yra vienodi (registras), todėl tereikia pakeisti iškviesto valdiklio pavadinimą. Kur yra mūsų pažeidžiamas valdiklis? Teisingai, byloje user.php. Pasirodo $controller = "vartotojas" . Viską sudėjus gauname task = user.register . Dabar registracijos užklausa apdorojama tokiu būdu, kurio mums reikia.


Antras dalykas, kurį turime padaryti, yra siųsti duomenis tinkamu formatu. Čia viskas paprasta. Legitimate register() tikisi iš mūsų masyvo, vadinamo jform , kuriame perduodame registracijos duomenis – vardą, prisijungimo vardą, slaptažodį, el. paštą (žr. ekrano kopiją su užklausa).

  • /components/com_users/controllers/registration.php: 124: // Gaukite vartotojo duomenis.

125: $requestData = $this->input->post->get("jform", array(), "masyvas");

  • Mūsų klientas gauna šiuos duomenis iš masyvo, vadinamo vartotoju.

/components/com_users/controllers/user.php: 301: // Gaukite formos duomenis.

Trečias žingsnis yra rasti tinkamą CSRF prieigos raktą, nes be jo nebus registracija.

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

Tai atrodo kaip MD5 maiša, kurią galite paimti, pavyzdžiui, iš autorizacijos formos svetainėje /index.php/component/users/?view=login.


Dabar galite kurti vartotojus naudodami norimą metodą. Jei viskas pavyko, sveikiname – jūs tiesiog išnaudojote pažeidžiamumą CVE-2016-8870„Trūksta naujų vartotojų registravimo leidimo patikros“.

Taip atrodo UsersControllerRegistration valdiklio „darbo“ registro() metodas:

  • /components/com_users/controllers/registration.php: 113: // Jei registracija išjungta – nukreipkite į prisijungimo puslapį.

114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= prisijungimas", klaidinga)); 117: 118: grąžinti klaidingą; 119: )

  • Ir taip pažeidžiamuose:

/components/com_users/controllers/user.php:

Taip, jokiu būdu.

Kad suprastume antrąją, daug rimtesnę problemą, išsiųsime savo sukurtą užklausą ir pažiūrėkime, kaip ji vykdoma įvairiose kodo dalyse. Štai dalis, atsakinga už vartotojo pateiktų duomenų patvirtinimą darbuotojo metodu:

Tęsinys prieinamas tik nariams

1 variantas. Prisijunkite prie „svetainės“ bendruomenės ir perskaitykite visą svetainėje esančią medžiagą

Narystė bendruomenėje per nurodytą laikotarpį suteiks prieigą prie VISOS „Hacker“ medžiagos, padidins asmeninę kaupiamąją nuolaidą ir leis kaupti profesionalų „Xakep Score“ įvertinimą!

Registracijos sistemos kūrimo procesas yra gana daug darbo. Turite parašyti kodą, kuris dar kartą patikrina el. pašto adresų galiojimą, siunčia patvirtinimo el. laiškus, suteikia galimybę atkurti slaptažodžius, saugo slaptažodžius saugioje vietoje, patvirtina įvesties formas ir dar daugiau. Net ir visa tai darydami vartotojai bus nelinkę registruotis, nes net ir minimaliai registracija reikalauja jų aktyvumo.

Šiandienos pamokoje mes sukursime paprastą registracijos sistemą, kuriai nereikės jokių slaptažodžių! Rezultatai bus sistema, kurią bus galima lengvai modifikuoti arba integruoti į esamą PHP svetainę. Jei jus domina, skaitykite toliau.

Dabar esame pasirengę pradėti naudoti PHP kodą. Pagrindinį registracijos sistemos funkcionalumą teikia Vartotojo klasė, kurią galite pamatyti žemiau. Klasė naudoja (), kuri yra minimalistinė duomenų bazių biblioteka. Vartotojų klasė yra atsakinga už prieigą prie duomenų bazių, prisijungimo žetonų generavimą ir jų patvirtinimą. Tai suteikia mums paprastą sąsają, kurią galima lengvai įtraukti į jūsų PHP pagrįstų svetainių registracijos sistemą.

User.class.php

// Privatus ORM egzempliorius
privatus $orm;

/**
* Raskite vartotoją pagal prieigos rakto eilutę. Įtraukiami tik galiojantys žetonai
* svarstymas. Žetonas galioja 10 minučių po jo sukūrimo.
* @param string $token Žetonas, kurio reikia ieškoti
* @grįžtas vartotojas
*/

Vieša statinė funkcija findByToken($token)(

// suraskite jį duomenų bazėje ir įsitikinkite, kad laiko žyma yra teisinga


->kur("žetonas", $token)
->kur_raw("token_validity > NOW()")
->rasti_vieną();

Jei(!$rezultatas)(
return false;
}

Grąžinti naują vartotoją($result);
}

/**
* Arba prisijunkite arba užregistruokite vartotoją.
* @grįžtas vartotojas
*/

Vieša statinė funkcija loginOrRegister($email)(

// Jei toks vartotojas jau yra, grąžinkite jį

Jei(Vartotojas::egzistuoja($el. paštas))(
grąžinti naują vartotoją ($el. paštas);
}

// Priešingu atveju sukurkite ir grąžinkite

Grįžti vartotojas::kurti($el.paštas);
}

/**
* Sukurkite naują vartotoją ir išsaugokite jį duomenų bazėje
* @param string $email Vartotojo el. pašto adresas
* @grįžtas vartotojas
*/

Privati ​​statinė funkcija sukurti($email)(

// Parašykite naują vartotoją į duomenų bazę ir grąžinkite jį

$rezultatas = ORM::for_table("reg_users")->sukurti();
$rezultatas->el. paštas = $el. paštas;
$rezultatas->išsaugoti();

Grąžinti naują vartotoją($result);
}

/**
* Patikrinkite, ar toks vartotojas egzistuoja duomenų bazėje, ir grąžinkite loginę reikšmę.
* @param string $email Vartotojo el. pašto adresas
* @return loginis
*/

Vieša statinė funkcija egzistuoja($email)(

// Ar vartotojas egzistuoja duomenų bazėje?
$result = ORM::for_table("reg_users")
->kur("el. paštas", $el. paštas)
->skaičiuoti();

Grąžinti $rezultatas == 1;
}

/**
* Sukurkite naują vartotojo objektą
* @param $param ORM egzempliorius, ID, el
* @grįžtas vartotojas
*/

Viešoji funkcija __construct($param = null)(

If($param egzempliorius ORM)(

// Perduotas ORM egzempliorius
$this->orm = $param;
}
else if(yra_string($param))(

// Buvo perduotas el
$this->
->kur("el. paštas", $param)
->rasti_vieną();
}
kitaip (

If(yra_skaitinis($param))(
// Vartotojo ID buvo perduotas kaip parametras
$id = $param;
}
else if(isset($_SESSION["loginid"]))(

// Neperduotas joks vartotojo ID, pažiūrėkite į sesiją
$id = $_SESIJA["loginid"];
}

$this->orm = ORM::for_table("reg_users")
->kur("id", $id)
->rasti_vieną();
}

/**
* Sugeneruoja naują SHA1 prisijungimo raktą, įrašo jį į duomenų bazę ir grąžina.
* @grįžimo eilutė
*/

Viešoji funkcija generuotiToken())(
// sugeneruokite prieigos raktą prisijungusiam vartotojui. Išsaugokite jį duomenų bazėje.

$token = sha1($this->elmail.time().rand(0, 1000000));

// Išsaugokite žetoną duomenų bazėje,
// ir pažymėkite kaip galiojantį tik kitas 10 minučių

$this->orm->set("token", $token);
$this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")");
$this->orm->save();

Grąžinti $žetoną;
}

/**
*Prisijunkite prie šio vartotojo
* @return negalioja
*/

Viešosios funkcijos prisijungimas ()

// Pažymėkite vartotoją kaip prisijungusį
$_SESSION["loginid"] = $this->orm->id;

// Atnaujinkite last_login db lauką
$this->orm->set_expr("paskutinis_prisijungimas", "NOW()");
$this->orm->save();
}

/**
* Sunaikinti sesiją ir atsijungti nuo vartotojo.
* @return negalioja
*/

Atsijungti nuo viešosios funkcijos()
$_SESIJA = masyvas();
unset($_SESSION);
}

/**
* Patikrinkite, ar vartotojas yra prisijungęs.
* @return loginis
*/

Viešoji funkcija prisijungęs())(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Patikrinkite, ar vartotojas yra administratorius
* @return loginis
*/

Viešoji funkcija yra administratorius())(
return $this->rank() == "administratorius";
}

/**
* Raskite vartotojo tipą. Tai gali būti administratorius arba įprastas.
* @grįžimo eilutė
*/

Viešosios pareigos rangas())(
if($this->orm->rang == 1)(
grąžinti „administratorius“;
}

Grąžinti „įprastas“;
}

/**
* Magiškas būdas pasiekti privačius elementus
* $orm egzempliorius kaip vartotojo objekto savybės
* @param string $key Prieigos nuosavybės pavadinimas
* @return mišrus
*/

Viešoji funkcija __get($key)(
if(isset($this->orm->$key))(
grąžinti $this->orm->$key;
}

Grąžinti nulį;
}
}
Žetonai generuojami naudojant algoritmą ir saugomi duomenų bazėje. Mes naudojame MySQL, norėdami nustatyti stulpelį token_validity į 10 minučių. Tikrindami žetoną, mes sakome varikliui, kad mums reikia tokeno, laukas token_validity dar nepasibaigęs. Taip apribojame laiką, per kurį žetonas galios.

Atkreipkite dėmesį, kad mes naudojame magijos metodą __get() dokumento pabaigoje, kad pasiektume vartotojo objekto ypatybes. Tai leidžia mums pasiekti duomenis, kurie saugomi duomenų bazėje kaip ypatybės: $user->email, $user->token. Pavyzdžiui, pažiūrėkime, kaip galime naudoti šią klasę šiame kodo fragmente:


Kitas failas, kuriame saugomos reikiamos funkcijos, yra functions.php. Ten turime keletą pagalbinių funkcijų, kurios leidžia išlaikyti likusį kodą tvarkingesnį.

Funkcijos.php

Funkcija send_email($nuo, $kam, $subject, $message)(

// Pagalbinė funkcija el. laiškų siuntimui

$headers = "MIME versija: 1.0" . "\r\n";
$headers .= "Turinio tipas: tekstas/paprastas; charset=utf-8" . "\r\n";
$headers .= "Nuo: ".$nuo . "\r\n";

Grąžinti laišką ($kam, $tema, $pranešimas, $antraštės);
}

funkcija get_page_url())(

// Sužinokite PHP failo URL adresą

$url = "http".(tuščias($_SERVER["HTTPS"])?"":"s")."://".$_SERVER["SERVER_NAME"];

If(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")(
$url.= $_SERVER["REQUEST_URI"];
}
kitaip (
$url.= $_SERVER["PATH_INFO"];
}

Grąžinti $url;
}

function rate_limit($ip, $riba_valanda = 20, $riba_10_min = 10)(

// Bandymų prisijungti šiuo IP adresu skaičius per paskutinę valandą

$count_hour = ORM::for_table("reg_login_attempt")
->
->kur_raw("ts > SUBTIME(NOW(),"1:00")")
->skaičiuoti();

// Bandymų prisijungti šiuo IP adresu skaičius per pastarąsias 10 minučių

$count_10_min = ORM::for_table("reg_login_attempt")
->kur("ip", sprintf("%u", ip2long($ip)))
->kur_raw("ts > SUBTIME(NOW(),"0:10")")
->skaičiuoti();

If($count_hour > $limit_hour || $count_10_min > $rib_10_min)(
throw new Exception("Per daug bandymų prisijungti!");
}
}

function rate_limit_tick($ip, $elmail)(

// Sukurkite naują įrašą prisijungimo bandymo lentelėje

$login_attempt = ORM::for_table("reg_login_attempt")->sukurti();

$login_attempt->email = $el. paštas;
$login_attempt->ip = sprintf("%u", ip2long($ip));

$login_attempt->save();
}

funkcijos peradresavimas($url)(
header("Vieta: $url");
išeiti;
}
Funkcijos „rate_limit“ ir „rate_limit_tick“ leidžia apriboti autorizavimo bandymų skaičių tam tikrą laikotarpį. Autorizacijos bandymai įrašomi į reg_login_attempt duomenų bazę. Šios funkcijos suaktyvinamos, kai patvirtinama prisijungimo forma, kaip matote toliau pateiktame kodo fragmente.

Žemiau esantis kodas buvo paimtas iš index.php ir yra atsakingas už prisijungimo formos patvirtinimą. Jis grąžina JSON atsakymą, kurį skatina jQuery kodas, kurį matėme faile properties/js/script.js.

index.php

If(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))(

// Išvesti JSON antraštę

Header("Turinio tipas: programa/json");

// Ar el. pašto adresas galioja?

If(!isset($_POST["el. paštas"]) || !filter_var($_POST["el. paštas"], FILTER_VALIDATE_EMAIL))(
throw new Exception("Įveskite galiojantį el. pašto adresą.");
}

// Tai padarys išimtį, jei asmuo yra aukščiau
// leidžiami bandymų prisijungti apribojimai (daugiau žr. functions.php):
greičio_riba($_SERVERIS["NUOTOLINIS_ADDR"]);

// Įrašykite šį bandymą prisijungti
rate_limit_tick($_SERVER["NUOTOLINIS_ADDR"], $_POST["el. paštas"]);

// Siųsti pranešimą vartotojui

$pranešimas = "";
$el. paštas = $_POST["el. paštas"];
$subject = "Jūsų prisijungimo nuoroda";

Jei(!Vartotojas::egzistuoja($el. paštas))(
$subject = "Ačiū, kad užsiregistravote!";
$message = "Dėkojame, kad užsiregistravote mūsų svetainėje!\n\n";
}

// Bandymas prisijungti arba užregistruoti asmenį
$user = User::loginOrRegister($_POST["el. paštas"]);

$message.= "Galite prisijungti iš šio URL:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Nuooda automatiškai nustos galioti po 10 minučių.";

$rezultatas = siųsti_el.paštas($išEl.pašto, $_POST["el. paštas"], $tema, $pranešimas);

Jei(!$rezultatas)(
throw new Exception("Siuntant el. laišką įvyko klaida. Bandykite dar kartą.");
}

Die(json_encode(masyvas(
"message" => "Ačiū! Išsiuntėme nuorodą į jūsų gautuosius. Taip pat patikrinkite savo šlamšto aplanką."
)));
}
}
sugauti($e išimtis)(

Die(json_encode(masyvas(
"error">1,
"message" => $e->getMessage()
)));
}
Sėkmingai autorizavus arba užsiregistravus, aukščiau nurodytas kodas siunčia asmeniui el. laišką su autorizavimo nuoroda. Žetonas yra prieinamas kaip $_GET kintamasis "tkn" dėl sugeneruoto URL.

index.php

If(isset($_GET["tkn"]))(

// Ar tai galiojantis prisijungimo raktas?
$user = Vartotojas::findByToken($_GET["tkn"]);

// Taip! Prisijunkite prie vartotojo ir nukreipkite į apsaugotą puslapį.

$vartotojas->prisijungti();
redirect("protected.php");
}

// Neteisingas prieigos raktas. Peradresuokite atgal į prisijungimo formą.
redirect("index.php");
}
Vykdant $user->login() bus sukurti būtini seanso kintamieji, todėl vartotojas gali likti prisijungęs ir vėlesniais prisijungimais.

Atsijungimas nuo sistemos įgyvendinamas maždaug tokiu pačiu būdu:

Indeksas.php

If(isset($_GET["atsijungti"]))(

$vartotojas = naujas vartotojas();

If($user->loggedIn())(
$vartotojas->atsijungti();
}

Redirect ("index.php");
}
Kodo pabaigoje vartotoją vėl nukreipiame į index.php, todėl URL parametras ?logout=1 pašalinamas.

Mūsų index.php failą taip pat reikės apsaugoti – nenorime, kad jau prisijungę vartotojai matytų formą. Norėdami tai padaryti, naudojame $user->loggedIn() metodą:

Indeksas.php

$vartotojas = naujas vartotojas();

if($user->loggedIn())(
redirect("protected.php");
}
Galiausiai pažiūrėkime, kaip galite apsaugoti savo svetainės puslapį ir padaryti jį pasiekiamą tik gavus leidimą:

apsaugotas.php

// Norėdami apsaugoti bet kurį php puslapį savo svetainėje, įtraukite main.php
// ir sukurti naują vartotojo objektą. Tai taip paprasta!

request_once "includes/main.php";

$vartotojas = naujas vartotojas();

if(!$user->loggedIn())(
redirect("index.php");
}
Po šio patikrinimo galite būti tikri, kad vartotojas sėkmingai prisijungė. Taip pat turėsite prieigą prie duomenų, kurie saugomi duomenų bazėje kaip $user objekto ypatybės. Norėdami parodyti vartotojo el. pašto adresą ir jo reitingą, naudokite šį kodą:

Echo "Jūsų el. paštas: ".$user->email;
echo "Jūsų rangas: ".$user->rank();
Čia rank() yra metodas, nes duomenų bazės reitingo stulpelyje paprastai yra skaičiai (0 įprastiems vartotojams ir 1 administratoriams) ir mes turime juos visus konvertuoti į rangų pavadinimus, kurie įgyvendinami naudojant šį metodą. Norėdami paversti standartinį vartotoją administratoriumi, tiesiog redaguokite vartotojo įrašą phpmyadmin (arba bet kurioje kitoje duomenų bazės programoje). Kaip administratoriui, vartotojui nebus suteiktos jokios specialios galimybės. Jūs pats turite teisę pasirinkti, kokias teises suteikti administratoriams.

Pasiruošę!

Su tuo mūsų paprasta registracijos sistema yra paruošta! Galite naudoti jį esamoje PHP svetainėje arba modernizuoti, kad atitiktų jūsų poreikius.



Ar jums patiko straipsnis? Pasidalinkite su draugais!