Zašto je opasno omogućiti PHP register_globals parametar? Kreiranje jednostavnog sistema registracije korisnika u PHP-u i MySQL-u Bezlični indeksni php registar

Zdravo! Sada ćemo pokušati implementirati najjednostavniju registraciju na stranicu 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):



Registracija


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! Zatim morate kreirati „vrata“ za već registrovane korisnike za ulazak na stranicu. index.php (komentari unutra) :




Početna stranica


Početna stranica


Vaša prijava:


Vaša lozinka:






Registrirajte se



OK, sada je sve gotovo! Lekcija može biti dosadna, ali vrlo korisna. Ovdje je prikazana samo ideja registracije, a zatim je možete poboljšati: dodati sigurnost, dizajn, polja podataka, učitavanje avatara, odjavljivanje s vašeg računa (da biste to učinili, jednostavno uništite varijable iz sesije s funkcijom unset) i tako dalje. Sretno!

Sve sam proverio, radi kako treba!

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 napred

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-mail koji potvrđuje registraciju, a također potvrđuje druga polja obrasca i još mnogo toga.

A čak 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 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 se kreira nasumični jedinstveni skup znakova (token) koji se šalje na e-poštu koju je korisnik odredio u obliku veze koja će biti relevantna 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 ovu lekciju rastavljate na komade, evo što 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 kroz 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, 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"); e.preventDefault(); $.post(this.action, (email: email), function (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder . text(m.message); ) )); )); $(document).ajaxStart(function())(form.addClass("loading"); )); $(document).ajaxComplete(function()) ( form. removeClass("učitavanje"); )); ));

je dodan u obrazac za prikaz trenutnog stanja AJAX zahtjeva (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 također djeluje 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.


Shema 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 Vrati vrijednost korisničke funkcije */ javna statička funkcija findByToken($token)( // pronađi token u bazi podataka i provjeri da li je postavljena ispravna vremenska oznaka $result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > SADA()") ->find_one(); if(!$result)( vrati false; ) return new User($result); ) /** * Autorizirajte ili registrirajte korisnika * @param string $email Adresa e-pošte 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, kreiraj novog korisnika u bazi podataka i vrati vrijednost funkcije User::create iz specificirane e-pošte vrati User::create($email ); ) /** * Kreirajte novog korisnika i sačuvajte u bazi podataka * @param string $email. Adresa e-pošte korisnika * @return User */ privatna statička funkcija create($email)( // Napišite novog korisnika i vratite rezultat funkcije User iz ovih vrijednosti $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); vrati novog korisnika($result); ) /** * Provjerite postoji li takav korisnik u bazi podataka i vrati Booleovu vrijednost varijabla * @param string $email. Adresa e-pošte korisnika * @return boolean */ javna statička funkcija postoji($email)( // Da li korisnik postoji u bazi podataka? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Kreirajte novi korisnički objekat * @param instanca $param ORM , id, email ili 0 * @return Korisnik */ javna funkcija __construct($param = null) ( if($param instanceof ORM)( // ORM provjera je prošla $this->orm = $param; ) else if(is_string($param))( // Provjera e-pošte je prošla $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // vrijednost varijable $param je proslijeđen identifikatoru korisnika $id = $param; ) else if(isset($_SESSION["loginid"]))( // U suprotnom pogledajte sesiju $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Generiši novi SHA1 autorizacijski token, upisuje ga u bazu podataka i vraća njegovu vrijednost * @return string */ javna funkcija generateToken( )( // Generiraj token za ovlaštenog korisnika i spremi ga u bazu podataka $token = sha1($this->email.time().rand(0, 1000000)); // Sačuvajte token u bazi podataka // I označite ga kao važeći samo narednih 10 minuta $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); return $token; ) /** * Ovlastite korisnika * @return void */ public function login())( // Označite korisnika kao prijavljenog u $_SESSION["loginid"] = $this->orm->id; // Ažurirajte vrijednost polja baze podataka last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Uništite sesiju i odjavite korisnika * @return void */ odjava javne funkcije ()( $_SESSION = array(); unset($_SESSION); ) /** * Provjerite da li je korisnik prijavljen * @return boolean */ javna funkcija loggedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Provjerava da li je korisnik administrator * @return boolean */ public function isAdmin())( return $this->rank() = = "administrator"; ) /** * Pronađi tip korisnika, može biti administrator ili običan * @return string */ javna funkcija rank())( ako ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Metoda koja vam omogućava da dobijete privatne informacije korisnika kao * svojstva objekta User * @ param string $key Ime svojstva koje dobija pristup * @return mixed */ javna funkcija __get($key)( if(isset($this->orm->$key))( return $this->orm-> $key; ) vrati null; ) )

Tokeni se generiraju pomoću SHA1 algoritma i pohranjuju u bazi podataka. Koristim MySQL funkcije za mjerenje vremena da postavim 10-minutno vremensko ograničenje 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 ($za, $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"]; ) vrati $url; ) function rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Broj pokušaja prijave u posljednjem satu na ovu IP adresu $ count_hour = 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 na ovoj IP adresi $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; $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->save(); ) funkcija redirect($url)( header("Lokacija: $url"); izlaz; )

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.

Kôd ispod je preuzet iz index.php datoteke i obrađuje podnošenje obrasca. Vraća JSON odgovor, koji zauzvrat obrađuje jQuery u datoteci assets/js/script.js koju smo ranije pogledali.

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 važeći email."); ) // Provjerite. Je li korisniku je dozvoljeno da se prijavi, da li je premašio broj dozvoljenih konekcija? (functions.php fajl za više informacija) rate_limit($_SERVER["REMOTE_ADDR"]); // Prijavite ovaj pokušaj prijave rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Pošaljite e-mail korisniku $message = ""; $email = $_POST["email"]; $subject = "Vaša veza za prijavu"; if(!User:: exists($email) )( $subject = "Hvala na registraciji!"; $message = "Hvala što ste se registrovali na našem sajtu!\n\n"; ) // Pokušaj autorizacije ili registracije korisnika $user = Korisnik ::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); 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 u svoju pristiglu poštu. Provjerite i svoju spam folder."))); ) ) 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. Preusmjerite na zaštićenu stranicu $user->login(); redirect("protected.php"); ) // Ne, token nije važeći. Preusmjerite na stranicu sa formularom za autorizaciju/registraciju redirect("index. php"); )

$user->login()

će kreirati potrebne varijable za sesiju, tako da će korisnik, pregledavajući sljedeće stranice stranice, ostati ovlašten u svakom trenutku.

Obrada funkcije za izlazak iz sistema uređena je na sličan način.

index.php

If(isset($_GET["logout"]))( $user = novi korisnik(); if($user->loggedIn())( $user->logout(); ) redirect("index.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 trebamo pretvoriti u statuse kojima pripadaju, 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 to.

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. Također ga možete modificirati za sebe i napraviti ga onako 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?
Samo podijelite sa svojim prijateljima i kolegama!


Zbog činjenice da se vrlo često postavljaju pitanja o globalnim varijablama i problemima povezanim s onemogućavanjem register_globals direktive, pokušat ćemo malo pokriti ovu temu u ovom članku.

Prvo, hajde da definišemo šta su eksterne varijable. To su sve varijable koje dolaze u program izvana, tj. nisu definisani u samom programu. Za php skriptu, sve varijable koje se prosleđuju kroz liniju pretraživača ili kroz formu su vanjske.
Pogledajmo kako nastaju.

Ako je na serveru (u php.ini) omogućena direktiva register_globals = On, tada će se prilikom prolaska varijabli kroz formu ili kroz liniju pretraživača, u skripti kojoj su ove varijable namijenjene, one automatski kreirati. One. ako imate sledeće napisano u liniji pretraživača: www.server.ru/index.php?var=1, tada će varijabla $var sa vrednošću jednakom 1 biti automatski kreirana u skripti index.php.

Komentar

Ova direktiva je jedna od najkontroverznijih tačaka u PHP jeziku. S jedne strane, njegova upotreba zaista može dovesti do stvarnih problema sa zaštitom PHP skripti, ako se moguće situacije greške ne uzmu u obzir kako treba, a mnogi programeri s pravom primjećuju da pisanje skripti bez korištenja globalnih varijabli smanjuje ranjivost skripti na razne vrste napada za 90%. S druge strane, u zoru PHP-a, više od hiljadu korisnika je vjerovalo programerima jezika (do PHP 4.3 ova direktiva je bila uključena po defaultu), zbog čega trenutno postoje milioni stvarno funkcionalnih skripti napisanih korištenjem globalnih varijabli (To je Vrijedi napomenuti da je u obrazovne svrhe ponekad potpuno isplativo pisati skripte koristeći globalne varijable, jer njihova zamjena superglobalnim nizovima uvelike narušava čitljivost koda).

Trenutno, većina host provajdera ima ovu direktivu omogućenu i vjerovatno će ostati omogućena još dugo vremena, jer u suprotnom može prekinuti kontinuitet koda.

Kada je direktiva register_globals onemogućena, pristup takvim varijablama je moguć na dva načina:

  • preko asocijativnih nizova HTTP_***_VARS (HTTP_POST_VARS, itd.)
  • kroz superglobalne nizove ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES, itd.)

Superglobalni nizovi su dostupni u bilo kojem opsegu. PHP programeri preporučuju onemogućavanje register_globals direktive na serveru i rad sa varijablama kroz superglobalne nizove. Ova preporuka je zbog sigurnosnih problema koji bi mogli nastati kada je omogućena direktiva register_globals.

Iako je donedavno direktiva register_globals ostala omogućena na hosting stranicama. Situacija je počela da se menja izdavanjem PHP 5, gde je ova direktiva podrazumevano onemogućena i hosteri ne žure da je omoguće (možda i s pravom).

Dakle, šta tačno treba da uradite da biste dobili varijable? Morate ih uzeti iz superglobalnih nizova. Na primjer, da se varijable proslijede kroz liniju pretraživača, koristite niz $_GET. Recimo da linija pretraživača kaže www.server.ru/index.php?var=1. Zatim da biste dobili varijablu var u index.php morate napisati:

$var=$_GET["var"];

I, na primjer, da biste primili varijable prenesene iz obrasca pomoću metode POST, u skriptu za obradu obrasca morate napisati:

$var=$_POST["var"];

U ovom članku ćete naučiti kako da kreirate obrazac za registraciju i prijavu koristeći HTML, JavaScript, PHP i MySql. Ovakvi obrasci se koriste na gotovo svakoj web stranici, bez obzira na njen tip. Napravljeni su za forum, online prodavnicu, društvene mreže (kao što su Facebook, Twitter, Odnoklassniki) i mnoge druge vrste stranica.

Ako imate web stranicu na svom lokalnom računalu, nadam se da već imate instaliran i pokrenut lokalni server. Bez toga ništa neće raditi.

Kreiranje tabele u bazi podataka

Za implementaciju registracije korisnika, prije svega nam je potrebna Baza podataka. Ako ga već imate, onda odlično, inače, morate ga kreirati. U članku detaljno objašnjavam kako to učiniti.

I tako, imamo bazu podataka (skraćeno DB), sada treba da kreiramo tabelu korisnika u koje ćemo dodati naše registrovane korisnike.

U članku sam također objasnio kako napraviti tabelu u bazi podataka. Prije kreiranja tabele, moramo odrediti koja će polja sadržavati. Ova polja će odgovarati poljima iz obrasca za registraciju.

Dakle, pomislili smo, zamislili koja polja će imati naš obrazac i napravili tabelu korisnika sa ovim poljima:

  • id- Identifikator. Polje id Svaka tabela u bazi podataka treba da ga ima.
  • ime- Da sačuvam ime.
  • prezime- Da sačuvam prezime.
  • email- Da sačuvate poštansku adresu. Koristićemo e-mail kao login, tako da ovo polje mora biti jedinstveno, odnosno imati UNIQUE indeks.
  • email_status- Polje za označavanje da li je pošta potvrđena ili ne. Ako je pošta potvrđena, tada će imati vrijednost 1, u suprotnom vrijednost je 0.
  • lozinka- Da sačuvate lozinku.


Ako želite da vaš formular za registraciju ima još neka polja, također ih možete dodati ovdje.

To je to, naš sto korisnika spreman. Pređimo na sljedeću fazu.

Veza sa bazom podataka

Napravili smo bazu podataka, sada se moramo povezati s njom. Povezićemo se pomoću PHP ekstenzije MySQLi.

U folderu naše stranice kreirajte datoteku s imenom dbconnect.php, i napišite sljedeću skriptu u njoj:

Ovaj fajl dbconnect.php morat će biti spojen na rukovaoce obrascima.

Obratite pažnju na varijablu $address_site, ovdje sam naznačio naziv moje test stranice na kojoj ću raditi. Molimo Vas da u skladu s tim naznačite naziv Vaše stranice.

Struktura sajta

Pogledajmo sada HTML strukturu našeg sajta.

Premjestit ćemo zaglavlje i podnožje stranice u zasebne datoteke, header.php I footer.php. Uključićemo ih na sve stranice. Naime na glavnoj stranici (fil index.php), na stranicu sa formularom za registraciju (fil form_register.php) i na stranicu sa formularom za autorizaciju (fil form_auth.php).

Blokirajte našim linkovima, registracija I autorizacija, dodajte ih u zaglavlje stranice tako da se prikazuju na svim stranicama. Jedan link će ući na stranicu sa formularom za registraciju (fil form_register.php), a drugi na stranicu sa formularom za autorizaciju (fil form_auth.php).

Sadržaj datoteke header.php:

Naziv naše stranice

Kao rezultat, naša glavna stranica izgleda ovako:


Naravno, vaša stranica može imati potpuno drugačiju strukturu, ali to nam sada nije važno. Glavna stvar je da postoje veze (dugmad) za registraciju i autorizaciju.

Sada idemo na formular za registraciju. Kao što ste već shvatili, imamo to u dosijeu form_register.php.

Idite na bazu podataka (u phpMyAdmin), otvorite strukturu tabele korisnika i pogledajte koja polja su nam potrebna. To znači da su nam potrebna polja za unos imena i prezimena, polje za unos poštanske adrese (Email) i polje za unos lozinke. A iz sigurnosnih razloga, dodaćemo polje za unos captcha.

Na serveru, kao rezultat obrade obrasca za registraciju, mogu doći do raznih grešaka zbog kojih se korisnik neće moći registrovati. Stoga, kako bi korisnik razumio zašto registracija nije uspjela, potrebno je prikazati poruke o ovim greškama.

Prije prikaza obrasca, dodajte blok za prikaz poruka o grešci iz sesije.

I još nešto, ako je korisnik već autorizovan, pa iz radoznalosti ide direktno na stranicu za registraciju pisanjem u adresnoj traci pretraživača site_address/form_register.php, tada ćemo u ovom slučaju, umjesto obrasca za registraciju, prikazati zaglavlje da je već registriran.

Općenito, kod datoteke form_register.php imamo ovo:

Već ste registrovani

U pretraživaču stranica sa formularom za registraciju izgleda ovako:


Koristeći obavezni atribut, sva polja smo učinili obaveznim.

Obratite pažnju na kod obrasca za registraciju na kojem se prikazuje captcha:


Naveli smo putanju do datoteke u vrijednosti atributa src za sliku captcha.php, koji generiše ovu captcha.

Pogledajmo kod fajla captcha.php:

Kod je dobro komentarisan, pa ću se fokusirati samo na jednu tačku.

Unutar funkcije imageTtfText(), put do fonta je specificiran verdana.ttf. Dakle, da bi captcha radila ispravno, moramo kreirati folder fontove, i tamo postavite datoteku fonta verdana.ttf. Možete ga pronaći i preuzeti s Interneta ili preuzeti iz arhive s materijalima ovog članka.

Završili smo sa HTML strukturom, vrijeme je da krenemo dalje.

Provjera valjanosti e-pošte pomoću jQueryja

Bilo koji obrazac treba provjeriti ispravnost unesenih podataka, kako na strani klijenta (koristeći JavaScript, jQuery) tako i na strani servera.

Posebnu pažnju moramo obratiti na polje Email. Veoma je važno da unesena poštanska adresa bude važeća.

Za ovo polje za unos postavljamo tip e-pošte (type="email"), što nas malo upozorava na neispravne formate. Ali to nije dovoljno, jer preko kodnog inspektora koji nam pruža pretraživač možemo lako promijeniti vrijednost atributa tip With email on tekst, i to je to, naš ček više neće važiti.


I u ovom slučaju, moramo izvršiti pouzdaniju provjeru. Da bismo to uradili, koristićemo jQuery biblioteku iz JavaScript-a.

Da biste povezali jQuery biblioteku, u datoteci header.php između oznaka , prije završne oznake , dodajte ovaj red:

Odmah nakon ovog reda, dodaćemo kod za validaciju e-pošte. Ovdje ćemo dodati kod za provjeru dužine unesene lozinke. Njegova dužina mora biti najmanje 6 znakova.

Koristeći ovu skriptu, provjeravamo ispravnost unesene adrese e-pošte. Ako je korisnik unio pogrešnu e-poštu, prikazujemo poruku o grešci o tome i onemogućujemo dugme za slanje obrasca. Ako je sve u redu, uklanjamo grešku i aktiviramo dugme za slanje obrasca.

I tako, završili smo sa validacijom obrasca na strani klijenta. Sada ga možemo poslati na server, gdje ćemo također napraviti par provjera i dodati podatke u bazu podataka.

Registracija korisnika

Obrazac šaljemo u fajl na obradu register.php, putem POST metode. Ime ove datoteke rukovanja je navedeno u vrijednosti atributa akcija. A metoda slanja je navedena u vrijednosti atributa metoda.

Otvorite ovaj fajl register.php i prva stvar koju treba da uradimo je da napišemo funkciju pokretanja sesije i povežemo datoteku koju smo ranije kreirali dbconnect.php(U ovom fajlu smo uspostavili vezu sa bazom podataka). Takođe, hajde da odmah proglasimo ćelije error_messages I uspjeh_poruke u globalnom nizu sesija. IN error_mesages zabilježit ćemo sve poruke o greškama koje se javljaju tokom obrade obrasca i u succes_messages, snimaćemo radosne poruke.

Prije nego što nastavimo, moramo provjeriti da li je obrazac uopće dostavljen. Napadač može pogledati vrijednost atributa akcija iz obrasca i saznajte koja datoteka obrađuje ovaj obrazac. I možda ima ideju da ide direktno na ovu datoteku tako što će upisati sljedeću adresu u adresnu traku pretraživača: http://site_address/register.php

Dakle, moramo provjeriti da li postoji ćelija u globalnom POST nizu čije ime odgovara imenu našeg dugmeta "Registriraj se" iz obrasca. Na ovaj način provjeravamo da li je kliknuto na dugme "Registracija" ili ne.

Ako napadač pokuša da ode direktno na ovu datoteku, dobiće poruku o grešci. Dozvolite mi da vas podsjetim da varijabla $address_site sadrži naziv stranice i ona je deklarirana u datoteci dbconnect.php.

Captcha vrijednost u sesiji je dodana kada je generirana, u datoteci captcha.php. Podsjećamo, pokazaću vam ponovo ovaj dio koda iz datoteke captcha.php, gdje se captcha vrijednost dodaje sesiji:

Sada idemo na samu verifikaciju. U fajlu register.php, unutar if bloka, gdje provjeravamo da li je kliknuto na dugme "Registriraj se", odnosno gdje je naznačen komentar "" // (1) Prostor za sljedeći dio koda"mi pišemo:

//Provjera primljene captcha //Skratite razmake od početka i kraja reda $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Uporedi primljenu vrijednost sa vrijednošću iz sesije. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Ako captcha nije ispravna, vraćamo korisnika na stranicu za registraciju i tamo ćemo mu prikazati poruku o grešci da je unio pogrešan captcha $error_message = "

Greška! Uneli ste pogrešan captcha

"; // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] = $error_message; // Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 trajno premješten"); header("Lokacija: " .$address_site ."/form_register.php"); //Zaustavi skriptu exit(); ) // (2) Mjesto za sljedeći dio koda )else( //Ako captcha nije proslijeđena ili je prazan izlaz ("

Greška! Ne postoji verifikacioni kod, odnosno captcha kod. Možete otići na glavnu stranicu.

"); }

Zatim moramo obraditi primljene podatke iz POST niza. Prije svega, trebamo provjeriti sadržaj globalnog POST niza, odnosno da li tamo postoje ćelije čija imena odgovaraju nazivima polja za unos iz našeg obrasca.

Ako ćelija postoji, tada skraćujemo razmake od početka i kraja reda iz ove ćelije, u suprotnom preusmjeravamo korisnika nazad na stranicu s obrascem za registraciju.

Zatim, nakon što smo skratili razmake, dodamo red u varijablu i provjeravamo da li je ova varijabla prazna; ako nije prazna, idemo dalje, u suprotnom preusmjeravamo korisnika nazad na stranicu sa registracionom formom.

Zalijepite ovaj kod na navedenu lokaciju" // (2) Prostor za sljedeći dio koda".

/* Provjerite da li postoje podaci poslani iz obrasca u globalnom nizu $_POST i umotajte poslane podatke u regularne varijable.*/ if(isset($_POST["first_name"]))( //Skratite razmake od početka i kraj niza $first_name = trim($_POST["first_name"]); //Provjerite da li je varijabla praznina if(!empty($first_name))( // Radi sigurnosti, pretvorite posebne znakove u HTML entitete $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Unesite svoje ime

Polje za naziv nedostaje

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) if( isset($_POST["last_name"]))( //Skrati razmake od početka i kraja reda $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // Radi sigurnosti, pretvorite posebne znakove u HTML entitete $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Molimo unesite svoje prezime

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) )else ( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Polje za prezime nedostaje

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) if( isset($_POST["email"]))( //Skrati razmake od početka i kraja reda $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Lokacija koda za provjeru formata adrese e-pošte i njene jedinstvenosti )else( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .="

Unesite svoju e-poštu

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) )else ( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) if( isset($_POST["password"]))( //Skratite razmake od početka i kraja niza $password = trim($_POST["password"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Šifriranje lozinke $password = md5($password."top_secret"); )else( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .="

Unesite svoju lozinku

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) )else ( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) // (4) Mjesto za kod za dodavanje korisnika u bazu podataka

Od posebnog značaja je teren email. Moramo provjeriti format primljene poštanske adrese i njenu jedinstvenost u bazi podataka. Odnosno, postoji li neki korisnik sa istom adresom e-pošte već registrovan?

Na navedenoj lokaciji" // (3) Lokacija koda za provjeru formata poštanske adrese i njene jedinstvenosti" dodajte sljedeći kod:

//Provjerite format primljene email adrese koristeći regularni izraz $reg_email = "/^**@(+(*+)*\.)++/i"; //Ako format primljene adrese e-pošte ne odgovara regularnom izrazu if(!preg_match($reg_email, $email))( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Uneli ste netačan email

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); ) // Provjeravamo da li je takva adresa već u bazi podataka. /Ako broj primljenih ima tačno jedan red, što znači da je korisnik sa ovom email adresom već registrovan if($result_query->num_rows == 1)( //Ako rezultirajući rezultat nije lažan if(($row = $result_query->fetch_assoc()) != false) ( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Korisnik sa ovom adresom e-pošte je već registrovan

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); )else( // Sačuvajte poruku o grešci na sesiju . $_SESSION["error_messages"] .= "

Greška u upitu baze podataka

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); ) /* zatvaranje odabira */ $ result_query-> close(); //Zaustavi skriptu exit(); ) /* zatvaranje odabira */ $result_query->close();

I tako, završili smo sa svim provjerama, vrijeme je da dodamo korisnika u bazu podataka. Na navedenoj lokaciji" // (4) Mjesto za kod za dodavanje korisnika u bazu podataka" dodajte sljedeći kod:

//Upit za dodavanje korisnika u bazu podataka $result_query_insert = $mysqli->query("INSERT INTO `users` (ime_ime, prezime, email, lozinka) VRIJEDNOSTI ("".$first_name."", "".$last_name ." ", ".$email.", ".$password."")"); if(!$result_query_insert)( // Sačuvajte poruku o grešci u sesiji. $_SESSION["error_messages"] .= "

Greška u zahtjevu za dodavanje korisnika u bazu podataka

"; //Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavite skriptu exit(); )else( $_SESSION["success_messages"] = "

Registracija uspješno obavljena!!!
Sada se možete prijaviti koristeći svoje korisničko ime i lozinku.

"; //Pošaljite korisnika na stranicu za autorizaciju header("HTTP/1.1 301 Trajno premješten"); header("Lokacija: ".$address_site."/form_auth.php"); ) /* Dovršavanje zahtjeva */ $ result_query_insert-> close(); //Zatvaranje veze sa bazom podataka $mysqli->close();

Ako je došlo do greške u zahtjevu za dodavanje korisnika u bazu podataka, sesiji dodajemo poruku o ovoj grešci i vraćamo korisnika na stranicu za registraciju.

Inače, ako je sve prošlo kako treba, dodajemo i poruku sesiji, ali ovaj put je ugodnije, odnosno javljamo korisniku da je registracija uspjela. I mi ga preusmjeravamo na stranicu sa formularom za autorizaciju.

Skripta za provjeru formata adrese e-pošte i dužine lozinke je u datoteci header.php, tako da će se primjenjivati ​​i na polja iz ovog obrasca.

Sesija je također pokrenuta u datoteci header.php, dakle u fajlu form_auth.php Nema potrebe za pokretanjem sesije, jer ćemo dobiti grešku.


Kao što sam već rekao, ovdje radi i skripta za provjeru formata adrese e-pošte i dužine lozinke. Stoga, ako korisnik unese pogrešnu adresu e-pošte ili kratku lozinku, odmah će dobiti poruku o grešci. Dugme ućiće postati neaktivan.

Nakon ispravljanja grešaka, dugme ući postaje aktivan, a korisnik će moći poslati obrazac na server, gdje će biti obrađen.

Autorizacija korisnika

Pripisati vrijednost akcija hendikep autorizacije ima specificiran fajl auth.php, to znači da će obrazac biti obrađen u ovoj datoteci.

I tako, otvorite datoteku auth.php i napisati kod za obradu formulara za autorizaciju. Prva stvar koju trebate učiniti je pokrenuti sesiju i povezati datoteku dbconnect.php za povezivanje sa bazom podataka.

Kada kliknete na izlaznu vezu sa sajta, bićemo odvedeni u fajl logout.php, gdje jednostavno uništavamo ćelije sa email adresom i lozinkom iz sesije. Nakon toga vraćamo korisnika nazad na stranicu na kojoj je kliknut na link Izlaz.

Šifra datoteke logout.php:

To je sve. Sada znate kako implementirati i obraditi obrasce za registraciju i autorizaciju korisnika na vašoj web stranici. Ovi obrasci se nalaze na gotovo svakoj web stranici, tako da bi svaki programer trebao znati kako ih napraviti.

Takođe smo naučili kako da validiramo ulazne podatke, kako na strani klijenta (u pretraživaču, koristeći JavaScript, jQuery) tako i na strani servera (koristeći PHP). Naučili smo i kako implementirati proceduru za napuštanje stranice.

Sve skripte su testirane i rade. Arhivu sa fajlovima ovog malog sajta možete preuzeti sa ovog linka.

U budućnosti ću napisati članak u kojem ću opisati. I također planiram napisati članak gdje ću objasniti (bez ponovnog učitavanja stranice). Dakle, kako biste bili informisani o objavljivanju novih članaka, možete se pretplatiti na moju web stranicu.

Ako imate bilo kakvih pitanja, kontaktirajte me, a ako primijetite bilo kakvu grešku u članku, javite mi.

Plan lekcije (5. dio):

  • Kreiranje HTML strukture za formular za autorizaciju
  • Primljene podatke obrađujemo
  • U zaglavlju stranice prikazujemo pozdrav korisnika
  • Da li vam se dopao članak?

    Ne znam zašto... ne, znam zašto ne možete omogućiti register_globals direktivu, ali ne znam zašto se u literaturi po pravilu ništa ne govori o tome.

    U ovom članku pokušaću da izvučem sve one koji sjede u njemu iz tenka i objasnim šta je što (posebno za one u oklopnom vozu – prim. urednika). Nije uzalud što neki hosteri onemogućuju ovu direktivu. Dakle…

    Kako radi

    U PHP postavkama (php.ini fajl) postoji takva register_globals direktiva. Njegovo značenje je da ako je omogućeno (register_globals = on), onda će sve varijable proslijeđene putem GET-a i POST-a biti automatski registrirane kao globalne. Šta to znači?

    Na primjer, prosljeđujemo metodu GET skripti index.php neku vrijednost stranice: index.php?page=2. Proslijeđena vrijednost je pohranjena u GET nizu i može se koristiti u skripti kao $_GET["stranica"]. Međutim, ako imamo omogućen register_globals, tada će se kreirati varijabla $page za proslijeđenu vrijednost, koja je dostupna u bilo kojem dijelu skripte index.php.

    Mali rezime i dodatak. Kada je register_globals omogućen, kreiraju se tri kopije varijable: u GET nizu, u GLOBALS nizu i jednostavno sama varijabla ($_GET["page"], $GLOBALS["page"], $page), dok kada je register_globals onemogućen, proslijeđena vrijednost može biti dostupna samo kroz GET niz ($_GET["stranica"]). Zapamti.

    Opasnost od upotrebe

    Pogledajmo jednostavan primjer da shvatimo šta nas čeka (od 3 do 5 godina - napomena urednika). Da bi bilo lakše, odmah ću reći da su $login i $password varijable koje se prosljeđuju metodom GET/POST.

    Ukratko o tome šta skripta radi:

      Red 2. Zahtijevamo bazu podataka kako bismo izvukli pravu lozinku za prijavu koju je unio korisnik.

      Red 3. Dobijamo ovu lozinku i dodjeljujemo je varijabli $real_pass.

      Red 4. Upoređujemo pravu i unesenu lozinku i ako se poklapaju, varijabli $check će biti dodijeljeno true.

      Linije 5-8. Ako je $check istinito, onda pišemo da je autorizacija uspješna, itd.

    Predloženi scenario je, po definiciji, najpropusniji na svijetu, a sada ću vam pokazati ove rupe. Uvjet: register_globals je omogućen.

    Recimo da se prijenos vrši metodom GET. Tada će url izgledati otprilike ovako:
    www.site.com/index.php?login =admin&password =qwerty
    Jasno je da se globalne varijable $login i $password odmah kreiraju. Sada pogledajte scenario. Sadrži varijablu $check. Šta ako ga proslijedite putem URL-a?

    www.site.com/index.php?login =admin&password =qwerty&check =1
    Tada se provjera podudaranja lozinke zaobilazi i korisnik se odmah ovlašćuje (na kraju krajeva, sjećate li se da je 1 istina, a 0 lažno?). Isti rezultat će se dogoditi ako pišemo www.site.com/index.php?provjeriti =1 . Čak i ako koristite POST metodu, sve takve prevare će i dalje raditi, jer kada je register_globals omogućen, nije važno koju metodu koristite - GET ili POST.

    Mislim da neko ima pitanje, kako kreker zna za check varijablu, da je ona odgovorna za sve? Ako nikome niste pokazali scenario, malo je vjerovatno da će ga znati. Međutim, ne koriste svi svoje skripte, CMS itd., već koriste ono što je dostupno na mreži. U takvim slučajevima, kreker, na primjer, može proučiti CMS kod i napadati stranice kreirane uz njegovu pomoć.

    Međutim, ne deaktiviraju svi hosteri register_globals, pa čak i ako su vaše skripte dizajnirane da nemaju omogućen register_globals, kreker i dalje može hakovati vašu skriptu koristeći ranjivost ove direktive.

    Uzmimo naš primjer. Za zaštitu u slučaju da je register_globals omogućen, nakon reda ako ($lozinka==$pravi_pass) $provjeri =istinito; dodajte sljedeće: else$provjeri =false;. U ovom slučaju, čak i ako je varijabla provjere jednaka jedan proslijeđena metodom GET, skripta će i dalje postaviti $check=false ako je lozinka netačna.

    Da, također bih želio skrenuti vašu pažnju na činjenicu da ako isključite register_globals, onda naš primjer neće raditi. A da bi to funkcioniralo, trebate napisati $login = $_POST["login"]; $password = $_POST["lozinka"];

    Hajde da sumiramo...

    i izvući dva glavna zaključka:

    1) Kada je register_globals omogućen, možete proslijediti različite varijable čije vrijednosti nisu izračunate za primanje putem GET-a ili POST-a.

    2) Register_globals sam po sebi nije toliko opasan koliko krivo napisana skripta.

    To je sve za danas! Bit će mi jako drago vidjeti vaše komentare, primjedbe, sugestije i samo povratne informacije. Zato, pišite, ne stidite se!

    Uz želje za uspešnu nedelju,
    Alexander SHUYSKY