Ispravna registracija korisnika php. Izrada jednostavnog sustava registracije korisnika u PHP-u i MySQL-u

Danas ćemo pogledati iskorištavanje kritične jednodnevne ranjivosti u popularnom CMS Joomla, koja je eksplodirala na Internetu krajem listopada. Govorit ćemo o ranjivostima s brojevima CVE-2016-8869, CVE-2016-8870 i CVE-2016-9081. Sva tri dolaze iz jednog dijela koda koji je čamio u dubini okvira dugih pet godina, čekajući da se završi, da bi se onda oslobodio i sa sobom donio kaos, hakirana mjesta i suze nevinih korisnika ove Joomle. Samo najhrabriji i najhrabriji programeri, čije su oči crvene od svjetla monitora, a čije su tipkovnice pune mrvica kruha, uspjeli su izazvati bijesne zle duhove i položiti svoje glave na oltar popravaka.

UPOZORENJE Sve informacije služe samo u informativne svrhe. Ni urednici ni autor nisu odgovorni za bilo kakvu moguću štetu prouzročenu materijalima ovog članka. Gdje je sve počelo

Demis Palma je 6. listopada 2016. napravio temu na Stack Exchangeu u kojoj je pitao: zašto, zapravo, u Joomla verziji 3.6 postoje dvije metode za registraciju korisnika s istim imenom register()? Prvi je u kontroleru UsersControllerRegistration, a drugi je u kontroleru UsersControllerUser. Damis je htio znati je li metoda UsersControllerUser::register() negdje korištena ili je to samo evolucijski anakronizam zaostao iz stare logike. Brinuo ga je da čak i ako ovu metodu ne koristi niti jedan prikaz, ona se može pozvati izrađenim upitom. Na što sam dobio odgovor od programera pod nadimkom itoctopus, koji je potvrdio: problem stvarno postoji. I poslao izvješće programerima Joomle.

Tada su se događaji najbrže razvijali. Dana 18. listopada Joomla programeri prihvatili su izvješće Damisa, koji je do tada izradio PoC koji bi omogućio registraciju korisnika. Objavio je bilješku na svojoj web stranici, gdje je općenito govorio o problemu koji je zatekao i svojim razmišljanjima o tome. Istog dana izlazi nova verzija Joomle 3.6.3, koja još uvijek sadrži ranjivi kod.

Nakon toga, Davide Tampellini vrti bug do te mjere da registrira ne jednostavnog korisnika, već administratora. A 21. listopada novi slučaj stiže Joomla sigurnosnom timu. Tu se već govori o povećanju privilegija. Istog dana na web stranici Joomla pojavljuje se obavijest da će u utorak, 25. listopada, biti objavljena sljedeća verzija sa serijskim brojem 3.6.3, koja ispravlja kritičnu ranjivost u jezgri sustava.

25. listopada Joomla Security Strike Team pronalazi najnoviji problem koji je stvorio dio koda koji je otkrio Damis. Zatim se obveza s datumom 21. listopada s neupadljivim nazivom Prepare 3.6.4 Stable Release gura u glavnu granu službenog repozitorija Joomla, čime se popravlja nesretna pogreška.

Nakon ovog izlaska, brojni zainteresirani pojedinci pridružuju se zajednici programera - počinju promovirati ranjivost i pripremati exploite.

Dana 27. listopada, istraživač Harry Roberts postavlja gotovu eksploataciju u repozitorij Xiphos Research koja može učitati PHP datoteku na poslužitelj s ranjivim CMS-om.

pojedinosti

Pa, pozadina je gotova, idemo na najzanimljiviji dio - analizu ranjivosti. Instalirao sam Joomlu 3.6.3 kao testnu verziju, tako da će svi brojevi redaka biti relevantni za ovu verziju. I svi putovi do datoteka koje ćete vidjeti ispod bit će naznačeni u odnosu na korijen instaliranog CMS-a.

Zahvaljujući otkriću Damis Palme, znamo da postoje dvije metode kojima se vrši registracija korisnika u sustavu. Prvi koristi CMS i nalazi se u datoteci /components/com_users/controllers/registration.php:108. Drugi (onaj koji ćemo morati pozvati) živi u /components/com_users/controllers/user.php:293. Pogledajmo ga pobliže.

286: /** 287: * Metoda registracije korisnika. 288: * 289: * @return boolean 290: * 291: * @od 1.6 292: */ 293: public function register() 294: ( 295: JSession::checkToken("post") ili jexit(JText::_ ("JINVALID_TOKEN")); . 315: $return = $model->validate($form, $data); Završite registraciju 346: $return = $model->register($data);

Ovdje sam ostavio samo zanimljive retke. Puna verzija ranjive metode može se vidjeti u repozitoriju Joomla.

Razmotrimo što se događa tijekom normalne registracije korisnika: koji se podaci šalju i kako se obrađuju. Ako je registracija korisnika omogućena u postavkama, obrazac se može pronaći na http://joomla.local/index.php/component/users/?view=registration.


Zahtjev za legitimnu registraciju korisnika izgleda kao na sljedećoj snimci zaslona.


Za rad s korisnicima odgovorna je komponenta com_users. Obratite pozornost na parametar zadatka u zahtjevu. Ima format $controller.$method. Pogledajmo strukturu datoteke.

Nazivi skripti u mapi kontrolera odgovaraju nazivima pozvanih kontrolera. Budući da naš zahtjev sada ima $controller = "registration" , bit će pozvana datoteka registration.php i njezina metoda register().

Pažnja, pitanje: kako prenijeti obradu registracije na ranjivo mjesto u kodu? Vjerojatno ste već pogodili. Imena ranjive i prave metode su ista (registar), tako da samo trebamo promijeniti ime pozvanog kontrolera. Gdje se nalazi naš ranjivi kontroler? Tako je, u datoteci user.php. Ispada $controller = "user" . Spajajući sve zajedno dobivamo task = user.register . Sada se zahtjev za registraciju obrađuje metodom koja nam je potrebna.


Druga stvar koju trebamo učiniti je poslati podatke u ispravnom formatu. Ovdje je sve jednostavno. Legitimni register() očekuje od nas niz pod nazivom jform, u koji prosljeđujemo registracijske podatke - ime, prijavu, lozinku, e-poštu (pogledajte snimak zaslona sa zahtjevom).

  • /components/com_users/controllers/registration.php: 124: // Dobivanje korisničkih podataka. 125: $requestData = $this->input->post->get("jform", array(), "array");

Naš klijent dobiva ove podatke iz niza koji se zove korisnik.

  • /components/com_users/controllers/user.php: 301: // Dobivanje podataka obrasca. 302: $data = $this->input->post->get("user", array(), "array");

Stoga mijenjamo nazive svih parametara u zahtjevu iz jfrom u user.

Naš treći korak je pronaći važeći CSRF token, jer bez njega neće biti registracije.

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

Izgleda kao MD5 hash, a možete ga uzeti, na primjer, iz obrasca za autorizaciju na stranici /index.php/component/users/?view=login .


Sada možete kreirati korisnike željenom metodom. Ako je sve funkcioniralo, onda čestitamo - upravo ste iskoristili ranjivost CVE-2016-8870 "nedostaje provjera dopuštenja za registraciju novih korisnika".

Ovako to izgleda u "radnoj" metodi register() iz kontrolera UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Ako je registracija onemogućena - Preusmjerava na stranicu za prijavu. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=) prijava", lažno)); 117: 118: vrati lažno; 119: )

I tako u ranjivim:

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

Da, nema šanse.

Da bismo razumjeli drugi, puno ozbiljniji problem, pošaljimo zahtjev koji smo izradili i vidimo kako se izvršava u različitim dijelovima koda. Ovdje je dio koji je odgovoran za provjeru valjanosti podataka koje je korisnik poslao u metodi radnika:

Nastavak je dostupan samo članovima Opcija 1. Pridružite se zajednici “site” kako biste pročitali sve materijale na stranici

Članstvo u zajednici unutar navedenog razdoblja omogućit će vam pristup SVIM hakerskim materijalima, povećati vaš osobni kumulativni popust i omogućiti vam da skupite profesionalnu ocjenu Xakep Score!

Velik dio web stranica ima obrazac za registraciju na koji se vaši korisnici mogu prijaviti i stoga mogu imati koristi od neke vrste privilegija unutar stranice. U ovom ćemo članku vidjeti kako izraditi obrazac za registraciju u PHP-u i MySQL-u.

Koristit ćemo jednostavne oznake i također ćemo koristiti oznaku tablice za dizajn web stranice Sign-Up.html. Počnimo:

Ispis 1: sign-up.html

Registracijski obrazac za prijavu

Ime
E-mail
Korisničko ime
Lozinka
Potvrdi lozinku


Slika 1:

Opis web stranice sing-in.html:

Kao što možete vidjeti na slici 1, postoji obrazac za registraciju i traži nekoliko podataka o korisniku. Ovo su uobičajeni podaci koje bilo koje web mjesto traži od svojih korisnika ili posjetitelja da kreiraju ID i lozinku. Upotrijebili smo oznaku tablice jer da bismo prikazali polja obrasca na web stranici u uređenom obliku kao što ih možete vidjeti na slici 1. Izgleda tako jednostavno jer još nismo upotrijebili CSS stil na njemu, sada ćemo upotrijebiti CSS stilove i povezati Datoteka CSS stila s web stranicom sing-up.html.

Ispis 2: style.css

/*CSS datoteka za web stranicu za prijavu*/ #body-color( background-color:#6699CC; ) #Sign-Up( background-image:url("sign-up.png"); background-size:500px 500px ; background-repeat: center; margin-left: 450px; #button( border-radius:100px; height:40px; background:#FF00FF; font-weight:bold;font-size:20px;

Ispis 3: Povežite style.css s web stranicom sign-up.html



Slika 2:

Opis datoteke style.css:

U vanjskoj CSS datoteci koristili smo neke stilove koji bi vam mogli izgledati novo. Kao što smo koristili sliku u pozadini i postavili je u središte web stranice. Koji je postao jednostavan za korištenje uz pomoć html div oznake. Kao što smo koristili tri ID oznake div. #button, #sing-up i #body-color i na njih smo primijenili sve CSS stilove i sada možete vidjeti sliku 2, koliko izgleda lijepo i privlačno. Na njemu možete koristiti mnoge druge CSS stilove poput 2D i 3D CSS stilova. Izgledat će ljepše nego što sada izgleda.

Nakon svih ovih jednostavnih radova sada ćemo napraviti bazu podataka i tablicu za pohranjivanje svih podataka u bazu novih korisnika. Prije nego krenemo stvarati tablicu, trebali bismo znati što tražimo od korisnika. Kako smo dizajnirali formu, kreirat ćemo tablicu prema obrascu za registraciju koju možete vidjeti na slici 1 i 2.

Ispis 3: Upit za tablicu u MySQL-u

CREATE TABLE WebsiteUsers (userID int(9) NOT NULL auto_increment, puno ime VARCHAR(50) NOT NULL, korisničko ime VARCHAR(40) NOT NULL, e-pošta VARCHAR(40) NOT NULL, proslijedi VARCHAR(40) NOT NULL, PRIMARY KEY(userID) );

Opis popisa 3:

Trebate znati jednu stvar: ako nemate mogućnost MySQL za korištenje ovog upita, trebali biste slijediti moj prethodni članak o . s ove veze moći ćete razumjeti instalaciju i zahtjeve. I kako to možemo iskoristiti.

U upitu listing 3 koristili smo sve ono što nam je potrebno za obrazac za registraciju. Kao što postoje varijable e-pošte, punog imena, lozinke i korisničkog imena. Ove varijable će pohraniti podatke o korisniku koje će on/ona unijeti u obrazac za registraciju na slici 2 za prijavu.

Nakon svih ovih radova radit ćemo s PHP programiranjem koje je programski jezik na strani poslužitelja. Zato je potrebno stvoriti vezu s bazom podataka.

Ispis 4: Veza s bazom podataka

Opis popisa 4:

Uspostavili smo vezu između baze podataka i naših web stranica. Ali ako ne znate radi li ili ne, upotrijebite još jednu stvar u zadnjem popisu za provjeru 5 za to.

Listing 5: provjera veze povezivanja baze podataka

Opis Listing 5:

U popisu 5 samo sam vam pokušao pokazati da možete provjeriti i potvrditi vezu između baze podataka i PHP-a. I još nešto, nećemo koristiti kôd Listing 5 na našoj web stranici za prijavu. Jer to je samo da shvatite kako možete provjeriti MySQL vezu.

Sada ćemo napisati PHP programsku aplikaciju da prvo provjerimo dostupnost korisnika, a zatim pohranimo korisnika ako je on/ona novi korisnik na web stranici.

Ispis 6: connectivity-sign-up.php

Opis connectivity-sign-up.php

U ovoj PHP aplikaciji koristio sam najjednostavniji način za izradu prijave za prijavu na web stranice. Kao što vidite, prvo stvaramo vezu kao što je prikazano na popisu 4. Zatim smo upotrijebili dvije funkcije, prva je funkcija SignUP() koju poziva if naredba iz zadnje aplikacije, gdje prvo potvrđuje pritisak na sign up dugme. Ako se pritisne, pozvat će funkciju SingUp i ova će funkcija koristiti upit SELECT za dohvaćanje podataka i njihovu usporedbu s korisničkim imenom i e-poštom koju je korisnik trenutno unio. Ako su korisničko ime i adresa e-pošte već prisutni u bazi podataka, pisat će vam žao što ste već registrirani

Ako je korisnik nov jer njegovo trenutno korisničko ime i ID e-pošte nisu prisutni u bazi podataka, naredba If će pozvati NewUser() gdje će pohraniti sve podatke o novom korisniku. I korisnik će postati dio web stranice.



Slika 3

Na slici 3 korisnik upisuje podatke za prijavu ako je korisnik stari korisnik ove web stranice prema zapisima baze podataka. Dakle, web stranica će prikazati poruku da je korisnik već registriran ako je novi korisnik pa će web stranica prikazati poruku da je registracija korisnika dovršena.



Slika 4:

Kako smo unijeli podatke u obrazac za registraciju (Slika 4), prema bazi podataka koje smo korisničko ime i e-mail unijeli u obrazac za prijavu već je prisutan u bazi podataka. Stoga bismo trebali isprobati novo korisničko ime i adresu e-pošte da bismo se prijavili s novim ID-om i lozinkom.



Slika 5

Na slici 5 potvrđuje se koje je korisničko ime i e-mail ID korisnik unio. Oba nisu prisutna u zapisima baze podataka. Dakle, sada su stvoreni novi ID i lozinka i korisnik može koristiti svoj novi ID i lozinku za prijavu sljedeći put.

Zaključak:

U ovom smo članku naučili najjednostavniji način stvaranja web stranice za prijavu. Također smo naučili kako se postupa s bazom podataka ako koristimo PHP i MySQL. Pokušao sam vam dati osnovno znanje o funkcionalnosti web stranice za prijavu. Kako radi na stražnjoj strani i kako joj možemo promijeniti izgled na prednjoj strani. Za bilo koji upit ne oklijevajte i komentirajte.

Posljednju izmjenu napravio Vincy 5. travnja 2018.

Korisnička prijava i registracija osnovni su uvjet za sve CMS aplikacije. Ovo je početni rad pri pokretanju projekta. Aplikacija s autentifikacijom prijave korisnika pruža sigurnost sprječavanjem anonimnog pristupa. Postoje različiti načini za omogućavanje provjere autentičnosti u našoj aplikaciji, poput omogućavanja OAuth prijave ili implementacije jedinstvene prijave (SSO) i sličnih drugih načina. U prethodnom vodiču vidjeli smo kako implementirati i također o tome.

Ovaj primjer uključuje funkcije prijave i registracije. Koristio sam MySQL bazu podataka za pohranu registriranih članova. Registracija korisnika sadržavat će unos za dobivanje pojedinosti od korisnika. Nakon podnošenja ovog obrasca, podaci obrasca objavljuju se u PHP-u i pohranjuju u bazu podataka. Korisnička lozinka bit će šifrirana prije pohranjivanja u bazu podataka. prije objavljivanja u PHP kodu. Kada je korisnik prijavljen s važećim vjerodajnicama, tada će korisnik i on moći nastaviti dalje.

Obrazac za registraciju korisnika

Ovaj kod treba prikazati obrazac za prijavu korisniku. Kada korisnik pošalje obrazac sa svojim detaljima, bit će pozvana JavaScript funkcija za provjeru valjanosti korisničkog unosa. Nakon uspješne provjere valjanosti, PHP kod će pročitati objavljene podatke obrasca kako bi izvršio umetanje baze podataka.

Na mnogim stranicama koje svakodnevno pregledavamo na Internetu gotovo sve imaju registraciju korisnika. U toj lekciji proći ćemo kroz osnove upravljanja korisnicima, završavajući s jednostavnim članskim područjem koje možete implementirati na svoju web stranicu.

Ova lekcija je osmišljena za početnike u učenju PHP-a gdje ćemo pogledati osnove upravljanja korisnicima.

Korak 1

Kreirajmo tablicu korisnika u bazi podataka u koju ćemo pohraniti podatke o korisnicima u polja tablice 4

  • korisnički ID
  • Korisničko ime
  • Lozinka
  • Email adresa

Upotrijebite SQL upit u nastavku za izradu baze podataka

CREATE TABLE `users` ( ​​​​`UserID` INT(25 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `Username` VARCHAR(65 ) NOT NULL , `Password` VARCHAR(32 ) NOT NULL , `EmailAddress` VARCHAR(255 ) NOT NULL ) ;

Ova datoteka je odgovorna za povezivanje s bazom podataka i bit će prikazana na svim stranicama. Pogledajmo detaljnije retke koda

početak_sesije();

Ova funkcija pokreće sesiju za novog korisnika, zatim ćemo u nju pohraniti podatke o tijeku sesije kako bismo mogli prepoznati korisnike koji su već identificirani

mysql_connect($dbhost, $dbuser, $dbpass) ili die("MySQL pogreška: " . mysql_error());

mysql_select_db($dbname) ili die("MySQL pogreška: " . mysql_error());

Svaka od ovih funkcija obavlja zasebne, ali povezane zadatke.

Funkcija mysql_connect povezuje se s MySQL poslužiteljem baze podataka; parametri u zagradama su varijable kojima su dodijeljene odgovarajuće vrijednosti Host, Username, Password, ako su podaci netočni, prikazat će se poruka o pogrešci

Funkcija mysql_select_db odabire bazu podataka čije smo ime dodijelili varijabli $dbname; ako ne može pronaći bazu podataka, prikazuje poruku o pogrešci

Korak 2 Stvorite datoteku index.php

Vrlo važan element na našoj stranici je prvi redak PHP-a; ovaj redak će uključivati ​​datoteku koju smo stvorili iznad (base.php) i u biti će nam omogućiti pristup bilo čemu iz te datoteke u našoj trenutnoj datoteci. To ćemo učiniti pomoću sljedećeg retka PHP koda. Napravite datoteku pod nazivom index.php i postavite ovaj kod na vrh.

Napravite novu datoteku index.php i zalijepite sljedeći kod na samom početku

Ova linija će povezati datoteku koju smo stvorili iznad (base.php), što će nam omogućiti pristup kodu te datoteke u našoj trenutnoj datoteci.

To se radi pomoću funkcije include().

Sada ćemo napraviti vanjsko sučelje gdje će korisnik unijeti svoje podatke za registraciju, a ako je već registriran dati mogućnost promjene podataka. Budući da je ovaj tutorial usmjeren na PHP, nećemo se baviti HTML/CSS kodom, izgled ćemo napraviti kasnije kada kreiramo naš CSS style sheet, ali za sada ćemo jednostavno umetnuti ovaj kod nakon prethodnog retka.

Sustav upravljanja korisnicima Ovdje zalijepite php kod

Sada, prije nego što uđemo u PHP program, pogledajmo princip njegovog rada, koji bi u datoj situaciji trebao biti prikazan na ekranu:

  • Ako je korisnik već prijavljen, prikazujemo stranicu s raznim opcijama koje su bile skrivene prije registracije.
  • Ako se korisnik još nije prijavio, ali se registrirao, prikazujemo obrazac za unos korisničkog imena i lozinke.
  • Ako koraci 1 i 2 nisu dovršeni, prikazujemo obrazac za registraciju.
  • Izgledat će ovako:



    Povezane publikacije