Izrada jednostavnog sustava registracije korisnika u PHP-u i MySQL-u. Register_globals=oN? U opasnosti ste! Bezlični indeksni php registar

💖 Sviđa li vam se? Podijelite vezu sa svojim prijateljima

Kako bi se posjetitelji stranice podijelili u određene skupine, na stranici mora biti instaliran mali sustav registracija u php. Na taj način posjetitelje uvjetno dijelite na dvije skupine jednostavno slučajnih posjetitelja i na povlašteniju skupinu korisnika kojima dajete vrjednije informacije.

U većini slučajeva koristi se pojednostavljeni sustav registracije, koji je napisan u php u jednoj datoteci registar.php.

Dakle, malo smo skrenuli, a sada ćemo pobliže pogledati registracijsku datoteku.

Register.php datoteku

Kako vam to ne bi oduzelo puno vremena, izradit ćemo sustav koji će prikupljati korisnike, prihvaćajući od njih minimalne podatke za kontakt. U ovom slučaju sve ćemo unijeti u mysql bazu. Za najveću brzinu baze kreirat ćemo tablicu korisnika u MyISAM formatu i utf-8 kodiranju.

Bilješka! Sve skripte uvijek moraju biti napisane u istom kodiranju. Sve datoteke stranice i MySql baza podataka moraju biti u istom kodiranju. Najčešća kodiranja su UTF-8 i Windows-1251.

Zašto morate sve napisati u jednom kodiranju, o čemu ćemo govoriti kasnije. Za sada uzmite ovu informaciju kao strogo pravilo za izradu skripti, inače ćete u budućnosti imati problema sa skriptama. U redu je, naravno, ali samo ćete izgubiti puno vremena tražeći pogreške u skripti.

Kako će sama skripta funkcionirati?

Želimo sve pojednostaviti i dobiti brze rezultate. Stoga ćemo od korisnika dobiti samo prijavu, e-mail i lozinku. A kako bismo se zaštitili od neželjenih robota, instalirat ćemo mali captcha. Inače će neki dečko iz Londona napisati malog robota parsera koji će u nekoliko minuta napuniti cijelu bazu podataka lažnim korisnicima i radovati se njegovoj genijalnosti i nekažnjivosti.

Evo samog scenarija. Sve je snimljeno u jednoj datoteci registar.php:

! `; // crveni upitnik $sha=$sh."scripts/pro/"; //put do glavne mape $bg=` bgcolor="#E1FFEB"`; // boja pozadine redaka?> Primjer registracijske skripte register.php style.css" />

U ovom slučaju, skripta se odnosi na sebe. A to je obrazac i obrađivač podataka unesenih u obrazac. Imajte na umu da je datoteka komprimirana kao zip arhiva i sadrži konfiguracijsku datoteku config.php, ispis korisničke baze podataka, datoteku koja sadrži pomoćne funkcije functions.php, stilsku datoteku style.css i samu datoteku register.php. Također postoji nekoliko datoteka koje su odgovorne za rad i generiranje captcha simbola.

Vjerojatno ste već čuli za register_globals direktiva a znaš što ona radi. Ako netko to ne zna, onda ćete o tome saznati iz ovog članka, međutim, glavni zadatak ovog članka je dokazati da register_globals direktiva Najbolje ga je uvijek držati isključenim iz sigurnosnih razloga.

Omogućuje registraciju varijabli dobivenih iz GET zahtjev. Recimo da postoji ovakav zahtjev: indeks.php?a=15. Tako se, naravno, stvara varijabla $_GET["a"] i promjenjiva a. Ovdje je kreiranje varijable a i dogodilo se kao rezultat omogućena direktiva register_globals.

Razgovarajmo sada o tome zašto ovu direktivu uvijek treba držati onemogućenom. Pretpostavimo da autorizirate korisnika i da ste napisali sljedeći kod:

if (($_POST["login"] == "Admin") && ($_POST["password"] == "123456")) $check_user = true;
if ($check_user) echo "Autorizacija je bila uspješna";
else echo "Pogreška autorizacije";
?>

Sada, ako se datoteka pozove, na primjer, auth.php, zatim mu pristupite na sljedeći način: auth.php?check_user=1, tada će se dobiti uspješna autorizacija, bez obzira na to koja su prijava i lozinka poslani i jesu li uopće poslani.

Naravno, ovaj primjer je malo mističan, jer nitko tako ne piše (makar zbog nedostatka inače $check_user = false;), međutim, ovaj primjer jasno pokazuje do čega može dovesti omogućena direktiva register_globals.

Sada o tome kako onemogući register_globals direktivu. Da biste to učinili, morate dodati u datoteku .htaccess samo jedan red:

Php_vrijednost register_globals 0

Postoji mala vjerojatnost da ako je direktiva prethodno bila uključena, onda se nešto može pokvariti, stoga pažljivo provjerite sve i uklonite sve greške koje su se pojavile, jer sigurnost se zaista isplati.

13,9 tisuća

Pozdrav dragi webmasteri, članak govori o tome zašto je opasno ostaviti uključenu opciju register_globals. Možda ste čuli da njegovo korištenje može dovesti do nesigurnog rada vašeg programa (skripte). Ali idemo shvatiti kako se ova opcija može koristiti u nezakonite svrhe i kako se zaštititi od toga.

Što je register_globals?
Ovo je opcija u php.ini, koja ukazuje na potrebu registracije varijabli primljenih metodom POST ili GET u globalno polje $GLOBALS.

Radi jasnoće, dat ću primjer s register_globals=on.
Postoji datoteka "index.php" sa sadržajem:

"; echo $GLOBALS["asd"]." - veza u globalnom nizu $GLOBALS
"; echo $_GET["asd"]." - $_GET["asd"]"; ?>

U adresnoj traci ćemo napisati: index.php?asd=123

Kao što vidimo, stvorene su 2 varijable: jedna lokalna (+ veza u $GLOBALS), druga u nizu $_GET. Mnogi ljudi uopće ne koriste polje $_GET, oni nastavljaju obrađivati ​​varijablu "$asd" nakon što je prime izvana.
Ali razmislimo o tome, zašto trebamo "zagaditi" niz $GLOBALS? Za to imamo posebne nizove koji pohranjuju podatke prenesene metodama GET ($_GET array) i POST ($_POST array).

Isti primjer, ali s register_globals=off:

Da. nije stvorena lokalna varijabla i moramo koristiti niz $_GET za manipulaciju "$asd".

Možda ste već promijenili mišljenje o register_globals.
Vjerojatno ćete morati prepisati neke stvari u svojim programima, ali isplati se.

A sada ću vam reći kako napadač može koristiti ovu opciju za svoje potrebe, tj. s register_globals=on
Krenut ću od jednostavnog prema složenom.

Često vidimo upozorenja:

Napomena: Nedefinirana varijabla: asd(naziv varijable) u ****

Što to znači? To znači da varijabla "$asd" nije eksplicitno definirana.
Na primjer, neki ljudi uživaju u ovome:

Oni. bez definiranja varijable, odmah je počinju koristiti. Gornji kôd u teoriji nije zastrašujući, ali razmislite o tome, što ako se baš ta varijabla “$asd” naknadno zapiše u datoteku? Na primjer, u adresnu traku napišemo sljedeće: “index.php?asd=LUSER+” i dobijemo: “LUSER 0123456789”. Pa, zar ne bi bilo lijepo vidjeti ovo? Nemoj misliti.

Pretpostavimo da pišemo sustav autentifikacije korisnika:

Donio sam očito nepropusni sustav, samo trebamo napisati “index.php?valid_user=1” u adresnu traku i dobit ćemo poruku “Hello, user”

Ovo se ne bi dogodilo da ovako napišemo:

Oni. Oni su sami definirali varijablu $valid_user kao FALSE u slučaju kvara.

Dat ću vam primjer s ubrizgavanjem sql-a:

U adresnu traku napišemo: “index.php?where=id=0+UNION+ALL+SELECT+login,+password,+null+FROM+admin+where+login=’admin’” dobivamo sql injekciju:

I haker dobiva vaše podatke za prijavu i lozinke :(

Kao što vidite, svi primjeri imaju sigurnosne rupe koje se mogu iskoristiti putem omogućenih register_globals.

S tim se možete nositi ako uvijek definirate varijablu bez obzira na uvjete. Ili upotrijebite enkapsulaciju varijabli u funkcijama, tj. Kada definirate funkciju, varijable unutar nje bit će privatne izvana, na primjer:

Sada, ako upišemo u adresnu traku: “index.php?where=123”
Dat će: "$gdje ne postoji"
Ali ovo pod uvjetom da varijablu $where ne postavite kao globalnu, tj. "globalno $gdje"

Mogu navesti još puno primjera, ali mislim da će vam ovi koje sam naveo biti dovoljni da ih razumijete.
Želim reći da će svi ovi problemi nestati u zaborav kada postavite opciju register_globals=off i ponovno isprobate sve gore navedene primjere.

To se može učiniti kao u php.ini, ali većina pružatelja usluga hostinga neće vam dopustiti da to učinite, pa ćete morati koristiti datoteku “.htaccess”

U ovom ćete članku naučiti kako izraditi obrazac za registraciju i autorizaciju koristeći HTML, JavaScript, PHP i MySql. Takvi se obrasci koriste na gotovo svim web stranicama, bez obzira na njihovu vrstu. Stvoreni su za forum, internetsku trgovinu, 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 lokalni poslužitelj i radi. Bez toga ništa neće uspjeti.

Izrada tablice u bazi podataka

Za provedbu registracije korisnika prije svega potrebna nam je baza podataka. Ako ga već imate, onda je super, u suprotnom, morate ga stvoriti. U članku sam detaljno objasnio kako to učiniti.

I tako, imamo bazu podataka (skraćeno DB), sada trebamo napraviti tablicu korisnika u koje ćemo dodavati naše registrirane korisnike.

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

Pa smo pomislili, zamislili koja bi polja naš obrazac imao i napravili tablicu korisnika sa ovim poljima:

  • iskaznica- Identifikator. Polje iskaznica Svaka tablica u bazi podataka bi ga trebala imati.
  • ime- Da sačuvam ime.
  • prezime- Da sačuvamo prezime.
  • elektronička pošta- Za spremanje poštanske adrese. Za prijavu ćemo koristiti e-mail, tako da ovo polje mora biti jedinstveno, odnosno imati UNIQUE indeks.
  • email_status- Polje za označavanje je li mail potvrđen ili ne. Ako je pošta potvrđena, tada će imati vrijednost 1, inače je vrijednost 0.
  • lozinka- Za spremanje lozinke.


Ako želite da vaš obrazac za registraciju ima još neka polja, možete ih dodati i ovdje.

To je to, naš stol korisnika spreman. Prijeđimo na sljedeću fazu.

Veza s bazom podataka

Napravili smo bazu podataka, sada se trebamo spojiti na nju. Spojit ćemo se pomoću PHP ekstenzije MySQLi.

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

Pogreška veze s DB-om. Opis pogreške: ".mysqli_connect_error()."

"; exit(); ) // Postavite kodiranje veze $mysqli->set_charset("utf8"); // Radi praktičnosti, ovdje dodajte varijablu koja će sadržavati naziv naše stranice $address_site = "http://testsite .lokalno" ; ?>

Ova datoteka dbconnect.php morat će se povezati s rukovateljima obrascima.

Obratite pažnju na varijablu $address_site, ovdje sam naveo naziv svoje testne stranice na kojoj ću raditi. U skladu s tim navedite naziv svoje stranice.

Struktura stranice

Sada pogledajmo HTML strukturu naše stranice.

Premjestit ćemo zaglavlje i podnožje stranice u zasebne datoteke, zaglavlje.php I podnožje.php. Uključit ćemo ih na sve stranice. Naime na glavnoj stranici (datoteka indeks.php), na stranicu s obrascem za registraciju (datoteka obrazac_registar.php) i na stranicu s obrascem za autorizaciju (datoteka obrazac_auth.php).

Blokiraj s našim vezama, registracija I ovlaštenje, dodajte ih u zaglavlje stranice tako da budu prikazani na svim stranicama. Jedna poveznica bit će unesena na stranica obrasca za registraciju(datoteka obrazac_registar.php), a drugi na stranicu sa obrazac ovlaštenja(datoteka obrazac_auth.php).

Sadržaj datoteke header.php:

Naziv naše stranice

Kao rezultat toga, 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 poveznice (gumbi) za registraciju i autorizaciju.

Sada prijeđimo na obrazac za registraciju. Kao što već razumijete, imamo to u dosjeu obrazac_registar.php.

Idite u bazu podataka (u phpMyAdmin), otvorite strukturu tablice korisnika i pogledajte koja nam polja trebaju. 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 ćemo dodati polje za unos captcha.

Na poslužitelju, kao rezultat obrade registracijske forme, mogu se pojaviti razne greške zbog kojih se korisnik neće moći registrirati. Stoga, da bi korisnik razumio zašto registracija ne uspijeva, potrebno je prikazati poruke o tim greškama.

Prije prikazivanja obrasca dodajte blok za prikaz poruka o pogreškama iz sesije.

I još nešto, ako je korisnik već autoriziran, a iz znatiželje ide izravno na stranicu za registraciju upisivanjem u adresnu traku preglednika adresa_mjesta/registar_obrazca.php, tada ćemo u ovom slučaju umjesto obrasca za registraciju prikazati zaglavlje da je on već registriran.

Općenito, kod datoteke obrazac_registar.php dobili smo ovo:

Već ste registrirani

U pregledniku stranica s obrascem za registraciju izgleda ovako:


Pomoću potreban atribut, učinili smo sva polja obaveznim.

Obratite pozornost na šifru obrasca za registraciju gdje prikazuje se captcha:


Naveli smo put do datoteke u vrijednosti atributa src za sliku captcha.php, koji generira ovaj captcha.

Pogledajmo kod datoteke captcha.php:

Kod je dobro komentiran, pa ću se fokusirati samo na jednu točku.

Unutar funkcije imageTtfText(), naveden je put do fonta verdana.ttf. Da bi captcha radila ispravno, moramo stvoriti mapu fontovi, 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 s HTML strukturom, vrijeme je da krenemo dalje.

Provjera valjanosti e-pošte pomoću jQueryja

Svaki obrazac treba provjeriti valjanost unesenih podataka, kako na strani klijenta (koristeći JavaScript, jQuery), tako i na strani poslužitelja.

Posebnu pozornost moramo obratiti na polje Email. Vrlo je važno da je upisana poštanska adresa važeća.

Za ovo polje za unos postavili smo vrstu e-pošte (type="email"), ovo nas malo upozorava na netočne formate. Ali to nije dovoljno, jer kroz inspektor koda koji nam preglednik nudi, možemo jednostavno promijeniti vrijednost atributa tip S elektronička pošta na tekst, i to je to, naš ček više neće vrijediti.


I u ovom slučaju, moramo napraviti pouzdaniju provjeru. Da bismo to učinili, koristit ćemo jQuery biblioteku iz JavaScripta.

Za povezivanje jQuery biblioteke, u datoteci zaglavlje.php između oznaka , prije završne oznake , dodajte ovaj redak:

Odmah nakon ovog retka dodat ćemo kod za potvrdu e-pošte. Ovdje ćemo dodati kod za provjeru duljine unesene lozinke. Njegova duljina mora biti najmanje 6 znakova.

Pomoću ove skripte provjeravamo ispravnost unesene adrese e-pošte. Ako je korisnik unio netočnu e-poštu, prikazujemo poruku o pogrešci o tome i onemogućujemo gumb za slanje obrasca. Ako je sve u redu, uklanjamo grešku i aktiviramo gumb za slanje obrasca.

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

Registracija korisnika

Obrazac šaljemo u datoteku na obradu registar.php, POST metodom. Naziv ove datoteke rukovatelja naveden je u vrijednosti atributa akcijski. A način slanja naveden je u vrijednosti atributa metoda.

Otvori ovu datoteku registar.php i prva stvar koju trebamo napraviti je napisati funkciju pokretanja sesije i povezati datoteku koju smo prethodno napravili dbconnect.php(U ovoj datoteci napravili smo vezu s bazom podataka). I također, odmah deklarirajmo ćelije poruke_pogreške I poruke_uspjeha u globalnom nizu sesija. U poruke_pogreške zabilježit ćemo sve poruke o pogreškama koje se pojave tijekom obrade obrazaca i u poruke_uspjeha, snimat ćemo radosne poruke.

Prije nego nastavimo, moramo provjeriti je li obrazac uopće predan?. Napadač može pogledati vrijednost atributa akcijski iz obrasca i saznajte koja datoteka obrađuje ovaj obrazac. Možda mu padne na pamet otići izravno na ovu datoteku upisivanjem sljedeće adrese u adresnu traku preglednika: http://adresa_mjesta/registracija.php

Stoga moramo provjeriti ćeliju u globalnom POST nizu čiji naziv odgovara nazivu našeg gumba "Registracija" iz obrasca. Na taj način provjeravamo je li kliknuto na gumb "Registracija" ili ne.

Ako napadač pokuša otići izravno na ovu datoteku, primit će poruku o pogrešci. Dopustite mi da vas podsjetim da varijabla $address_site sadrži naziv stranice i deklarirana je u datoteci dbconnect.php.

Greška! glavna stranica.

"); } ?>

Captcha vrijednost u sesiji dodana je kada je generirana, u datoteci captcha.php. Kao podsjetnik, ponovno ću vam pokazati ovaj dio koda iz datoteke captcha.php, gdje se captcha vrijednost dodaje sesiji:

Sada prijeđimo na samu provjeru. U datoteci registar.php, unutar if bloka, gdje provjeravamo je li kliknuto na gumb "Registracija", odnosno gdje je naznačen komentar " // (1) Prostor za sljedeći dio koda"pišemo:

//Provjeri primljeni captcha //Skrati razmake s početka i kraja retka $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Usporedite primljenu vrijednost s vrijednošću iz sesije. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Ako captcha nije točna, vraćamo korisnika na stranicu za registraciju i tamo ćemo mu prikazati poruku o pogrešci da je unio krivi captcha . $error_message = "

Greška! Unijeli ste krivi captcha

"; // Spremite poruku o pogrešci u sesiju. $_SESSION["error_messages"] = $error_message; // Vratite korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); 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 prazna izlaz ("

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

"); }

Zatim moramo obraditi primljene podatke iz POST polja. Prije svega trebamo provjeriti sadržaj globalnog POST niza, odnosno postoje li tamo ćelije čiji nazivi odgovaraju nazivima polja za unos iz naše forme.

Ako ćelija postoji, tada skraćujemo razmake s početka i kraja retka iz ove ćelije, u suprotnom, preusmjeravamo korisnika natrag na stranicu s formularom za registraciju.

Zatim, nakon što smo izrezali razmake, dodamo redak u varijablu i provjerimo je li varijabla prazna; ako nije prazna, onda idemo dalje, u suprotnom preusmjeravamo korisnika natrag na stranicu s formularom za registraciju.

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

/* Provjerite ima li podataka poslanih iz obrasca u globalnom nizu $_POST i zamotajte poslane podatke u regularne varijable.*/ if(isset($_POST["first_name"]))( //Skratite razmake od početka i kraj niza $first_name = trim($_POST["first_name"]); //Provjeri da li je varijabla prazna if(!empty($first_name))( // Radi sigurnosti, konvertiraj posebne znakove u HTML entitete $first_name = htmlspecialchars($first_name, ENT_QUOTES) )else( // Spremi poruku o pogrešci u sesiju. $_SESSION["error_messages"] .= "

Unesite svoje ime

Nedostaje polje za naziv

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavi izlaz skripte(); ) if( isset($_POST["last_name"]))( //Skrati razmake s početka i kraja retka $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( // Spremite poruku o pogrešci u sesiju. $_SESSION["error_messages"] .= "

Molimo unesite svoje prezime

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavi izlaz skripte(); ) )else ( // Spremi poruku pogreške u sesiju. $_SESSION["error_messages"] .= "

Nedostaje polje za prezime

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavi izlaz skripte(); ) if( isset($_POST["email"]))( //Skrati razmake s početka i kraja retka $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Lokacija koda za provjeru formata adrese e-pošte i njezine jedinstvenosti )else( // Spremite poruku o pogrešci u sesiju. $_SESSION["error_messages"] .= "

Unesi svoj email

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavi izlaz skripte(); ) )else ( // Spremi poruku pogreške u sesiju. $_SESSION["error_messages"] .= "

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavi izlaz skripte(); ) if( isset($_POST["password"]))( //Skrati razmake s početka i kraja niza $password = trim($_POST["password"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Kriptiraj lozinku $password = md5($password."top_secret"); )else( // Spremi poruku o pogrešci u sesiju. $_SESSION["error_messages"] .= "

Unesite svoju lozinku

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavi izlaz skripte(); ) )else ( // Spremi poruku pogreške u sesiju. $_SESSION["error_messages"] .= "

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavi izlaz skripte(); ) // (4) Mjesto za kod za dodavanje korisnika u bazu

Od posebnog značaja je polje elektronička pošta. Moramo provjeriti format primljene poštanske adrese i njezinu jedinstvenost u bazi podataka. Odnosno, postoji li već registrirani korisnik s istom adresom e-pošte?

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

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

Unijeli ste netočan email

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavi izlaz skripte(); ) // Provjeravamo je li takva adresa već u bazi podataka. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email.""); /Ako broj primljenih ima točno jedan red, što znači da je korisnik s ovom adresom e-pošte već registriran if($result_query->num_rows == 1)( //Ako rezultirajući rezultat nije lažan if(($row = $result_query->fetch_assoc()) != false) ( // Spremi poruku o pogrešci u sesiju. $_SESSION["error_messages"] .= "

Korisnik s ovom email adresom je već registriran

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); )else( // Spremi poruku o pogrešci na sesiju $_SESSION["error_messages"] .= ".

Pogreška u upitu baze podataka

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); ) /* zatvaranje odabira */ $ result_query-> close(); //Zaustavljanje skripte 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 $result_query_insert = $mysqli->query("INSERT INTO `users` (ime, prezime, email, lozinka) VRIJEDNOSTI ("".$first_name."", "".$last_name ." ", "".$email.", "".$lozinka."")"); if(!$result_query_insert)( // Spremite poruku pogreške u sesiju. $_SESSION["error_messages"] .= "

Pogreška u zahtjevu za dodavanje korisnika u bazu podataka

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavi izlaz skripte(); )else( $_SESSION["success_messages"] = "

Registracija uspješno završena!!!
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 Moved Permanently"); header("Lokacija: ".$address_site."/form_auth.php"); ) /* Dovršavanje zahtjeva */ $ result_query_insert-> close(); //Zatvori vezu s bazom podataka $mysqli->close();

Ako se dogodila pogreška u zahtjevu za dodavanje korisnika u bazu, dodajemo poruku o toj pogrešci u sesiju i vraćamo korisnika na stranicu za registraciju.

Inače, ako je sve prošlo u redu, sesiji dodajemo i poruku, ali ovaj put je ugodnije, naime kažemo korisniku da je registracija uspjela. I preusmjeravamo ga na stranicu s obrascem za autorizaciju.

Skripta za provjeru formata adrese e-pošte i duljine lozinke nalazi se u datoteci zaglavlje.php, pa će vrijediti i za polja iz ovog obrasca.

Sesija se također pokreće u datoteci zaglavlje.php, dakle u datoteci obrazac_auth.php Nema potrebe za pokretanjem sesije, jer ćemo dobiti grešku.


Kao što sam već rekao, ovdje radi i skripta za provjeru formata email adrese i duljine lozinke. Stoga, ako korisnik unese netočnu e-mail adresu ili kratku lozinku, odmah će dobiti poruku o pogrešci. Tipka ući postat će neaktivan.

Nakon ispravljanja grešaka, gumb ući postaje aktivan, a korisnik će obrazac moći poslati na poslužitelj gdje će se obraditi.

Autorizacija korisnika

Pripisati vrijednost akcijski hendikep autorizacije ima navedenu datoteku 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 autorizacijskog obrasca. Prvo što trebate učiniti je pokrenuti sesiju i povezati datoteku dbconnect.php za povezivanje s bazom podataka.

//Deklarirajte ćeliju za dodavanje pogrešaka koje se mogu pojaviti prilikom obrade obrasca. $_SESSION["error_messages"] = ""; //Deklarirajte ćeliju za dodavanje uspješnih poruka $_SESSION["success_messages"] = "";

/* Provjerite je li obrazac predan, odnosno je li kliknuto na gumb Prijava. Ako da, idemo dalje, ako ne, korisniku ćemo prikazati poruku o pogrešci koja pokazuje da je izravno pristupio ovoj stranici. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) Prostor za sljedeći dio koda )else( exit("

Greška! Ovoj stranici ste pristupili izravno, tako da nema podataka za obradu. Možete otići na glavnu stranicu.

"); }

//Provjerite primljeni captcha if(isset($_POST["captcha"]))( //Skratite razmake s početka i kraja retka $captcha = trim($_POST["captcha"]); if(! empty($captcha ))( //Usporedite primljenu vrijednost s vrijednošću iz sesije. if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != "")) ( // Ako captcha nije točna , vraćamo korisnika na stranicu za autorizaciju i tamo ćemo mu prikazati poruku o pogrešci da je unio krivi captcha. $error_message = "

Greška! Unijeli ste krivi captcha

"; // Spremite poruku o pogrešci u sesiju. $_SESSION["error_messages"] = $error_message; // Vratite korisnika na stranicu za autorizaciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: " .$address_site ."/form_auth.php"); //Zaustavi skriptu exit(); )else( $error_message = "

Greška! Polje za unos captcha ne smije biti prazno.

"; // Spremite poruku o pogrešci u sesiju. $_SESSION["error_messages"] = $error_message; // Vratite korisnika na stranicu za autorizaciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: " .$address_site ."/form_auth.php"); //Zaustavi skriptu exit(); //(2) Mjesto za obradu e-mail adrese //(3) Mjesto za obradu lozinke //(4) Mjesto za sastavljanje upita bazi podataka )else ( //Ako captcha nije proslijeđena exit("

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

"); }

Ako je korisnik ispravno unio verifikacijski kod, tada idemo dalje, u protivnom ga vraćamo na stranicu za autorizaciju.

Provjera poštanske adrese

//Skraćivanje razmaka s početka i kraja retka $email = trim($_POST["email"]); if(isset($_POST["email"]))( if(!empty($email))( $email = htmlspecialchars($email, ENT_QUOTES); //Provjerite format primljene adrese e-pošte koristeći regularni izraz $ reg_email = " /^**@(+(*+)*\.)++/i" //Ako format primljene adrese e-pošte ne odgovara regularnom izrazu if(!preg_match($reg_email, $email) ))( // Spremi u poruku o pogrešci sesije. $_SESSION["error_messages"] .= "

Unijeli ste netočan email

"; //Vrati korisnika na stranicu za autorizaciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavi skriptu exit(); ) )else ( // Spremi poruku pogreške u sesiju. $_SESSION["error_messages"] .= "

Polje za unos poštanske adrese (email) ne smije biti prazno.

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_register.php"); //Zaustavi izlaz skripte(); ) )else ( // Spremi poruku pogreške u sesiju. $_SESSION["error_messages"] .= "

Nedostaje polje za unos e-pošte

"; //Vrati korisnika na stranicu za autorizaciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavi skriptu exit(); ) // (3) Područje obrade lozinke

Ukoliko je korisnik unio e-mail adresu u pogrešnom formatu ili je vrijednost polja za e-mail adresu prazna, vraćamo ga na stranicu za autorizaciju gdje ispisujemo poruku o tome.

Provjera lozinke

Sljedeće polje za obradu je polje za lozinku. Na navedeno mjesto" //(3) Mjesto za obradu lozinke", pišemo:

If(isset($_POST["password"]))( //Skratite razmake s početka i kraja niza $password = trim($_POST["password"]); if(!empty($password))( $password = htmlspecialchars($password, ENT_QUOTES); //Šifrirajte lozinku $password = md5($password."top_secret"); else( //Spremite poruku o pogrešci u sesiju. $_SESSION["error_messages"] . = "

Unesite svoju lozinku

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavi izlaz skripte(); ) )else ( // Spremi poruku pogreške u sesiju. $_SESSION["error_messages"] .= "

Nedostaje polje za lozinku

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavi izlaz skripte(); )

Ovdje koristimo funkciju md5() za šifriranje primljene lozinke, jer su naše lozinke u bazi podataka u šifriranom obliku. Dodatna tajna riječ u enkripciji, u našem slučaju " strogo čuvana tajna" mora biti onaj koji je korišten prilikom registracije korisnika.

Sada trebate napraviti upit prema bazi podataka kako biste odabrali korisnika čija je adresa e-pošte jednaka primljenoj adresi e-pošte i čija je lozinka jednaka primljenoj lozinci.

//Upit u bazi podataka na temelju odabira korisnika. $result_query_select = $mysqli->query("SELECT * FROM `users` WHERE email = "".$email."" AND password = "".$password."""); if(!$result_query_select)( // Spremi poruku o pogrešci u sesiju. $_SESSION["error_messages"] .= "

Pogreška upita prilikom odabira korisnika iz baze podataka

"; //Vrati korisnika na stranicu za registraciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavi izlaz skripte(); )else( //Provjeriti nema li korisnika s takvim podacima u bazi, zatim prikazati poruku o grešci if($result_query_select->num_rows == 1)( // Ako uneseni podaci odgovaraju podacima iz baze, spremiti prijavu i lozinku za polje sesija $_SESSION["email"] = $password("HTTP/1.1 301 Moved Permanently" ); header("Lokacija: ".$address_site ."/index.php"); )else( // Spremi poruku o pogrešci u sesiju. $_SESSION["error_messages"] .= "

Netočna prijava i/ili lozinka

"; //Vrati korisnika na stranicu za autorizaciju header("HTTP/1.1 301 Moved Permanently"); header("Lokacija: ".$address_site."/form_auth.php"); //Zaustavi skriptu exit(); ) )

Izlaz sa stranice

I zadnja stvar koju implementiramo je postupak za napuštanje stranice. Trenutno u zaglavlju prikazujemo poveznice na stranicu za autorizaciju i stranicu za registraciju.

U zaglavlju stranice (datoteka zaglavlje.php), pomoću sesije provjeravamo je li korisnik već autoriziran. Ako nije, tada prikazujemo linkove za registraciju i autorizaciju, u suprotnom (ako je ovlašten), tada umjesto linkova za registraciju i autorizaciju prikazujemo link Izlaz.

Izmijenjeni dio koda iz datoteke zaglavlje.php:

Registracija

Izlaz

Kada kliknete na vezu za izlaz sa stranice, prelazimo na datoteku odjava.php, gdje jednostavno uništavamo ćelije s email adresom i lozinkom iz sesije. Nakon toga vraćamo korisnika natrag na stranicu na kojoj je link kliknut Izlaz.

Kod datoteke odjava.php:

To je sve. Sada znate kako implementirati i obraditi registracijske i autorizacijske obrasce korisnika na vašoj web stranici. Ovi se obrasci nalaze na gotovo svakoj web stranici, pa bi ih svaki programer trebao znati izraditi.

Također smo naučili kako validirati ulazne podatke, kako na strani klijenta (u pregledniku, koristeći JavaScript, jQuery) tako i na strani poslužitelja (pomoću PHP-a). I mi smo naučili provesti postupak za napuštanje stranice.

Sve skripte su testirane i rade. Arhivu s datotekama ove male stranice možete preuzeti na ovom linku.

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

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

Plan lekcije (5. dio):

  1. Izrada HTML strukture za autorizacijski obrazac
  2. Zaprimljene podatke obrađujemo
  3. Pozdrav korisnika prikazujemo u zaglavlju stranice

Svidio vam se č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 o tome u pravilu ništa ne govori.

U ovom članku pokušat ću sve one koji sjede u njemu izvući iz tenka i objasniti što je što (posebno za one u oklopnom vlaku - nap. urednika). Nije uzalud neki hosteri onemogućili ovu direktivu. Tako…

Kako radi

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

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

Mali sažetak 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 polje ($_GET["stranica"]). Zapamtiti.

Opasnost od uporabe

Pogledajmo jednostavan primjer da shvatimo što nas čeka (od 3 do 5 godina - napomena urednika). Kako bih olakšao, odmah ću reći da su $login i $password varijable koje se prosljeđuju metodom GET/POST.

Ukratko o tome što skripta radi:

    Redak 2. Podnosimo zahtjev bazi podataka kako bismo izvukli pravu lozinku za prijavu koju je unio korisnik.

    Redak 3. Dobivamo ovu lozinku i dodjeljujemo je varijabli $real_pass.

    Redak 4. Uspoređujemo pravu i unesenu lozinku i ako se poklapaju, varijabli $check bit će dodijeljena istina.

    Redci 5-8. Ako je $check istinito, tada pišemo da je autorizacija bila uspješna, itd.

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

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

www.site.com/index.php? prijaviti se=admin& lozinka=qwerty& ček=1
Tada se provjera podudaranja lozinke zaobilazi i korisnik se odmah autorizira (uostalom, sjećate li se da je 1 točno, a 0 netočno?). Isti će se rezultat dogoditi ako napišemo www.mjesto.com/indeks.php?ček =1 . Čak i ako koristite POST metodu, sve takve prijevare će i dalje funkcionirati, jer kada je register_globals omogućen, nije važno koju metodu koristite - GET ili POST.

Mislim da netko ima pitanje, kako kreker zna za varijablu provjere, da je odgovoran za sve? Ako niste nikome pokazali scenarij, malo je vjerojatno da će ga znati. No, ne koriste svi svoje skripte, CMS i sl., već koriste ono što je dostupno na mreži. U takvim slučajevima, kreker, na primjer, može proučavati CMS kod i napadati stranice stvorene uz njegovu pomoć.

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

Uzmimo naš primjer. Za zaštitu u slučaju da je register_globals omogućen, iza retka ako ($lozinka==$stvaran_prolaz)$provjeriti =pravi; dodajte sljedeće: inače$provjeriti =lažno;. 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 netočna.

Da, također bih vam želio skrenuti pozornost na činjenicu da ako isključite register_globals, naš primjer neće raditi. A da bi radilo, morate napisati $login = $_POST["login"]; $lozinka = $_POST["lozinka"];

Sažmimo...

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 ili POST.

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, prijedloge i samo povratne informacije. Stoga, pišite, ne sramite se!

Uz želje za uspješan tjedan,
Aleksandar SHUYSKY



reci prijateljima
Pročitajte također