Správna registrácia používateľov php. Vytvorenie jednoduchého systému registrácie používateľov v PHP a MySQL

Dnes sa pozrieme na využitie kritickej 1-dňovej zraniteľnosti v populárnom redakčnom systéme Joomla, ktorý explodoval na internete koncom októbra. Budeme hovoriť o zraniteľnostiach s číslami CVE-2016-8869, CVE-2016-8870 a CVE-2016-9081. Všetky tri pochádzajú z jedného kusu kódu, ktorý sa v hlbinách frameworku ukrýval dlhých päť rokov a čakal v krídlach, aby sa potom oslobodil a priniesol so sebou chaos, hacknuté stránky a slzy nevinných používateľov tejto Joomly. Len tí najudatnejší a najodvážnejší vývojári, ktorých oči sú červené od svetla monitorov a ktorých klávesnice sú posiate omrvinkami, dokázali vyzvať zúrivých zlých duchov a položiť hlavu na oltár opráv.

UPOZORNENIE Všetky informácie sú poskytované len na informačné účely. Redakcia ani autor nezodpovedajú za prípadné škody spôsobené materiálmi tohto článku. Kde to všetko začalo

6. októbra 2016 Demis Palma vytvoril tému na Stack Exchange, v ktorej sa pýtal: prečo vlastne v Joomla verzii 3.6 existujú dve metódy na registráciu používateľov s rovnakým menom register()? Prvý je v ovládači UsersControllerRegistration a druhý je v ovládači UsersControllerUser. Damis chcel vedieť, či bola niekde použitá metóda UsersControllerUser::register(), alebo či to bol len evolučný anachronizmus, ktorý zostal zo starej logiky. Jeho obavou bolo, že aj keď túto metódu nepoužíva žiadny pohľad, dá sa volať vytvoreným dotazom. Na čo som dostal odpoveď od vývojára pod prezývkou itoctopus, ktorý potvrdil: problém naozaj existuje. A poslal správu vývojárom Joomla.

Potom sa udalosti vyvíjali najrýchlejšie. 18. októbra vývojári Joomly prijali správu od Damisa, ktorý v tom čase vypracoval PoC, ktorý by umožňoval registráciu používateľov. Na svojej webovej stránke zverejnil poznámku, v ktorej hovoril všeobecne o probléme, ktorý našiel, a svojich názoroch na túto záležitosť. V ten istý deň je vydaná nová verzia Joomla 3.6.3, ktorá stále obsahuje zraniteľný kód.

Potom Davide Tampellini roztočí chybu do bodu, keď zaregistruje nie jednoduchého používateľa, ale správcu. A 21. októbra prichádza do bezpečnostného tímu Joomla nový prípad. Už hovorí o zvyšovaní privilégií. V ten istý deň sa na webovej stránke Joomla objavuje oznámenie, že v utorok 25. októbra bude vydaná ďalšia verzia so sériovým číslom 3.6.3, ktorá opravuje kritickú zraniteľnosť v jadre systému.

25. október Tím Joomla Security Strike našiel najnovší problém vytvorený kúskom kódu, ktorý objavil Damis. Potom sa do hlavnej vetvy oficiálneho úložiska Joomla natlačí commit s dátumom 21. októbra s nenápadným názvom Prepare 3.6.4 Stable Release, ktorý nešťastnú chybu opravuje.

Po tomto vydaní sa do komunity vývojárov pripojí množstvo zainteresovaných jednotlivcov – začnú propagovať zraniteľnosť a pripravovať exploity.

27. októbra výskumník Harry Roberts nahrá hotový exploit do úložiska Xiphos Research, ktorý dokáže nahrať súbor PHP na server so zraniteľným CMS.

Podrobnosti

Pozadie je u konca, prejdime k najzaujímavejšej časti – analýze zraniteľnosti. Nainštaloval som Joomla 3.6.3 ako testovaciu verziu, takže všetky čísla riadkov budú relevantné pre túto verziu. A všetky cesty k súborom, ktoré uvidíte nižšie, budú uvedené vzhľadom na koreňový adresár nainštalovaného CMS.

Vďaka objavu Damisa Palmu vieme, že existujú dve metódy, ktoré vykonávajú registráciu používateľov v systéme. Prvý z nich používa CMS a nachádza sa v súbore /components/com_users/controllers/registration.php:108. Druhý (ten, ktorý budeme musieť zavolať) žije v /components/com_users/controllers/user.php:293. Poďme sa na to pozrieť bližšie.

286: /** 287: * Spôsob registrácie používateľa. 288: * 289: * @return boolean 290: * 291: * @od 1.6 292: */ 293: register verejnej funkcie () 294: ( 295: JSession::checkToken("post") alebo jexit(JText::_ ("JINVALID_TOKEN") ... 300: // Získanie údajov formulára 301: $data = $this->input->post->get("user", array(), "array" . 315: $return = $model->validate($form, $data: // Kontrola chýb 318: if ($return === false) 319: ( ... 345: / /); Dokončite registráciu 346: $return = $model->register($data);

Tu som nechal len zaujímavé riadky. Plnú verziu zraniteľnej metódy si môžete pozrieť v úložisku Joomla.

Poďme zistiť, čo sa stane počas bežnej registrácie používateľa: aké údaje sa odosielajú a ako sa spracúvajú. Ak je v nastaveniach povolená registrácia používateľa, formulár nájdete na http://joomla.local/index.php/component/users/?view=registration.


Legitímna žiadosť o registráciu používateľa vyzerá ako nasledujúca snímka obrazovky.


Komponent com_users je zodpovedný za prácu s používateľmi. Venujte pozornosť parametru úlohy v požiadavke. Má formát $controller.$method . Pozrime sa na štruktúru súborov.

Názvy skriptov v priečinku controllers zodpovedajú menám volaných ovládačov. Keďže naša požiadavka má teraz $controller = "registrácia" , zavolá sa súbor registration.php a jeho metóda register().

Pozor, otázka: ako preniesť spracovanie registrácie na zraniteľné miesto v kóde? Pravdepodobne ste to už uhádli. Názvy zraniteľných a skutočných metód sú rovnaké (register), takže stačí zmeniť názov volaného kontroléra. Kde sa nachádza náš zraniteľný kontrolór? Presne tak, v súbore user.php. Ukázalo sa, že $controller = "user" . Keď všetko dáme dokopy, dostaneme task = user.register . Teraz je žiadosť o registráciu spracovaná metódou, ktorú potrebujeme.


Druhá vec, ktorú musíme urobiť, je odoslať údaje v správnom formáte. Všetko je tu jednoduché. Legitimný register() od nás očakáva pole s názvom jform , do ktorého odovzdávame registračné údaje - meno, prihlasovacie meno, heslo, email (pozri snímku obrazovky so žiadosťou).

  • /components/com_users/controllers/registration.php: 124: // Získanie používateľských údajov. 125: $requestData = $this->input->post->get("jform", array(), "pole");

Náš klient získava tieto údaje z poľa s názvom user.

  • /components/com_users/controllers/user.php: 301: // Získanie údajov formulára. 302: $data = $this->input->post->get("user", array(), "pole");

Preto meníme názvy všetkých parametrov v požiadavke z jfrom na user .

Naším tretím krokom je nájsť platný CSRF token, pretože bez neho nebude registrácia.

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

Vyzerá to ako MD5 hash a môžete si ho vziať napríklad z autorizačného formulára na stránke /index.php/component/users/?view=login.


Teraz môžete vytvárať používateľov pomocou požadovanej metódy. Ak všetko fungovalo, gratulujeme – práve ste využili chybu zabezpečenia CVE-2016-8870 „kontrola chýbajúcich povolení na registráciu nových používateľov“.

Takto to vyzerá v „pracovnej“ metóde register() z radiča UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Ak je registrácia zakázaná - Presmerujte na prihlasovaciu stránku. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=) login", false)); 117: 118: return false; 119: )

A tak v zraniteľnom:

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

Áno, v žiadnom prípade.

Aby sme pochopili druhý, oveľa vážnejší problém, pošlime požiadavku, ktorú sme vytvorili, a pozrime sa, ako sa vykonáva v rôznych častiach kódu. Tu je časť, ktorá je zodpovedná za overenie údajov odoslaných používateľom v pracovnej metóde:

Pokračovanie je dostupné len pre členov Možnosť 1. Pripojte sa ku komunite „stránky“ a prečítajte si všetky materiály na stránke

Členstvo v komunite v určenom období vám umožní prístup ku VŠETKÝM materiálom Hackerov, zvýši vašu osobnú kumulatívnu zľavu a umožní vám nazbierať profesionálne hodnotenie Xakep Score!

Väčšina webových stránok má registračný formulár, aby sa vaši používatelia mohli zaregistrovať, a preto môžu mať na stránke výhody. V tomto článku uvidíme, ako vytvoriť registračný formulár v PHP a MySQL.

Použijeme jednoduché tagy a tiež tabuľkový tag použijeme na návrh webovej stránky Sign-Up.html. Začnime:

Výpis 1: sign-up.html

Registračný formulár

názov
Email
Používateľské meno
heslo
Potvrďte heslo


Postava 1:

Popis webovej stránky sing-in.html:

Ako vidíte na obrázku 1, existuje registračný formulár a vyžaduje len málo údajov o používateľovi. Toto sú bežné údaje, ktoré vyžaduje akákoľvek webová stránka od jej používateľov alebo návštevníkov na vytvorenie a ID a heslo. Použili sme značku tabuľky, pretože na zobrazenie polí formulára na webovej stránke v usporiadanej forme, ako ich môžete vidieť na obrázku 1. Vyzerá to tak jednoducho, pretože sme na nej ešte nepoužili štýl CSS, teraz použijeme štýly CSS a prepojíme Súbor v štýle CSS s webovou stránkou sing-up.html.

Výpis 2: style.css

/*Súbor CSS pre webovú stránku registrácie*/ #body-color( background-color:#6699CC; ) #Sign-Up( background-image:url("sign-up.png"); background-size:500px 500px ;pozadie-opakovanie:bez-opakovanie:stred:150px; okraj-doľava:450px; šírka:100px; pozadie:#FF00FF; font-weight:bold; font-size:20px;

Výpis 3 : Prepojte style.css s webovou stránkou sign-up.html



Obrázok 2:

Popis súboru style.css:

V externom súbore CSS sme použili niekoľko štýlov, ktoré by mohli byť pre vás nové. Keďže sme použili obrázok na pozadí a umiestnili ho do stredu webovej stránky. Čo sa ľahko používa pomocou značky html div. Ako sme použili tri div tag id. #button, #sing-up a #body-color a použili sme na ne všetky štýly CSS a teraz môžete vidieť na obrázku 2, ako krásne a atraktívne to vyzerá. Môžete na ňom použiť mnoho ďalších CSS štýlov, napríklad 2D a 3D CSS štýly. Bude to vyzerať krajšie ako teraz.

Po týchto všetkých jednoduchých prácach teraz vytvoríme databázu a tabuľku na uloženie všetkých údajov do databázy nových používateľov. Pred vytvorením tabuľky by sme mali vedieť, čo od používateľa požadujeme. Ako sme navrhli formulár, vytvoríme tabuľku podľa registračného formulára, ktorý môžete vidieť na obrázku 1 a 2.

Výpis 3: Dopyt na tabuľku v MySQL

CREATE TABLE WebsiteUsers (userID int(9) NOT NULL auto_increment, celé meno VARCHAR(50) NOT NULL, username VARCHAR(40) NOT NULL, email VARCHAR(40) NOT NULL, pass VARCHAR(40) NOT NULL, PRIMARY KEY(userID) );

Popis ponuky 3:

Jedna vec, ktorú by ste mali vedieť, že ak nemáte zariadenie MySQL na použitie tohto dotazu, mali by ste postupovať podľa môjho predchádzajúceho článku o . z tohto odkazu budete môcť pochopiť inštaláciu a požiadavky. A ako to môžeme využiť.

V dotaze na výpis 3 sme použili všetky veci, ktoré potrebujeme pre registračný formulár. Keďže existujú premenné Email, Celé meno, Heslo a Používateľské meno. Tieto premenné budú uchovávať údaje užívateľa, ktoré zadá do registračného formulára na obrázku 2 pre prihlásenie.

Po týchto všetkých prácach budeme pracovať s programovaním PHP, čo je programovací jazyk na strane servera. Preto je potrebné vytvoriť spojenie s databázou.

Výpis 4: Pripojenie k databáze

Popis ponuky 4:

Vytvorili sme prepojenie medzi databázou a našimi webovými stránkami. Ak však neviete, či to funguje alebo nie, použite na to ešte jednu vec v poslednom kontrolnom zozname 5.

Výpis 5: kontrola pripojenia databázovej konektivity

Popis 5:

Vo Výpise 5 som sa vám len pokúsil ukázať, že môžete skontrolovať a potvrdiť spojenie medzi databázou a PHP. A ešte jedna vec, nebudeme používať kód výpisu 5 na našej webovej stránke. Pretože je to len preto, aby ste pochopili, ako môžete skontrolovať pripojenie MySQL.

Teraz napíšeme PHP programovaciu aplikáciu, ktorá najprv skontroluje dostupnosť používateľa a potom používateľa uloží, ak je nový používateľ na webovej stránke.

Výpis 6: connectivity-sign-up.php

Popis konektivity-sign-up.php

V tejto PHP aplikácii som použil najjednoduchší spôsob vytvorenia prihlasovacej aplikácie pre webové stránky. Ako môžete vidieť, najprv vytvoríme spojenie ako výpis 4. A potom sme použili dve funkcie, prvá funkcia je SignUP(), ktorá je volaná príkazom if z poslednej aplikácie, kde jej prvé potvrdenie stlačenia sign up tlačidlo. Ak ho stlačíte, vyvolá funkciu SingUp a táto funkcia použije dotaz SELECT na načítanie údajov a ich porovnanie s užívateľským menom a emailom, ktorý je aktuálne zadaný od užívateľa. Ak sa už používateľské meno a e-mail nachádza v databáze, zobrazí sa správa Prepáčte, už ste zaregistrovaný

Ak je používateľ nový, pretože jeho aktuálne používateľské meno a e-mailové ID nie je prítomné v databáze, príkaz If zavolá NewUser(), kde uloží všetky informácie o novom používateľovi. A používateľ sa stane súčasťou webovej stránky.



Obrázok 3

Na obrázku 3 používateľ zadáva údaje na prihlásenie, ak je používateľ podľa záznamov databázy starým používateľom tejto webovej stránky. Takže webová stránka zobrazí správu, že používateľ je už zaregistrovaný, ak je používateľ nový, takže webová stránka zobrazí správu, že registrácia používateľa je dokončená.



Obrázok 4:

Keďže sme zadávali údaje do registračného formulára (obrázok 4), podľa databázy, aké užívateľské meno a email sme zadali do registračného formulára na prihlásenie sa už v databáze nachádza. Mali by sme teda vyskúšať nové používateľské meno a e-mailovú adresu na registráciu s novým ID a heslom.



Obrázok 5

Na obrázku 5 nám potvrdzuje, ktoré užívateľské meno a e-mailové ID zadal užívateľ. Obe nie sú prítomné v záznamoch databázy. Takže teraz je vytvorené nové ID a heslo a používateľ môže použiť svoje nové ID a heslo na prihlásenie nabudúce.

Záver:

V tomto článku sme sa naučili najjednoduchší spôsob vytvorenia webovej stránky na registráciu. Dozvedeli sme sa tiež, ako to funguje s databázou, ak používame PHP a MySQL. Pokúsil som sa vám poskytnúť základné vedomosti o funkcii registrácie webovej stránky. Ako to funguje na zadnej strane a ako môžeme zmeniť jej vzhľad na prednej strane. V prípade akýchkoľvek otázok neváhajte a komentujte.

Naposledy upravené 5. apríla 2018 používateľom Vincy.

Prihlásenie a registrácia užívateľa je základnou požiadavkou pre akúkoľvek CMS aplikáciu. Toto je počiatočná práca pri spustení projektu. Aplikácia s overením prihlásenia používateľa poskytuje bezpečnosť tým, že zabraňuje anonymnému prístupu. Existujú rôzne spôsoby, ako povoliť autentifikáciu v našej aplikácii, napríklad povolením prihlásenia OAuth alebo implementáciou jednotného prihlásenia (SSO) a podobnými inými spôsobmi. V predchádzajúcom tutoriále sme videli, ako implementovať a tiež o.

Tento príklad zahŕňa prihlasovacie aj registračné funkcie. Na uloženie registrovaných členov som použil databázu MySQL. Registrácia používateľa bude obsahovať vstup na získanie podrobností od používateľa. Po odoslaní tohto formulára sú údaje formulára odoslané do PHP a uložené v databáze. Používateľské heslo bude pred uložením do databázy zašifrované. pred odoslaním do kódu PHP. Keď je používateľ prihlásený s platnými prihlasovacími údajmi, bude používateľovi a jemu umožnené pokračovať ďalej.

Registračný formulár používateľa

Tento kód slúži na zobrazenie registračného formulára používateľovi. Keď používateľ odošle formulár so svojimi údajmi, zavolá sa funkcia JavaScript na overenie používateľského vstupu. Po úspešnom overení kód PHP načíta údaje zaslaného formulára, aby vykonal vloženie databázy.

Na mnohých stránkach, ktoré si každý deň prehliadame na internete, majú takmer všetky registráciu používateľa. V tejto lekcii si prejdeme základy správy používateľov a skončíme jednoduchou členskou oblasťou, ktorú môžete implementovať na svojej vlastnej webovej lokalite.

Táto lekcia je určená pre začiatočníkov v učení PHP, kde sa pozrieme na základy správy používateľov.

Krok 1

V databáze si vytvoríme tabuľku užívateľov, do ktorej budeme do polí tabuľky 4 ukladať informácie o užívateľoch

  • ID používateľa
  • Používateľské meno
  • heslo
  • Emailová adresa

Na vytvorenie databázy použite SQL dotaz nižšie

CREATE TABLE `users` (‚`UserID` INT(25 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `Username` VARCHAR(65 ) NOT NULL , `Heslo` VARCHAR(32 ) NOT NULL, `E-mailová adresa` VARCHAR(25) NOT );

Tento súbor je zodpovedný za pripojenie k databáze a bude zobrazený na všetkých stránkach. Pozrime sa na riadky kódu podrobnejšie

session_start();

Táto funkcia spustí reláciu pre nového používateľa, následne do nej uložíme údaje o priebehu relácie, aby sme mohli rozpoznať už identifikovaných používateľov

mysql_connect($dbhost, $dbuser, $dbpass) or die("Chyba MySQL: " . mysql_error());

mysql_select_db($dbname) or die("Chyba MySQL: " . mysql_error());

Každá z týchto funkcií vykonáva samostatné, ale súvisiace úlohy.

Funkcia mysql_connect sa pripája k databázovému serveru MySQL, parametre v zátvorkách sú premenné, ktorým sú priradené príslušné hodnoty Host, Používateľské meno, Heslo, ak sú údaje nesprávne, zobrazí sa chybové hlásenie;

Funkcia mysql_select_db vyberie databázu, ktorej meno sme priradili premennej $dbname, ak databázu nenájde, zobrazí chybové hlásenie

Krok 2 Vytvorte súbor index.php

Veľmi dôležitým prvkom na našej stránke je prvý riadok PHP; tento riadok bude obsahovať súbor, ktorý sme vytvorili vyššie (base.php) a v podstate nám umožní prístup k čomukoľvek z tohto súboru v našom aktuálnom súbore. Urobíme to s nasledujúcim riadkom kódu PHP. Vytvorte súbor s názvom index.php a umiestnite tento kód na začiatok.

Vytvorte nový súbor index.php a vložte nasledujúci kód na úplný začiatok

Tento riadok spojí súbor, ktorý sme vytvorili vyššie (base.php), čo nám umožní prístup ku kódu tohto súboru v našom aktuálnom súbore.

Robí to funkcia include().

Teraz vytvoríme externé rozhranie, kde používateľ zadá svoje údaje na registráciu a ak už je zaregistrovaný, dáme možnosť údaje zmeniť. Keďže tento tutoriál je zameraný na PHP, nebudeme sa zaoberať HTML/CSS kódom, vzhľad urobíme neskôr, keď si vytvoríme náš CSS štýlový list, ale zatiaľ jednoducho vložíme tento kód za predchádzajúci riadok.

Systém správy používateľov Sem vložte kód php

Teraz, skôr ako sa dostaneme do programu PHP, pozrime sa na princíp jeho fungovania, ktorý by sa mal v danej situácii zobraziť na obrazovke:

  • Ak je používateľ už prihlásený, zobrazí sa stránka s rôznymi možnosťami, ktoré boli pred registráciou skryté.
  • Ak sa používateľ ešte neprihlásil, ale zaregistroval sa, zobrazí sa formulár na zadanie prihlasovacieho mena a hesla.
  • Ak nie sú dokončené kroky 1 a 2, zobrazíme registračný formulár.
  • Bude to vyzerať takto:



    Súvisiace publikácie