Dom Stomatologija Napišite registraciju u php. Jednostavan sistem registracije korisnika

Napišite registraciju u php. Jednostavan sistem registracije korisnika

Zdravo! Sada ćemo pokušati implementirati najjednostavniju registraciju na web mjestu sa koristeći PHP+ MySQL. Da biste to uradili, Apache mora biti instaliran na vašem računaru. Princip rada naše skripte je prikazan u nastavku.

1. Počnimo kreiranjem tabele korisnika u bazi podataka. Sadržavat će korisničke podatke (login i lozinku). Idemo na phpmyadmin (ako kreirate bazu podataka na svom računaru http://localhost/phpmyadmin/). Kreiramo tabelu korisnika, ona će imati 3 polja.

Ja ga kreiram u mysql bazi podataka, možete ga kreirati u drugoj bazi podataka. Zatim postavite vrijednosti kao na slici:

2. Potrebna je veza s ovom tablicom.

Kreirajmo datoteku bd.php. Njegov sadržaj:

U mom slučaju to izgleda ovako:
Sačuvaj bd.php .

Odlično! Imamo tabelu u bazi podataka i vezu sa njom. Sada možete početi kreirati stranicu na kojoj će korisnici ostaviti svoje podatke.



3. Kreirajte reg.php fajl sa sadržajem (svi komentari unutra):


3. Kreirajte reg.php fajl sa sadržajem (svi komentari unutra):


Registracija




Vaša prijava:








Vaša lozinka:

4. Kreirajte datoteku koja će unijeti podatke u bazu podataka i sačuvati korisnika. save_user.php (komentari unutra):




5. Sada se naši korisnici mogu registrirati!


5. Sada se naši korisnici mogu registrirati!


Registracija


Vaša prijava:






Zatim morate kreirati „vrata“ za već registrovane korisnike za ulazak na stranicu. index.php (komentari unutra) :



Početna stranica

Registrirajte se

Danas ćemo pogledati eksploataciju kritične jednodnevne ranjivosti u popularnom CMS Joomla, koja je eksplodirala na Internetu krajem oktobra. Govorićemo o ranjivosti sa brojevima CVE-2016-8869, CVE-2016-8870 i CVE-2016-9081. Sva tri dolaze iz jednog dijela koda, a to je pet mnogo godinačami u dubinama okvira, čekajući u krilima, da bi se onda oslobodio i sa sobom ponio haos, hakovane sajtove i suze nevinih korisnika ove Joomle. Samo najhrabriji i najhrabriji programeri, čije su oči crvene od svetlosti monitora, i čije su tastature zatrpane mrvicama hleba, uspeli su da izazovu pobesnele zle duhove i polože svoje glave na oltar popravki.

UPOZORENJE Sve informacije su date samo u informativne svrhe. Ni uredništvo ni autor nisu odgovorni za bilo kakvu moguću štetu uzrokovanu materijalima ovog članka. Gde je sve počelo

Demis Palma je 6. oktobra 2016. godine napravio temu na Stack Exchange-u u kojoj je pitao: zašto, zapravo, u Joomli verziji 3.6 postoje dva metoda za registraciju korisnika sa istim imenom register()? Prvi je u UsersControllerRegistration kontroleru, a drugi je u UsersControllerUser kontroleru. Damis je želio znati da li je metoda UsersControllerUser::register() korištena negdje, ili je to samo evolucijski anahronizam zaostao od stare logike. Njegova zabrinutost je bila da čak i ako ovu metodu ne koristi nijedan pogled, može se pozvati izrađenim upitom. Na što sam dobio odgovor od programera pod nadimkom itoktopus, koji je potvrdio: problem zaista postoji. I poslao izvještaj Joomla programerima.

Tada su se događaji razvijali najbrže. 18. oktobra, Joomla programeri su prihvatili izvještaj od Damisa, koji je do tada izradio PoC koji bi omogućio registraciju korisnika. Objavio je bilješku na svojoj web stranici, gdje u generalni nacrt govorio o problemu koji je pronašao io svojim razmišljanjima o ovom pitanju. Izlazi istog dana nova verzija Joomla 3.6.3, koja još uvijek sadrži ranjivi kod.

Nakon toga, Davide Tampellini vrti grešku dok je ne registruje jednostavan korisnik, i administratora. A već 21. oktobra novi slučaj stiže u Joomla sigurnosni tim. Već govori o povećanju privilegija. Istog dana na Joomla web stranici se pojavljuje najava da će u utorak, 25. oktobra, biti objavljena sljedeća verzija sa serijskim brojem 3.6.3, koja ispravlja kritičnu ranjivost u kernelu sistema.

25. oktobar Joomla Security Strike Team pronalazi najnoviji problem koji je stvorio komad koda koji je otkrio Damis. Zatim je urezivanje od 21. oktobra sa neupadljivim imenom Prepare 3.6.4 Stable Release gurnuto u glavnu granu zvaničnog Joomla repozitorija, čime se popravlja nesrećna greška.

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

27. oktobra, istraživač Harry Roberts postavlja gotov exploit u Xiphos Research repozitorijum koji može da otpremi PHP fajl na server sa ranjivim CMS-om.

Detalji

Pa, pozadina je gotova, pređimo na najzanimljiviji dio – analizu ranjivosti. Instalirao sam Joomla 3.6.3 kao probnu verziju, tako da će svi brojevi redova biti relevantni za ovu verziju. I sve staze do datoteka koje ćete vidjeti u nastavku bit će naznačene u odnosu na korijen instaliranog CMS-a.

Zahvaljujući otkriću Damisa Palme, znamo da postoje dvije metode koje vrše registraciju korisnika u sustav. Prvi koristi CMS i nalazi se u datoteci /components/com_users/controllers/registration.php:108. Drugi (onaj koji ćemo morati da pozovemo) živi u /components/com_users/controllers/user.php:293. Pogledajmo to izbliza.

286: /** 287: * Metoda za registraciju korisnika. 288: * 289: * @return boolean 290: * 291: * @od 1.6 292: */ 293: javna funkcija register() 294: ( 295: JSession::checkToken("post") ili jexit(JText::_ ("JINVALID_TOKEN") ... 300: // Dobiti podatke obrasca 301: $this->input->post->get("user", array(), "array"); 315: $return = $model->validate($form, $data) 318: if ($return === false) 319: ( ... 345: / /). Završite registraciju 346: $return = $model->register($data);

Ovdje sam ostavio samo zanimljive redove. Puna verzija ranjive metode može se vidjeti u Joomla spremištu.

Hajde da shvatimo šta se dešava tokom uobičajene registracije korisnika: koji se podaci šalju i kako se obrađuju. Ako je registracija korisnika omogućena u postavkama, obrazac se može naći na http://joomla.local/index.php/component/users/?view=registration.


Zahtjev za legitimnu registraciju korisnika izgleda kao na sljedećem snimku ekrana.


Komponenta com_users je odgovorna za rad sa korisnicima. Obratite pažnju na parametar zadatka u zahtjevu. Ima format $controller.$method. Pogledajmo strukturu fajla.

Imena skripti u folderu kontrolera odgovaraju imenima pozvanih kontrolera. Pošto naš zahtjev sada ima $controller = "registration" , bit će pozvana datoteka register.php i njena metoda register().

Pažnja, pitanje: kako prenijeti obradu registracije na ranjivo mjesto u kodu? Verovatno ste već pogodili. Imena ranjivih i stvarnih metoda su ista (registr), tako da samo trebamo promijeniti ime pozvanog kontrolera. Gdje se nalazi naš ranjivi kontroler? Tako je, u datoteci user.php. Ispostavilo se da je $controller = "user" . Stavljajući sve zajedno dobijamo zadatak = user.register. Sada se zahtjev za registraciju obrađuje metodom koja nam je potrebna.


Druga stvar koju treba da uradimo je da pošaljemo podatke u ispravnom formatu. Ovdje je sve jednostavno. Legitimni register() od nas očekuje niz pod nazivom jform, u koji prosljeđujemo podatke o registraciji - ime, login, lozinku, email (pogledajte screenshot sa zahtjevom).

  • /components/com_users/controllers/registration.php: 124: // Dobiti korisničke podatke.

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

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

/components/com_users/controllers/user.php: 301: // Dobijte podatke obrasca.

302: $data = $this->input->post->get("user", array(), "array");

  • Stoga mijenjamo imena svih parametara u zahtjevu iz jfrom u user .

Naš treći korak je da pronađemo 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"));

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

  • /components/com_users/controllers/registration.php: 113: // Ako je registracija onemogućena - Preusmjeri na stranicu za prijavu.

114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= login", false)); 117: 118: vrati false; 119: )

  • I tako u ranjivim:

/components/com_users/controllers/user.php:

Da, nema šanse.

Da bismo razumjeli drugi, mnogo ozbiljniji problem, pošaljimo zahtjev koji smo kreirali i da vidimo kako se on izvršava u raznim dijelovima koda. Evo dijela koji je odgovoran za validaciju podataka koje je korisnik poslao u metodi radnika:

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

Članstvo u zajednici u navedenom periodu će vam omogućiti pristup SVIM Hakerskim materijalima, povećati vaš lični kumulativni popust i omogućiti vam da sakupite profesionalnu ocjenu Xakep Score!

Laravel zahtijeva Composer da upravlja ovisnostima projekta. Dakle, prije instaliranja Laravel-a, provjerite da li je Composer instaliran na vašem sistemu. U slučaju da prvi put čujete za Composer, to je alat za upravljanje zavisnostima za php sličan npm-u čvora.

Da biste instalirali Composer na svoju mašinu, provjerite ovaj post:

Instaliranje Laravela na Windows:

Slijedite donje korake da instalirate laravel na Windows mašinu. Bez obzira da imate xampp/wamp stack, radi za oba. Na WAMP-u, obavezno instalirajte laravel na "www" folder i na XAMPP, očigledno "htdocs".

KORAK-1) Otvorite fasciklu "htdocs" na XAMPP-u, držite taster SHIFT i kliknite desnim tasterom miša na fasciklu i izaberite "otvori komandni prozor ovde". Alternativno, možete otvoriti komandni prozor i promijeniti direktorij u "xampp/htdocs".

KORAK-2) Unesite sljedeću naredbu.

Kompozitor kreiraj-projekt laravel/laravel my_laravel_site --prefer-dist

Ovdje je "my_laravel_site" naziv foldera u koji će se instalirati laravel fajlovi. Promijenite ovo po svom ukusu.

KORAK-3) Sada je vrijeme za strpljenje jer će instalacija Laravel-a potrajati.

KORAK-4) Nakon instalacije, promijenite direktorij u "my_laravel_site" (cd "my_laravel_site") na komandnoj liniji i unesite naredbu ispod.

PHP artisan service

KORAK-5) Ovo će pokazati poruku nešto poput, "Laravel razvojni server je započeo:" zajedno sa url-om.

KORAK-7) Gotovo! Uspješno ste instalirali laravel na Windows mašinu i spremni ste za rad.

Postavljanje ključa aplikacije:

Laravel zahtijeva malo konfiguracije nakon instalacije. Zahtijeva da postavite ključ aplikacije. Ovo je nasumični niz od 32 znaka koji se koristi za šifriranje sesije i drugih osjetljivih podataka. Obično će se ovo automatski postaviti kada instalirate laravel preko composer-a ili laravel instalatera.

U slučaju da nije postavljen, morate to učiniti ručno. Prvo se pobrinite da preimenujete datoteku ".env.example" u ".env" u korijenu vaše aplikacije. Zatim otvorite komandnu liniju i promijenite u direktorij projekta laravel. Sada pokrenite donju naredbu da generišete ključ.

PHP zanatski ključ:generiraj

Kopirajte ovaj generirani ključ u varijablu APP_KEY na ".env" datoteci. Sačuvajte i gotovi ste.

Instaliranje određene Laravel verzije:

Gore navedeni metod će natjerati composer da preuzme i instalira najnoviju verziju laravela. Ako želite da instalirate starije verzije laravel-a na svoj stroj, uključite odgovarajući broj verzije u naredbu create-project.

Composer create-project laravel/laravel=5.4 your-project-name --prefer-dist Pročitajte takođe:

Isto tako možete lako instalirajte laravel koristeći composer na windows. Nadam se da će vam ovaj tutorijal biti koristan. Molimo podijelite ga u svom društvenom krugu ako vam se sviđa.

Proces kreiranja sistema registracije je dosta posla. Morate napisati kod koji će provjeriti ispravnost email adresa, poslati e-poruke potvrde, ponuditi mogućnost povrata lozinke, pohraniti lozinke u sigurno mjesto, provjereni obrasci za unos i još mnogo toga. Čak i kada sve ovo uradite, korisnici će nerado da se registruju, jer čak i najmanja registracija zahteva njihovu aktivnost.

U današnjem tutorijalu ćemo razviti jednostavan sistem registracije koji neće zahtijevati nikakve lozinke! Rezultat će biti sistem koji se može lako modificirati ili integrirati u postojeću PHP web stranicu. Ako ste zainteresovani, nastavite čitati.

PHP

Sada smo spremni da počnemo sa PHP kodom. Glavnu funkcionalnost sistema registracije pruža klasa User, koju možete vidjeti u nastavku. Klasa koristi (), što je minimalistička biblioteka baze podataka. Klasa User je odgovorna za pristup bazama podataka, generisanje tokena za prijavu i njihovu validaciju. Predstavlja nam jednostavno sučelje koje se lako može ugraditi u sistem registracije vaših web stranica zasnovanih na PHP-u.

User.class.php

// Privatna ORM instanca
privatni $orm;

/**
* Pronađite korisnika prema nizu tokena. Uzimaju se samo važeći tokeni
* razmatranje. Token vrijedi 10 minuta nakon što je generiran.
* @param string $token Token za traženje
* @return User
*/

Javna statička funkcija findByToken($token)(

// pronađite ga u bazi podataka i provjerite je li vremenska oznaka ispravna


->gdje("token", $token)
->where_raw("token_validity > SADA()")
->nađi_jedan();

If(!$rezultat)(
return false;
}

Vrati novog korisnika($result);
}

/**
* Ili se prijavite ili registrirajte korisnika.
* @return User
*/

Javna statička funkcija loginOrRegister($email)(

// Ako takav korisnik već postoji, vratite ga

If(Korisnik::postoji($email))(
vrati novog korisnika($email);
}

// U suprotnom, kreirajte ga i vratite

Vrati korisnika::create($email);
}

/**
* Kreirajte novog korisnika i sačuvajte ga u bazi podataka
* @param string $email Adresa e-pošte korisnika
* @return User
*/

Privatna statička funkcija create($email)(

// Upisati novog korisnika u bazu podataka i vratiti ga

$result = ORM::for_table("reg_users")->create();
$result->email = $e-pošta;
$result->save();

Vrati novog korisnika($result);
}

/**
* Provjerite postoji li takav korisnik u bazi podataka i vratite boolean.
* @param string $email Adresa e-pošte korisnika
* @return boolean
*/

Javna statička funkcija postoji ($email)(

// Postoji li korisnik u bazi podataka?
$result = ORM::for_table("reg_users")
->gdje("e-pošta", $e-pošta)
->count();

Vrati $result == 1;
}

/**
* Kreirajte novi korisnički objekat
* @param $param ORM instanca, id, email ili null
* @return User
*/

Javna funkcija __construct($param = null)(

If($param instanceof ORM)(

// Prošla je ORM instanca
$this->orm = $param;
}
inače if(is_string($param))(

// E-mail je proslijeđen
$this->
->gdje("e-pošta", $param)
->nađi_jedan();
}
drugo(

If(is_numeric($param))(
// ID korisnika je proslijeđen kao parametar
$id = $param;
}
else if(isset($_SESSION["loginid"]))(

// Nije proslijeđen korisnički ID, pogledajte sesiju
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
->gdje("id", $id)
->nađi_jedan();
}

/**
* Generiše novi SHA1 token za prijavu, upisuje ga u bazu podataka i vraća.
* @return string
*/

Javna funkcija generateToken())(
// generira token za prijavljenog korisnika. Sačuvajte ga u bazi podataka.

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

// Sačuvajte token u bazi podataka,
// i označite ga kao važeće samo sljedećih 10 minuta

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

Vrati $token;
}

/**
*Prijavite se ovog korisnika
* @return void
*/

Javna funkcija login()

// Označi korisnika kao prijavljenog
$_SESSION["loginid"] = $this->orm->id;

// Ažuriraj polje last_login db
$this->orm->set_expr("zadnja_prijava", "SADA()");
$this->orm->save();
}

/**
* Uništite sesiju i odjavite korisnika.
* @return void
*/

Odjava javne funkcije()
$_SESSION = niz();
unset($_SESSION);
}

/**
* Provjerite da li je korisnik prijavljen.
* @return boolean
*/

Javna funkcija loggedIn())(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Provjerite je li korisnik administrator
* @return boolean
*/

Javna funkcija jeAdmin())(
return $this->rank() == "administrator";
}

/**
* Pronađite tip korisnika. Može biti admin ili običan.
* @return string
*/

Javna funkcija rang())(
if($this->orm->rank == 1)(
vrati "administrator";
}

Povratak "običan";
}

/**
* Magični metod za pristup elementima privatnog
* $orm instanca kao svojstva korisničkog objekta
* @param string $key Ime svojstva kojem se pristupa
* @return mješovito
*/

Javna funkcija __get($key)(
if(isset($this->orm->$key))(
vrati $this->orm->$key;
}

Vrati null;
}
}
Tokeni se generiraju pomoću algoritma i pohranjuju u bazu podataka. Koristimo MySQL za postavljanje stupca token_validity na 10 minuta. Prilikom provjere valjanosti tokena, kažemo motoru da nam je potreban token, polje token_validity još nije isteklo. Na ovaj način ograničavamo vrijeme tokom kojeg će token biti važeći.

Primijetite da koristimo magičnu metodu __get() na kraju dokumenta za pristup svojstvima korisničkog objekta. Ovo nam omogućava da pristupimo podacima koji su pohranjeni u bazi podataka kao svojstva: $user->email, $user->token. Kao primjer, da vidimo kako možemo koristiti ovu klasu u sljedećem isječku koda:


Druga datoteka koja pohranjuje potrebnu funkcionalnost je functions.php. Tu imamo nekoliko pomoćnih funkcija koje nam omogućuju da ostatak koda bude uredniji.

Functions.php

Funkcija send_email($from, $to, $subject, $message)(

// Pomoćna funkcija za slanje e-pošte

$headers = "MIME-verzija: 1.0" . "\r\n";
$headers .= "Tip sadržaja: tekst/običan; charset=utf-8" . "\r\n";
$headers .= "Od: ".$od . "\r\n";

Vrati poštu ($to, $subject, $message, $headers);
}

funkcija get_page_url())(

// Saznajte URL PHP datoteke

$url = "http".(prazno($_SERVER["HTTPS"])?"":"s")."://".$_SERVER["SERVER_NAME"];

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

Vrati $url;
}

funkcija rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)(

// Broj pokušaja prijavljivanja za zadnji sat sa ove IP adrese

$count_hour = ORM::for_table("reg_login_attempt")
->
->where_raw("ts > SUBTIME(SADA(),"1:00")")
->count();

// Broj pokušaja prijave u posljednjih 10 minuta putem ove IP adrese

$count_10_min = ORM::for_table("reg_login_attempt")
->where("ip", sprintf("%u", ip2long($ip)))
->where_raw("ts > SUBTIME(SADA(),"0:10")")
->count();

If($count_hour > $limit_hour || $count_10_min > $limit_10_min)(
throw new Exception("Previše pokušaja prijave!");
}
}

funkcija rate_limit_tick($ip, $email)(

// Kreirajte novi zapis u tabeli pokušaja prijave

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

$login_attempt->email = $e-pošta;
$login_attempt->ip = sprintf("%u", ip2long($ip));

$login_attempt->save();
}

funkcija preusmjeravanje ($url)(
header("Lokacija: $url");
izlaz;
}
Funkcije rate_limit i rate_limit_tick nam omogućavaju da ograničimo broj pokušaja autorizacije za određeni vremenski period. Pokušaji autorizacije se bilježe u bazi podataka reg_login_attempt. Ove funkcije se pokreću kada je obrazac za prijavu potvrđen, kao što možete vidjeti u sljedećem isječku koda.

Donji kod je preuzet sa index.php i odgovoran je za validaciju obrasca za prijavu. Vraća JSON odgovor koji je vođen jQuery kodom koji smo vidjeli u assets/js/script.js.

index.php

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

// Izlaz JSON zaglavlja

Header("Tip sadržaja: aplikacija/json");

// Da li je email adresa važeća?

If(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(
throw new Exception("Molimo unesite važeći email.");
}

// Ovo će izbaciti izuzetak ako je osoba iznad
// dozvoljena ograničenja pokušaja prijave (pogledajte functions.php za više):
rate_limit($_SERVER["REMOTE_ADDR"]);

// Zabilježite ovaj pokušaj prijave
rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["email"]);

// Pošaljite poruku korisniku

$message = "";
$email = $_POST["e-pošta"];
$subject = "Vaš link za prijavu";

If(!User::exists($email))(
$subject = "Hvala na registraciji!";
$message = "Hvala što ste se registrovali na našem sajtu!\n\n";
}

// Pokušaj prijave ili registracije osobe
$user = Korisnik::loginOrRegister($_POST["e-pošta"]);

$message.= "Možete se prijaviti sa ovog URL-a:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Link će automatski isteći nakon 10 minuta.";

$result = send_email($fromEmail, $_POST["email"], $subject, $message);

If(!$rezultat)(
throw new Exception("Došlo je do greške prilikom slanja vaše e-pošte. Pokušajte ponovo.");
}

Die(json_encode(niz(
"message" => "Hvala vam! Poslali smo link do vašeg prijemnog sandučeta. Provjerite i svoj spam folder."
)));
}
}
uhvatiti(izuzetak $e)(

Die(json_encode(niz(
"greška"=>1,
"message" => $e->getMessage()
)));
}
Nakon uspješne autorizacije ili registracije, gornji kod šalje e-mail osobi s vezom za autorizaciju. Token je dostupan kao $_GET varijabla "tkn" zbog generiranog URL-a.

index.php

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

// Je li ovo valjan token za prijavu?
$user = Korisnik::findByToken($_GET["tkn"]);

// Da! Prijavite se korisnika i preusmjerite na zaštićenu stranicu.

$user->login();
redirect("protected.php");
}

// Nevažeći token. Preusmjerite natrag na obrazac za prijavu.
redirect("index.php");
}
Pokretanje $user->login() će kreirati potrebne varijable sesije, omogućavajući korisniku da ostane prijavljen pri narednim prijavama.

Odjava sa sistema se implementira na približno isti način:

Index.php

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

$user = novi korisnik();

If($user->loggedIn())(
$user->logout();
}

Preusmjeravanje("index.php");
}
Na kraju koda ponovo preusmeravamo korisnika na index.php, tako da je parametar ?logout=1 u URL-u eliminisan.

Naš index.php fajl će takođe trebati zaštitu - ne želimo da već prijavljeni korisnici vide obrazac. Za ovo koristimo metodu $user->loggedIn():

Index.php

$user = novi korisnik();

if($user->loggedIn())(
redirect("protected.php");
}
Na kraju, pogledajmo kako možete zaštititi svoju web stranicu i učiniti je dostupnom tek nakon autorizacije:

protected.php

// Da biste zaštitili bilo koju php stranicu na vašem sajtu, uključite main.php
// i kreiramo novi objekt korisnika. To je tako jednostavno!

require_once "includes/main.php";

$user = novi korisnik();

if(!$user->loggedIn())(
redirect("index.php");
}
Nakon ove provjere, možete biti sigurni da se korisnik uspješno prijavio. Također ćete imati pristup podacima koji su pohranjeni u bazi podataka kao svojstva $user objekta. Za prikaz e-pošte korisnika i njihov rang, koristite sljedeći kod:

Echo "Vaša e-pošta: ".$user->email;
echo "Vaš rang: ".$user->rank();
Ovdje je rank() metoda jer stupac ranga u bazi podataka obično sadrži brojeve (0 za normalne korisnike i 1 za administratore), a sve to moramo pretvoriti u imena rangova, što se implementira pomoću ovu metodu. Da konvertujete standardnog korisnika u administratora, jednostavno uredite unos korisnika u phpmyadmin (ili bilo kom drugom programu baze podataka). Kao administrator, korisnik neće imati nikakva prava posebne karakteristike. Vi sami imate pravo da odaberete koja prava ćete dodijeliti administratorima.

Spremni!

Sa ovim je naš jednostavan sistem registracije spreman! Možete ga koristiti na postojećoj PHP stranici ili ga modernizirati tako da odgovara vašim zahtjevima.

Reg.ru: domeni i hosting

Najveći registrator i hosting provajder u Rusiji.

Više od 2 miliona imena domena u upotrebi.

Promocija, domenska pošta, poslovna rješenja.

Više od 700 hiljada kupaca širom svijeta već je odlučilo.

*Pređite mišem preko za pauziranje pomicanja.

Nazad Naprijed

Kreiranje jednostavnog sistema registracije korisnika u PHP i MySQL

Stvaranje sistema registracije je dosta posla. Morate napisati kod koji potvrđuje adrese e-pošte, šalje e-poštu kojom se potvrđuje registracija, a također potvrđuje druga polja obrasca i još mnogo toga.

A i nakon što sve ovo napišete, korisnici će nerado da se registruju, jer... ovo zahteva određeni napor sa njihove strane.

U ovom vodiču ćemo kreirati vrlo jednostavan sistem registracije koji uopće ne zahtijeva niti pohranjuje lozinke! Rezultat će biti lako modificirati i dodati postojećoj PHP stranici. Želite li saznati kako to funkcionira? Pročitajte u nastavku.



Evo kako će naš super jednostavan sistem funkcionirati:

Kombinovaćemo formular za autorizaciju i registraciju. Ovaj obrazac će imati polje za unos vaše e-mail adrese i dugme za registraciju;
- Prilikom popunjavanja polja sa email adresom, klikom na dugme za registraciju kreiraće se zapis o novom korisniku, ali samo ako unesena adresa e-pošte nije pronađena u bazi.

Nakon toga, kreira se nasumični jedinstveni skup znakova (token), koji se šalje na e-poštu koju je odredio korisnik u obliku linka koji će biti relevantan 10 minuta;
- Link vodi korisnika na našu web stranicu. Sistem utvrđuje prisustvo tokena i ovlašćuje korisnika;

Prednosti ovog pristupa:

Nema potrebe za pohranjivanjem lozinki ili validacijom polja;
- Nema potrebe za vraćanjem vaše lozinke, sigurnosnih pitanja, itd.;
- Od trenutka kada se korisnik registruje/prijavljuje, uvijek možete biti sigurni da će ovaj korisnik biti u vašoj pristupnoj zoni (da je adresa e-pošte tačna);
- Nevjerovatno jednostavan proces registracije;

Nedostaci:

Sigurnost korisničkog naloga. Ako neko ima pristup korisničkoj pošti, može se prijaviti.
- E-pošta nije sigurna i može se presresti. Imajte na umu da je ovo pitanje relevantno iu slučaju kada je lozinka zaboravljena i treba je vratiti, ili u bilo kojem sistemu autorizacije koji ne koristi HTTPS za prijenos podataka (login/lozinka);
- Dok pravilno konfigurišete svoj mail server, postoji šansa da će poruke sa linkovima za autorizaciju završiti u neželjenoj pošti;

Upoređujući prednosti i nedostatke našeg sistema, možemo reći da sistem ima visoku upotrebljivost (maksimalna pogodnost za krajnjeg korisnika) i da istovremeno ima nizak pokazatelj sigurnosti.

Stoga se preporučuje da se koristi za registracije na forumima i servisima koji ne rade sa važnim informacijama.

Kako koristiti ovaj sistem

U slučaju da samo trebate koristiti sistem za autorizaciju korisnika na vašoj web-lokaciji, a ne želite da rastavljate ovu lekciju, evo šta trebate učiniti:

Morate preuzeti izvore priložene lekciji
- Pronađite datoteku tables.sql u arhivi. Uvezite je u svoju bazu podataka koristeći opciju uvoza u phpMyAdmin. Alternativni način: otvorite ovu datoteku putem uređivač teksta, kopirajte SQL upit i izvršite ga;
- Otvorite include/main.php i popunite postavke za povezivanje sa vašom bazom podataka (navedite korisnika i lozinku za povezivanje sa bazom, kao i host i naziv baze podataka). U istoj datoteci morate navesti i email, koji će se koristiti kao originalna adresa za poruke koje sistem šalje. Neki domaćini blokiraju odlazne e-poruke osim ako obrazac ne sadrži pravu adresu e-pošte, koja je kreirana na kontrolnoj tabli domaćina, pa navedite pravu adresu;
- Otpremite sve index.php, protected.php datoteke i sredstva i uključuje foldere preko FTP-a na vaš host;
- Dodajte kod u nastavku na svaku PHP stranicu na kojoj želite da prikažete obrazac za prijavu;

Require_once "includes/main.php"; $user = novi korisnik(); if(!$user->loggedIn())( redirect("index.php"); )
- Spreman!

Za one koje zanima kako sve to funkcionira, pročitajte u nastavku!

Prvi korak je pisanje HTM koda za formular za autorizaciju. Ovaj kod se nalazi u datoteci index.php. Ova datoteka također sadrži PHP kod koji rukuje podacima obrasca i drugim korisnim sistemskim funkcijama za prijavu. Više o tome možete saznati u donjem dijelu posvećenom pregledu PHP koda.

index.php

Vodič: Super jednostavan sistem registracije sa PHP & MySQL prijavom ili registracijom

Unesite svoju email adresu iznad i mi ćemo poslati
imate link za prijavu.

Prijava/registracija

U odeljku zaglavlja (između oznaka i) uključio sam glavne stilove (oni nisu obuhvaćeni u ovom tutorijalu, tako da ih možete sami pogledati. Folder assets/css/style.css). Prije završne oznake, uključio sam jQuery biblioteku i datoteku script.js, koju ćemo napisati i analizirati u nastavku.


JavaScript

jQuery prati stanje dugmeta "Registracija/Prijava" pomoću funkcije e.preventDefault() i šalje AJAX zahtjeve. U zavisnosti od odgovora servera, on prikazuje jednu ili drugu poruku i određuje dalje radnje/

sredstva/js/script.js

$(function())( var form = $("#login-register"); form.on("submit", function(e)( if(form.is(".loading, .loggedIn"))( return false ; var email = form.find("input").val(), messageHolder = form.find("span"("span"), (e-mail: email), function (m)( if (m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder. text(m.message ) )); ;

je dodan u obrazac za prikaz trenutno stanje AJAX zahtjev (ovo je omogućeno zahvaljujući metodama ajaxStart()) I ajaxComplete(), koji možete pronaći na kraju datoteke).

Ova klasa prikazuje vrteću animiranu gif datoteku (kao da nam nagovještava da se zahtjev obrađuje), a djeluje i kao zastavica da spriječi ponovno slanje obrasca (kada je dugme za registraciju već jednom kliknuto). Klasa .loggedIn je još jedna oznaka - postavlja se kada je e-mail poslan. Ova zastavica odmah blokira sve daljnje radnje s formom.

Šema baze podataka

Naš neverovatno jednostavan sistem evidentiranja koristi 2 MySQL tabele (SQL kod je u datoteci tables.sql). Prvi pohranjuje podatke o korisničkim nalozima. Drugi pohranjuje informacije o broju pokušaja prijave.


Šema korisničke tablice.

Sistem ne koristi lozinke, kao što se može vidjeti na dijagramu. Na njemu možete vidjeti kolonu tokena sa tokenima pored stupca token_validity. Token se instalira čim se korisnik poveže na sistem i podesi svoju e-poštu da pošalje poruku (više o tome u sljedećem bloku). Kolona token_validity postavlja vrijeme 10 minuta kasnije, nakon čega token više nije važeći.


Shema tablice koja broji broj pokušaja autorizacije.

U obje tabele, IP adresa je pohranjena u obrađenom obliku, koristeći funkciju ip2long u polju tipa cijeli broj.

Sada možemo napisati neki PHP kod. Glavna funkcionalnost sistema je dodijeljena klasi User.class.php, koju možete vidjeti u nastavku.

Ova klasa aktivno koristi idorm (docs), ove biblioteke su minimum potrebnih alata za rad sa bazama podataka. On se bavi pristupom bazi podataka, generiranjem tokena i provjerom valjanosti tokena. Pruža jednostavan interfejs koji olakšava povezivanje sistema registracije sa vašom veb lokacijom ako koristi PHP.

User.class.php

Class User( // Private ORM case private $orm; /** * Pronađi korisnika po tokenu. Samo važeći tokeni se prihvataju na razmatranje. Token se generiše samo 10 minuta od trenutka kada je kreiran * @param string $token Ovo je onaj koji tražimo za token * @return User Vratite vrijednost korisničke funkcije */ javna statička funkcija findByToken($token)( // pronađite token u bazi podataka i provjerite je li postavljena ispravna vremenska oznaka. rezultat = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one()( return false; ) return new User($result) /** * Autorizirajte ili registrirajte korisnika * @param string $email adresa korisnika * @return User */ javna statička funkcija loginOrRegister($email)( // Ako je takav korisnik. već postoji, vrati vrijednost funkcije User sa navedene adrese e-pošte pohranjene u bazi podataka if(User::exists($email))( return new User($email); ) // U suprotnom, kreirajte novog korisnika u bazu podataka i vrati vrijednost funkcije User::create iz specificirane e-pošte vrati User::create($email );

Tokeni se generiraju pomoću SHA1 algoritma i pohranjuju u bazu podataka. Koristim MySQL funkcije za mjerenje vremena da postavim vremensko ograničenje od 10 minuta za valjanost tokena.

Kada je token validiran, direktno govorimo rukovaocu da razmatramo samo tokene koji još nisu istekli, pohranjene u stupcu token_validity.

Imajte na umu da koristim magičnu metodu __get docs biblioteka na kraju datoteke za presretanje pristupa svojstvima objekta User.

Zahvaljujući tome, postaje moguć pristup informacijama pohranjenim u bazi podataka, zahvaljujući svojstvima $user->email, $user->token, itd. U sljedećem fragmentu koda ćemo pogledati kako koristiti ove klase kao primjer.


Zaštićena stranica

Još jedna datoteka koja pohranjuje korisne i neophodne funkcionalnosti je datoteka functions.php. Postoji nekoliko takozvanih pomoćnika - pomoćnih funkcija koje vam omogućavaju da kreirate čišći i čitljiviji kod u drugim datotekama.

functions.php

Funkcija send_email($from, $to, $subject, $message)( // Pomoćnik koji šalje e-poštu $headers = "MIME-verzija: 1.0" . "\r\n"; $headers .= "Tip sadržaja: tekst /plain; charset=utf-8" . "\r\n"; $headers .= "Od: ".$from . "\r\n"; vrati poštu ($to, $subject, $message, $headers) ) function get_page_url())( // Odredite URL PHP datoteke $url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://" .$_SERVER ["SERVER_NAME"] if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) else() $url = $_SERVER["PATH_INFO"] return $url function rate_limit($limit_hour = 20, $limit_10_min = 10)( // Broj pokušaja prijave u posljednjem satu za ovu IP adresu; = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00" )") ->count(); // Broj pokušaja prijave u posljednjih 10 minuta za ovu IP adresu $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u" , ip2long($ ip))) ->where_raw("ts > SUBTIME(NOW(),"0:10")") ->count();

if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new Exception("Previše pokušaja prijave!"); ) ) function rate_limit_tick($ip, $email)( // Kreiraj novi zapis u tabeli koji broji broj pokušaja prijave $login_attempt = ORM::for_table("reg_login_attempt")->create( $login_attempt->email = $email->ip = sprintf("%u", ip2long($); )); $login_attempt->save() function redirect($url)(header("Location: $url"); exit; Funkcije rate_limit I rate_limit_tick

pratiti broj pokušaja autorizacije u proteklom vremenskom periodu od prvog pokušaja. Pokušaj prijave se bilježi u bazi podataka u stupcu reg_login_attempt. Ove funkcije se pozivaju kada se podaci obrasca obrađuju i predaju kao što možete vidjeti iz sljedećeg isječka koda.

index.php

Pokušajte( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Iznesite JSON zaglavlje("Content-type: application/json"); // Da li je ova adresa e-pošte važeća ako (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Molimo unesite ispravan email."); ) // Provjerite korisniku je dozvoljeno da se prijavi, da li je prekoračio broj dozvoljenih veza (fajl functions.php za više informacija) rate_limit($_SERVER["REMOTE_ADDR"] // Zabilježiti ovaj pokušaj autorizacije rate_limit_tick($_SERVER["REMOTE_ADDR"]); , $ _POST["email"] // Pošaljite e-mail korisniku $email = $_POST["email"] (Vaša veza za prijavu); Hvala na registraciji!"; $message = "Hvala što ste se registrovali na našoj stranici!\n\n"; ) // Pokušaj autorizacije ili registracije korisnika $user = User::loginOrRegister($_POST[ "email"] ); $message.= "Možete se prijaviti sa ovog URL-a:\n";

$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Link će automatski isteći nakon 10 minuta.";$result = send_email($fromEmail, $_POST["email"], $subject, $message);

index.php

if(!$result)( throw new Exception("Došlo je do greške pri slanju vaše e-pošte. Molimo pokušajte ponovo."); ) die(json_encode(array("message" => "Hvala! Poslali smo link Provjerite i vašu mapu neželjene pošte."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage()). )));

Nakon uspješne prijave/registracije, gornji kod će poslati korisniku link za prijavu. Token postaje dostupan jer prosljeđuje se kao varijabla u generiranoj vezi metodom

$_GET

sa tkn markerom

index.php

If(isset($_GET["tkn"]))( // Je li ovaj token važeći za autorizaciju? $user = User::findByToken($_GET["tkn"]); if($user)( // Da, je Preusmjeravanje na zaštićenu stranicu $user->login("protected.php"); ) ");)

Na kraju koda, ponovo sam postavio preusmjeravanje na index.php, dakle parametar ?logout=1 prenijeti putem URL-a nije potrebno.

Naš index.php fajl zahtijeva dodatne. zaštita - ne želimo da ljudi koji su se prijavili na sistem ponovo vide obrazac za registraciju. U ove svrhe koristimo metodu $user->loggedIn().

index.php

$user = novi korisnik(); if($user->loggedIn())( redirect("protected.php"); )

Konačno, ovdje je dio koda koji vam omogućava da zaštitite stranice vašeg web-mjesta i učinite im dostupnim tek nakon autorizacije.

protected.php

// Da biste zaštitili svaku stranicu na vašem sajtu, uključite main.php fajl // i kreirajte novi User objekat. Eto kako je to lako! require_once "includes/main.php"; $user = novi korisnik(); if(!$user->loggedIn())( redirect("index.php"); )

Nakon ove provjere, možete biti sigurni da je korisnik uspješno autoriziran. Također možete pristupiti pohranjenim informacijama u bazi podataka koristeći svojstva objekta $user. Za prikaz e-pošte i statusa korisnika koristite ovaj kod:

Echo "Vaša e-pošta: ".$user->email; echo "Vaš rang: ".$user->rank();

Metoda rang() se ovdje koristi jer baza podataka obično pohranjuje brojeve (0 za običnog korisnika, 1 za administratora) i te podatke moramo pretvoriti u statuse na koje se odnose, u čemu nam ova metoda pomaže.

Da biste običnog korisnika učinili administratorom, jednostavno uredite unos korisnika kroz phpMyAdmin (ili bilo koji drugi program koji vam omogućava upravljanje bazama podataka). Status administratora ne daje nikakve privilegije u ovom primjeru, stranica će prikazati da ste administrator - i to je sve.

Ali šta ćete s tim učiniti, prepušteno je vašem nahođenju, možete sami napisati i sastaviti kod koji postavlja određene privilegije i mogućnosti za administratore.

Gotovi smo!

Završili smo s ovim nevjerovatno super kvazi jednostavnim oblikom! Možete ga koristiti na svojim PHP stranicama, prilično je jednostavno. Možete ga i modificirati za sebe i napraviti kako želite.

Materijal je pripremio Denis Malyshok posebno za web stranicu

P.S.

Da li želite da napredujete u savladavanju PHP-a i OOP-a? Obratite pažnju na premium lekcije o različitim aspektima izrade web stranica, uključujući programiranje u PHP-u, kao i na besplatni kurs o kreiranju vlastitog CMS sistema u PHP-u od nule koristeći OOP:
Da li vam se dopao materijal i želite da mi se zahvalite?




Novo na sajtu

>

Najpopularniji