De ce este periculos să activați parametrul PHP register_globals? Crearea unui sistem simplu de înregistrare a utilizatorilor în PHP și MySQL Impersonal index php register

Buna ziua! Acum vom încerca să implementăm cea mai simplă înregistrare pe site folosind PHP + MySQL. Pentru a face acest lucru, Apache trebuie să fie instalat pe computer. Principiul de funcționare al scenariului nostru este prezentat mai jos.

1. Să începem prin a crea un tabel de utilizatori în baza de date. Acesta va conține datele utilizatorului (login și parolă). Să mergem la phpmyadmin (dacă creați o bază de date pe computer http://localhost/phpmyadmin/). Creăm un tabel utilizatori, acesta va avea 3 câmpuri.

Îl creez în baza de date mysql, îl poți crea într-o altă bază de date. Apoi, setați valorile ca în figură:

2. Este necesară o conexiune la acest tabel. Să creăm un fișier bd.php. Conținutul său:

In cazul meu arata cam asa:

Salvați bd.php.
Grozav! Avem un tabel în baza de date și o conexiune la acesta. Acum puteți începe să creați o pagină pe care utilizatorii își vor lăsa datele.

3. Creați un fișier reg.php cu conținutul (toate comentariile în interior):



Înregistrare


Înregistrare


Autentificarea dvs.:




Parola Dvs:








4. Creați un fișier care va introduce date în baza de date și va salva utilizatorul. save_user.php (comentarii în interior):

5. Acum utilizatorii noștri se pot înregistra! Apoi, trebuie să creați o „ușă” pentru ca utilizatorii deja înregistrați să intre pe site. index.php (comentarii în interior):




pagina principala


pagina principala


Autentificarea dvs.:


Parola Dvs:






Inregistreaza-te



OK, totul sa terminat acum! Lecția poate fi plictisitoare, dar foarte utilă. Numai ideea de înregistrare este afișată aici, apoi o puteți îmbunătăți: adăugați securitate, design, câmpuri de date, încărcare avatare, deconectare din contul dvs. (pentru a face acest lucru, pur și simplu distruge variabilele din sesiune cu funcția unset) și curând. Noroc!

Am verificat totul, funcționează corect!

Reg.ru: domenii și găzduire

Cel mai mare registrator și furnizor de găzduire din Rusia.

Peste 2 milioane de nume de domenii în serviciu.

Promovare, corespondență de domeniu, soluții de afaceri.

Peste 700 de mii de clienți din întreaga lume și-au făcut deja alegerea.

* Treceți mouse-ul peste pentru a întrerupe derularea.

Inapoi inainte

Crearea unui sistem simplu de înregistrare a utilizatorilor în PHP și MySQL

Crearea unui sistem de înregistrare este multă muncă. Trebuie să scrieți un cod care validează adresele de e-mail, trimite un e-mail de confirmare a înregistrării și validează, de asemenea, alte câmpuri de formular și multe altele.

Și chiar și după ce vei scrie toate acestea, utilizatorii vor fi reticenți să se înregistreze, pentru că... acest lucru necesită un efort din partea lor.

În acest tutorial, vom crea un sistem de înregistrare foarte simplu care nu necesită și nu stochează parole deloc! Rezultatul va fi ușor de modificat și adăugat la un site PHP existent. Vrei să afli cum funcționează? Cititi mai jos.



Iată cum va funcționa sistemul nostru super simplu:

Vom combina formularul de autorizare și înregistrarea. Acest formular va avea un câmp pentru introducerea adresei de e-mail și un buton de înregistrare;
- La completarea câmpului cu o adresă de email, făcând clic pe butonul de înregistrare se va crea o înregistrare despre un utilizator nou, dar numai dacă adresa de email introdusă nu a fost găsită în baza de date.

După aceasta, se creează un set unic aleatoriu de caractere (token), care este trimis către e-mailul specificat de utilizator sub forma unui link care va fi relevant timp de 10 minute;
- Link-ul duce utilizatorul la site-ul nostru web. Sistemul determină prezența unui token și autorizează utilizatorul;

Avantajele acestei abordări:

Nu este necesară stocarea parolelor sau validarea câmpurilor;
- Nu este nevoie să vă recuperați parola, întrebările de securitate etc.;
- Din momentul în care un utilizator se înregistrează/se logează, poți fi întotdeauna sigur că acest utilizator se va afla în zona ta de acces (că adresa de e-mail este adevărată);
- Proces de înregistrare incredibil de simplu;

Defecte:

Securitatea contului de utilizator. Dacă cineva are acces la e-mailul utilizatorului, se poate conecta.
- E-mailul nu este sigur și poate fi interceptat. Rețineți că această întrebare este relevantă și în cazul în care parola a fost uitată și trebuie restaurată, sau în orice sistem de autorizare care nu utilizează HTTPS pentru transferul de date (login/parolă);
- În timp ce vă configurați corect serverul de e-mail, există șansa ca mesajele cu linkuri de autorizare să ajungă în spam;

Comparând avantajele și dezavantajele sistemului nostru, putem spune că sistemul are o utilizare ridicată (confort maxim pentru utilizatorul final) și, în același timp, are un indicator de securitate scăzut.

Așa că este sugerat să îl utilizați pentru înregistrări pe forumuri și servicii care nu funcționează cu informații importante.

Cum se utilizează acest sistem

În cazul în care trebuie doar să utilizați un sistem pentru a autoriza utilizatorii pe site-ul dvs. și nu doriți să distrugeți această lecție, iată ce trebuie să faceți:

Trebuie să descărcați sursele atașate lecției
- Găsiți fișierul tables.sql în arhivă. Importați-l în baza de date folosind opțiunea de import din phpMyAdmin. Mod alternativ: deschideți acest fișier printr-un editor de text, copiați interogarea SQL și executați-o;
- Deschide includes/main.php și completează setările pentru conectarea la baza ta (specificați utilizatorul și parola pentru conectarea la baza de date, precum și gazda și numele bazei de date). În același fișier, trebuie să specificați și e-mailul, care va fi folosit ca adresă inițială pentru mesajele trimise de sistem. Unele gazde blochează e-mailurile trimise, cu excepția cazului în care formularul conține o adresă de e-mail reală, care a fost creată din panoul de control al gazdei, deci furnizați o adresă reală;
- Încărcați toate fișierele și activele index.php, protected.php și include foldere prin FTP pe gazda dvs.;
- Adăugați codul de mai jos la fiecare pagină PHP în care doriți să afișați formularul de autentificare;

Require_once „includes/main.php”; $user = utilizator nou(); if(!$user->loggedIn())( redirect("index.php"); )
- Gata!

Pentru cei care sunt interesați de cum funcționează totul, citiți mai jos!

Primul pas este să scrieți codul HTM pentru formularul de autorizare. Acest cod se află în fișierul index.php. Acest fișier conține, de asemenea, cod PHP care gestionează datele formularului și alte funcții utile ale sistemului de conectare. Puteți afla mai multe despre acest lucru în secțiunea de mai jos dedicată revizuirii codului PHP.

index.php

Tutorial: Sistem de înregistrare super simplu cu PHP și MySQL Autentificare sau înregistrare

Introdu adresa ta de e-mail mai sus și vom trimite
tu un link de conectare.

Autentificare/Înregistrare

În secțiunea head (între etichete și etichete) am inclus stilurile principale (nu sunt tratate în acest tutorial, așa că le puteți vedea singur. Folder assets/css/style.css). Înainte de tag-ul de închidere am inclus biblioteca jQuery și fișierul script.js, pe care le vom scrie și analiza mai jos.


JavaScript

jQuery urmărește starea butonului „Înregistrare/Autentificare” folosind funcția e.preventDefault()și trimite cereri AJAX. În funcție de răspunsul serverului, acesta afișează unul sau altul mesaj și determină acțiuni suplimentare/

assets/js/script.js

$(function())( var form = $("#login-register"); form.on("trimite", function(e)( if(form.is(".loading, .loggedIn"))( return false ; ) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (e-mail: e-mail), funcția (m)( if(m.error)( form.addClass(„eroare”); messageHolder.text(m.message); ) else( form.removeClass(„eroare”).addClass(„loggedIn”); messageHolder . text(m.message); ) )); )); $(document).ajaxStart(function())( form.addClass(„încărcare”); )); $(document).ajaxComplete(function()) ( form. removeClass("încărcare"); )); ));

a fost adăugat în formular pentru a afișa starea curentă a cererii AJAX (acest lucru a fost posibil datorită metodelor ajaxStart()) Și ajaxComplete(), pe care îl puteți găsi spre sfârșitul fișierului).

Această clasă afișează un fișier GIF animat care se rotește (ca pentru a ne sugera că cererea este în curs de procesare) și acționează, de asemenea, ca un semnalizare pentru a împiedica trimiterea din nou a formularului (atunci când butonul de înregistrare a fost deja apăsat o dată). Clasa .loggedIn este un alt indicator - este setat atunci când e-mailul a fost trimis. Acest flag blochează imediat orice alte acțiuni cu formularul.

Schema bazei de date

Sistemul nostru de logare incredibil de simplu folosește 2 tabele MySQL (codul SQL se află în fișierul tables.sql). Primul stochează date despre conturile de utilizator. Al doilea stochează informații despre numărul de încercări de conectare.


Schema tabelului utilizator.

Sistemul nu folosește parole, așa cum se poate observa în diagramă. Pe ea puteți vedea coloana token cu token-uri adiacente coloanei token_validity. Tokenul este instalat de îndată ce utilizatorul se conectează la sistem și își setează e-mailul să trimită un mesaj (mai multe despre asta în blocul următor). Coloana token_validity setează timpul 10 minute mai târziu, după care jetonul nu mai este valabil.


Schemă de tabel care numără numărul de încercări de autorizare.

În ambele tabele, adresa IP este stocată în formă procesată, folosind funcția ip2long într-un câmp de tip întreg.

Acum putem scrie niște cod PHP. Principala funcționalitate a sistemului este atribuită clasei User.class.php, pe care o puteți vedea mai jos.

Această clasă utilizează în mod activ idorm (docs), aceste biblioteci sunt instrumentele minime necesare pentru lucrul cu bazele de date. Se ocupă de accesul la baza de date, generarea de token și validarea token-ului. Oferă o interfață simplă care facilitează conectarea unui sistem de înregistrare la site-ul dvs. dacă folosește PHP.

User.class.php

Class User( // Private ORM case private $orm; /** * Găsiți un utilizator după indicativ. Numai indicativele valide sunt acceptate pentru considerare. Jetonul este generat doar timp de 10 minute din momentul în care a fost creat * @param șir $token Acesta este cel pe care îl căutăm jetonul * @return User Returnează valoarea funcției User */ public static function findByToken($token)( // găsim jetonul în baza de date și asigurați-vă că este setată marca temporală corectă $result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) return new User($result); ) /** * Autorizați sau înregistrați un utilizator * @param șir $email. Adresa de e-mail a utilizatorului * @return User */ public static function loginOrRegister($email)( // Dacă un astfel de utilizator deja exists, returnează valoarea funcției User de la adresa de e-mail specificată stocată în baza de date if(User::exists($email))( return new User($email); ) // În caz contrar, creați un nou utilizator în baza de date și returnează valoarea funcției User::create din e-mailul specificat return User::create($email ); ) /** * Creați un utilizator nou și salvați în baza de date * @param șir $email. Adresa de e-mail a utilizatorului * @return User */ private static function create($email)( // Scrieți un utilizator nou și returnați rezultatul funcției User din aceste valori $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Verificați dacă un astfel de utilizator există în baza de date și returnați valoarea booleană a lui variabila * @param șir $email. Adresa de e-mail a utilizatorului * @return boolean */ funcția publică statică există($email)( // Există utilizatorul în baza de date? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Creați un nou obiect utilizator * @param instanță $param ORM , id, email sau 0 * @return User */ public function __construct($param = null) ( if($param instanceof ORM)( // verificarea ORM a trecut $this->orm = $param; ) else if(is_string($param))( // Verificarea e-mailului a trecut $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // valoarea variabilei $param este transmis la identificatorul de utilizator $id = $param; ) else if(isset($_SESSION["loginid"]))( // În caz contrar, vezi session $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Generați un nou token de autorizare SHA1, îl scrieți în baza de date și returnează valoarea acestuia * @return șir */ public function generateToken( )( // Generați un token pentru un utilizator autorizat și salvați-l în baza de date $token = sha1($this->email.time().rand(0, 1000000)); // Salvați jetonul în baza de date // Și marcați-l astfel încât să fie valabil doar pentru următoarele 10 minute $this->orm->set("token", $token); $this->orm->set_expr("validitate_token", "ADDTIME(ACUM(),"0:10")"); $this->orm->save(); returnează $token; ) /** * Autorizează utilizatorul * @return void */ public function login())( // Marcați utilizatorul ca autentificat $_SESSION["loginid"] = $this->orm->id; // Actualizați valoarea câmpului bazei de date last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Distrugeți sesiunea și deconectați utilizatorul * @return void */ public function logout ()( $_SESSION = array(); unset($_SESSION); ) /** * Verificați dacă utilizatorul este autentificat * @return boolean */ public function loggedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Verifică dacă utilizatorul este administrator * @return boolean */ public function isAdmin())( return $this->rank() = = "administrator"; ) /** * Găsiți tipul de utilizator, poate fi administrator sau obișnuit * @return șir */ public function rank())( dacă ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Metodă care vă permite să obțineți informațiile private ale utilizatorului ca * proprietăți ale obiectului User * @ param șir $key Numele proprietății care primește acces * @return mixed */ public function __get($key)( if(isset($this->orm->$key))( return $this->orm-> $key; ) returnează nul; ) )

Tokenurile sunt generate folosind algoritmul SHA1 și stocate în baza de date. Folosesc funcțiile de sincronizare ale MySQL pentru a seta o limită de timp de 10 minute pentru valabilitatea unui simbol.

Când un token este validat, îi spunem direct managerului că luăm în considerare doar token-urile care nu au expirat încă, stocate în coloana token_validity.

Vă rugăm să rețineți că folosesc metoda magică __obține docs la sfârșitul fișierului pentru a intercepta accesul la proprietățile obiectului User.

Datorită acestui fapt, devine posibilă accesarea informațiilor stocate în baza de date datorită proprietăților $user->email, $user->token etc. În următorul fragment de cod, vom analiza cum să folosim aceste clase ca exemplu .


Pagina protejată

Un alt fișier care stochează funcționalități utile și necesare este fișierul functions.php. Există mai multe așa-numite funcții de ajutor - asistente care vă permit să creați cod mai curat și mai lizibil în alte fișiere.

funcții.php

Funcția send_email($from, $to, $subject, $message)( // Ajutor care trimite email $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Tip conținut: text /plain; charset=utf-8" . "\r\n"; $headers .= "De la: ".$from . "\r\n"; returnează e-mail($to, $subject, $message, $headers ); ) function get_page_url())( // Determinați adresa URL a fișierului PHP $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"]; ) returnează $url; ) function rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Numărul de încercări de conectare în ultima oră la această adresă IP $ count_hour = ORM: :for_table("reg_login_tempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(ACUM(),"1:00 ")") ->count(); // Numărul de încercări de conectare în ultimele 10 minute la această adresă IP $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u ", ip2long($ ip))) ->where_raw("ts > SUBTIME(ACUM(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new Exception("Prea multe încercări de conectare!"); ) ) function rate_limit_tick($ip, $email)( // Creați o nouă înregistrare în tabel care contează numărul de încercări de conectare $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_tempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip) )); $login_tempt->save(); ) function redirect($url)( header("Locație: $url"); ieșire; )

Funcții rate_limitȘi rate_limit_tick monitorizează numărul de încercări de autorizare în perioada de timp scursă de la prima încercare. Încercarea de conectare este înregistrată în baza de date în coloana reg_login_attempt. Aceste funcții sunt apelate atunci când datele din formular sunt procesate și trimise, așa cum puteți vedea din următorul fragment de cod.

Codul de mai jos este preluat din fișierul index.php și se ocupă de trimiterea formularului. Acesta returnează un răspuns JSON, care, la rândul său, este procesat de jQuery în fișierul assets/js/script.js pe care l-am analizat mai devreme.

index.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Afișează un antet de antet JSON ("Content-type: application/json"); // Este această adresă de e-mail validă dacă (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Vă rugăm să introduceți un e-mail valid."); ) // Verificați. Este utilizatorul a permis să se autentifice, a depășit numărul de conexiuni permise? (fișierul functions.php pentru mai multe informații) rate_limit($_SERVER["REMOTE_ADDR"]); // Înregistrați această încercare de conectare rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["e-mail"]); // Trimiteți un e-mail utilizatorului $message = ""; $email = $_POST["e-mail"]; $subject = "Link-ul dvs. de conectare"; if(!User:: exists($email) )( $subject = „Vă mulțumim pentru înregistrare!”; $message = „Vă mulțumim pentru înregistrarea pe site-ul nostru!\n\n”; ) // Încercarea de a autoriza sau înregistra un utilizator $user = Utilizator ::loginOrRegister($_POST[ "email"]); $message.= "Vă puteți autentifica de la această adresă URL:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Legătura va expira automat după 10 minute."; $rezultat = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( throw new Exception("A apărut o eroare la trimiterea e-mailului. Vă rugăm să încercați din nou."); ) die(json_encode(array("message" => "Vă mulțumim! Am trimis un link) în căsuța dvs. de e-mail. Verificați și folderul de spam."))); ) ) catch(Excepție $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage()) ))); )

După autentificare/înregistrare cu succes, codul de mai sus va trimite utilizatorului un link de conectare. Jetonul devine disponibil deoarece este transmisă ca o variabilă în legătura generată prin metodă $_GET cu marker tkn

index.php

If(isset($_GET["tkn"]))( // Este acest token valid pentru autorizare? $user = User::findByToken($_GET["tkn"]); if($user)( // Da , este. Redirecționează către o pagină protejată $user->login(); redirect("protected.php"); ) // Nu, simbolul nu este valid. Redirecționează către o pagină cu un formular de autorizare/înregistrare redirect("index. php ");)

$user->login()

va crea variabilele necesare sesiunii, astfel incat utilizatorul, vizualizand paginile ulterioare ale site-ului, sa ramana autorizat in orice moment.

Procesarea funcției de ieșire din sistem este aranjată într-un mod similar.

index.php

If(isset($_GET["logout"]))( $user = utilizator nou(); if($user->loggedIn())( $user->logout(); ) redirect("index.php") ;)

La sfârșitul codului, am setat din nou o redirecționare către index.php, deci parametrul ?logout=1 transmis prin URL nu este necesar.

Fișierul nostru index.php necesită suplimentar. protecție - nu dorim ca persoanele care s-au autentificat în sistem să vadă din nou formularul de înregistrare. În aceste scopuri, folosim metoda $user->loggedIn().

index.php

$user = utilizator nou(); if($user->loggedIn())( redirect("protected.php"); )

În sfârșit, iată o bucată de cod care vă permite să protejați paginile site-ului dvs. și să îl faceți accesibil doar după autorizare.

protejat.php

// Pentru a proteja fiecare pagină de pe site-ul dvs., includeți un fișier main.php // și creați un nou obiect User. Asa este de usor! require_once "includes/main.php"; $user = utilizator nou(); if(!$user->loggedIn())( redirect("index.php"); )

După această verificare, puteți fi sigur că utilizatorul a fost autorizat cu succes. De asemenea, puteți accesa informațiile stocate în baza de date folosind proprietățile obiectului $utilizator. Pentru a afișa adresa de e-mail și starea utilizatorului, utilizați acest cod:

Echo „E-mailul tău: „.$user->email; echo "Rangul dvs.: ".$user->rank();

Metodă rang() este folosit aici deoarece baza de date stochează de obicei numere (0 pentru un utilizator obișnuit, 1 pentru un administrator) și trebuie să convertim aceste date în stările cărora le aparțin, ceea ce ne ajută această metodă.

Pentru a face un utilizator obișnuit administrator, pur și simplu editați intrarea utilizatorului prin phpMyAdmin (sau orice alt program care vă permite să gestionați baze de date). Starea de administrator nu oferă niciun privilegiu; în acest exemplu, pagina va afișa că sunteți administrator - și asta este tot.

Dar ce să faci cu asta este lăsat la discreția ta; poți scrie și compune singur cod care stabilește anumite privilegii și capacități pentru administratori.

Au fost efectuate!

Am terminat cu această formă incredibil de super cvasi simplă! Îl poți folosi în site-urile tale PHP, este destul de simplu. De asemenea, îl puteți modifica pentru dvs. și îl puteți face așa cum doriți.

Materialul a fost pregătit de Denis Malyshok special pentru site-ul web

P.S. Vrei să mergi mai departe în stăpânirea PHP și OOP? Acordați atenție lecțiilor premium despre diverse aspecte ale construirii site-ului web, inclusiv programarea în PHP, precum și un curs gratuit despre crearea propriului dvs. sistem CMS în PHP de la zero folosind OOP:

Ți-a plăcut materialul și vrei să-mi mulțumești?
Distribuie doar prietenilor și colegilor tăi!


Datorită faptului că foarte des apar întrebări despre variabilele globale și problemele asociate cu dezactivarea directivei register_globals, vom încerca să acoperim puțin acest subiect în acest articol.

Mai întâi, să definim ce sunt variabilele externe. Acestea sunt orice variabile care vin în program din exterior, adică. nu sunt definite în programul în sine. Pentru un script php, toate variabilele care sunt trecute prin linia browserului sau prin formular sunt externe.
Să vedem cum sunt create.

Dacă directiva register_globals = On este activată pe server (în php.ini), atunci la trecerea variabilelor printr-un formular sau printr-o linie de browser, în scriptul căruia îi sunt destinate aceste variabile, acestea vor fi create automat. Acestea. dacă aveți următoarele scrise în linia browserului dvs.: www.server.ru/index.php?var=1, atunci variabila $var cu o valoare egală cu 1 va fi creată automat în scriptul index.php.

cometariu

Această directivă este unul dintre cele mai controversate puncte din limbajul PHP. Pe de o parte, utilizarea sa poate duce într-adevăr la probleme reale cu protecția scripturilor PHP, dacă posibilele situații de eroare nu sunt luate în considerare în mod corespunzător, iar mulți dezvoltatori notează pe bună dreptate că scrierea scripturilor fără a utiliza variabile globale reduce vulnerabilitatea scripturilor la diferite tipuri de atacuri cu 90%. Pe de altă parte, în zorii PHP, mai mult de o mie de utilizatori aveau încredere în dezvoltatorii de limbi (până la PHP 4.3 această directivă a fost activată implicit), datorită cărora există în prezent milioane de scripturi care funcționează efectiv scrise folosind variabile globale (este demn de remarcat faptul că, în scopuri educaționale, uneori este complet util să scrieți scripturi folosind variabile globale, deoarece înlocuirea lor cu matrice superglobale afectează foarte mult lizibilitatea codului).

În prezent, majoritatea furnizorilor de gazdă au această directivă activată și probabil va rămâne activată pentru o lungă perioadă de timp, deoarece în caz contrar ar putea întrerupe continuitatea codului.

Când directiva register_globals este dezactivată, accesul la astfel de variabile este posibil în două moduri:

  • prin intermediul matricelor asociative HTTP_***_VARS (HTTP_POST_VARS etc.)
  • prin matrice superglobale ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES etc.)

Matricele superglobale sunt disponibile în orice domeniu. Dezvoltatorii PHP recomandă dezactivarea directivei register_globals pe server și lucrul cu variabile prin matrice superglobale. Această recomandare se datorează problemelor de securitate care ar putea apărea atunci când directiva register_globals este activată.

Deși până de curând, directiva register_globals a rămas activată pe site-urile de găzduire. Situația a început să se schimbe odată cu lansarea PHP 5, unde această directivă este dezactivată implicit și hosterii nu se grăbesc să o activeze (poate pe bună dreptate).

Deci, ce ar trebui să faceți exact pentru a obține variabile? Trebuie să le luați din matrice superglobale. De exemplu, pentru a trece variabilele prin linia browserului, utilizați matricea $_GET. Să presupunem că linia browserului spune www.server.ru/index.php?var=1. Apoi, pentru a obține variabila var în index.php, trebuie să scrieți:

$var=$_GET["var"];

Și, de exemplu, pentru a primi variabilele transferate dintr-un formular folosind metoda POST, în scriptul de gestionare a formularelor trebuie să scrieți:

$var=$_POST["var"];

În acest articol, veți învăța cum să creați un formular de înregistrare și autentificare folosind HTML, JavaScript, PHP și MySql. Astfel de formulare sunt folosite pe aproape fiecare site web, indiferent de tipul acestuia. Sunt create pentru un forum, un magazin online, rețele sociale (cum ar fi Facebook, Twitter, Odnoklassniki) și multe alte tipuri de site-uri.

Dacă aveți un site web pe computerul local, atunci sper că aveți deja un server local instalat și care rulează. Fără el, nimic nu va funcționa.

Crearea unui tabel în baza de date

Pentru a implementa înregistrarea utilizatorilor, în primul rând avem nevoie de o bază de date. Dacă îl aveți deja, atunci grozav, în caz contrar, trebuie să îl creați. În articol, explic în detaliu cum să faci asta.

Și așa, avem o bază de date (abreviată ca DB), acum trebuie să creăm un tabel utilizatoriiîn care vom adăuga utilizatorii noștri înregistrați.

Am explicat și cum se creează un tabel într-o bază de date în articol. Înainte de a crea un tabel, trebuie să stabilim ce câmpuri va conține. Aceste câmpuri vor corespunde câmpurilor din formularul de înregistrare.

Deci, ne-am gândit, ne-am imaginat ce câmpuri ar avea formularul nostru și am creat un tabel utilizatorii cu aceste câmpuri:

  • id- Identificator. Camp id Fiecare tabel din baza de date ar trebui să-l aibă.
  • Nume- Pentru a salva numele.
  • nume- Pentru a păstra numele de familie.
  • e-mail- Pentru a salva adresa poștală. Vom folosi e-mailul ca logare, deci acest câmp trebuie să fie unic, adică să aibă indexul UNIC.
  • email_status- Câmp pentru a indica dacă e-mailul este confirmat sau nu. Dacă e-mailul este confirmat, atunci acesta va avea valoarea 1, în caz contrar valoarea este 0.
  • parola- Pentru a salva parola.


Dacă doriți ca formularul de înregistrare să aibă alte câmpuri, le puteți adăuga și aici.

Asta e, masa noastră utilizatorii gata. Să trecem la următoarea etapă.

Conexiune la baza de date

Am creat baza de date, acum trebuie să ne conectăm la ea. Ne vom conecta folosind extensia PHP MySQLi.

În folderul site-ului nostru, creați un fișier cu numele dbconnect.php, și scrieți următorul script în el:

Acest fișier dbconnect.php va trebui conectat la manevrele de formulare.

Observați variabila $address_site, aici am indicat numele site-ului meu de testare la care voi lucra. Vă rugăm să indicați numele site-ului dvs. în consecință.

Structura site-ului

Acum să ne uităm la structura HTML a site-ului nostru.

Vom muta antetul și subsolul site-ului în fișiere separate, header.phpȘi footer.php. Le vom include pe toate paginile. Și anume pe pagina principală (fișier index.php), la pagina cu formularul de înregistrare (file form_register.php) și la pagina cu formularul de autorizare (dosar form_auth.php).

Blocați cu link-urile noastre, înregistrareȘi autorizare, adăugați-le în antetul site-ului, astfel încât să fie afișate pe toate paginile. Va intra un link către pagina cu formularul de înregistrare (fișier form_register.php) iar celălalt la pagina cu formularul de autorizare (dosar form_auth.php).

Conținutul fișierului header.php:

Numele site-ului nostru

Ca rezultat, pagina noastră principală arată astfel:


Desigur, site-ul dvs. poate avea o structură complet diferită, dar acest lucru nu este important pentru noi acum. Principalul lucru este că există link-uri (butoane) pentru înregistrare și autorizare.

Acum să trecem la formularul de înregistrare. După cum ați înțeles deja, îl avem în dosar form_register.php.

Accesați baza de date (în phpMyAdmin), deschideți structura tabelului utilizatoriiși uită-te la ce domenii avem nevoie. Aceasta înseamnă că avem nevoie de câmpuri pentru introducerea prenumelui și prenumelui, un câmp pentru introducerea adresei poștale (E-mail) și un câmp pentru introducerea parolei. Și din motive de securitate, vom adăuga un câmp pentru introducerea unui captcha.

Pe server, ca urmare a procesării formularului de înregistrare, pot apărea diverse erori din cauza cărora utilizatorul nu se va putea înregistra. Prin urmare, pentru ca utilizatorul să înțeleagă de ce înregistrarea eșuează, este necesar să afișeze mesaje despre aceste erori.

Înainte de a afișa formularul, adăugați un bloc pentru a afișa mesajele de eroare din sesiune.

Si inca ceva, daca utilizatorul este deja autorizat, si de curiozitate merge direct pe pagina de inregistrare scriind in bara de adrese a browserului adresa_site-ului/form_register.php, apoi în acest caz, în locul formularului de înregistrare, vom afișa un antet în care se menționează că este deja înregistrat.

În general, codul fișierului form_register.php ne descurcam:

Esti deja inregistrat

În browser, pagina cu formularul de înregistrare arată astfel:


Folosind atributul obligatoriu, am făcut toate câmpurile obligatorii.

Atenție la codul formularului de înregistrare unde este afișat captcha:


Am specificat calea către fișier în valoarea atributului src pentru imagine captcha.php, care generează acest captcha.

Să ne uităm la codul fișierului captcha.php:

Codul este bine comentat, așa că mă voi concentra doar pe un singur punct.

În interiorul unei funcții imagineTtfText(), este specificată calea către font verdana.ttf. Deci, pentru ca captcha să funcționeze corect, trebuie să creăm un folder fonturi, și plasați fișierul font acolo verdana.ttf. Îl puteți găsi și descărca de pe Internet, sau îl puteți lua din arhiva cu materialele acestui articol.

Am terminat cu structura HTML, este timpul să trecem mai departe.

Verificarea validității e-mailului folosind jQuery

Orice formular trebuie să verifice validitatea datelor introduse, atât pe partea clientului (folosind JavaScript, jQuery), cât și pe partea serverului.

Trebuie să acordăm o atenție deosebită câmpului E-mail. Este foarte important ca adresa poștală introdusă să fie validă.

Pentru acest câmp de introducere, setăm tipul de e-mail (type="email"), acest lucru ne avertizează ușor împotriva formatelor incorecte. Dar acest lucru nu este suficient, deoarece prin inspectorul de cod pe care ni-l pune la dispoziție browser-ul putem modifica cu ușurință valoarea atributului tip Cu e-mail pe text, și atât, cecul nostru nu va mai fi valabil.


Și în acest caz, trebuie să facem o verificare mai fiabilă. Pentru a face acest lucru, vom folosi biblioteca jQuery din JavaScript.

Pentru a conecta biblioteca jQuery, în fișier header.phpîntre etichete , înainte de eticheta de închidere , adăugați această linie:

Imediat după această linie, vom adăuga codul de validare a e-mailului. Aici vom adăuga un cod pentru a verifica lungimea parolei introduse. Lungimea sa trebuie să fie de cel puțin 6 caractere.

Utilizând acest script, verificăm valabilitatea adresei de e-mail introduse. Dacă utilizatorul a introdus un e-mail incorect, afișăm un mesaj de eroare în acest sens și dezactivăm butonul de trimitere a formularului. Dacă totul este în regulă, atunci eliminăm eroarea și activăm butonul de trimitere a formularului.

Și așa, am terminat cu validarea formularului din partea clientului. Acum îl putem trimite la server, unde vom face și câteva verificări și vom adăuga date în baza de date.

Înregistrare utilizator

Trimitem formularul la dosar pentru procesare înregistrare.php, prin metoda POST. Numele acestui fișier de gestionare este specificat în valoarea atributului acțiune. Și metoda de trimitere este specificată în valoarea atributului metodă.

Deschideți acest fișier înregistrare.phpși primul lucru pe care trebuie să-l facem este să scriem o funcție de lansare a sesiunii și să conectăm fișierul creat anterior dbconnect.php(În acest fișier am făcut o conexiune la baza de date). Și, de asemenea, să declarăm imediat celulele mesaje de eroareȘi mesaje_succesîn matricea globală de sesiuni. ÎN mesaje_eroare vom înregistra toate mesajele de eroare care apar în timpul procesării formularelor și în mesaje_succes, vom înregistra mesaje vesele.

Înainte de a continua, trebuie să verificăm dacă formularul a fost trimis. Un atacator poate privi valoarea atributului acțiune din formular și aflați ce fișier procesează acest formular. Și poate avea ideea să meargă direct la acest fișier introducând următoarea adresă în bara de adrese a browserului: http://adresa_site-ului/register.php

Deci, trebuie să verificăm o celulă în matricea globală POST al cărei nume se potrivește cu numele butonului nostru „Înregistrare” din formular. Astfel verificăm dacă butonul „Înregistrare” a fost apăsat sau nu.

Dacă un atacator încearcă să meargă direct la acest fișier, va primi un mesaj de eroare. Permiteți-mi să vă reamintesc că variabila $address_site conține numele site-ului și a fost declarată în fișier dbconnect.php.

Valoarea captcha din sesiune a fost adăugată atunci când a fost generată, în fișier captcha.php. Ca o reamintire, vă voi arăta din nou această bucată de cod din fișier captcha.php, unde valoarea captcha este adăugată la sesiune:

Acum să trecem la verificarea în sine. În dosar înregistrare.php, în interiorul blocului if, unde verificăm dacă a fost apăsat butonul „Înregistrare”, sau mai degrabă unde este indicat comentariul „” // (1) Spațiu pentru următoarea bucată de cod"noi scriem:

//Verificați captcha primită //Tăiați spațiile de la începutul și sfârșitul liniei $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Compară valoarea primită cu valoarea din sesiune. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Dacă captcha-ul nu este corect, atunci returnăm utilizatorul la pagina de înregistrare și acolo îi vom afișa un mesaj de eroare că a introdus captcha greșit . $error_message = "

Eroare! Ai introdus captcha greșit

"; // Salvați mesajul de eroare în sesiune. $_SESSION["error_messages"] = $error_message; // Reveniți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: " .$address_site ."/form_register.php"); //Opriți ieșirea din script(); ) // (2) Loc pentru următoarea bucată de cod )else( //Dacă captcha nu este trecut sau este ieșire gol ("

Eroare! Nu există un cod de verificare, adică un cod captcha. Puteți merge la pagina principală.

"); }

În continuare, trebuie să procesăm datele primite din matricea POST. În primul rând, trebuie să verificăm conținutul matricei globale POST, adică dacă există celule acolo ale căror nume corespund cu numele câmpurilor de intrare din formularul nostru.

Dacă celula există, atunci tăiem spațiile de la începutul și sfârșitul liniei din această celulă, în caz contrar, redirecționăm utilizatorul înapoi la pagina cu formularul de înregistrare.

În continuare, după ce am tăiat spațiile, adăugăm linia la variabilă și verificăm această variabilă dacă nu este goală; dacă nu este goală, trecem mai departe, altfel redirecționăm utilizatorul înapoi la pagina cu formularul de înregistrare.

Lipiți acest cod în locația specificată" // (2) Spațiu pentru următoarea bucată de cod".

/* Verificați dacă există date trimise din formular în matricea globală $_POST și includeți datele trimise în variabile obișnuite.*/ if(isset($_POST["first_name"]))( //Tăiați spațiile de la început și sfârșitul șirului $first_name = trim($_POST["first_name"]); //Verificați variabila pentru golire if(!empty($first_name))( // Pentru siguranță, convertiți caracterele speciale în entități HTML $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Introdu numele tau

Câmpul de nume lipsește

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) if( isset($_POST["last_name"]))( //Tăiați spațiile de la începutul și sfârșitul liniei $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // Pentru securitate , convertiți caracterele speciale în entități HTML $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Salvați mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Vă rugăm să introduceți numele dvs. de familie

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) )else ( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Câmpul numelui de familie lipsește

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) if( isset($_POST["email"]))( //Tăiați spațiile de la începutul și sfârșitul liniei $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Locația codului pentru verificarea formatului adresei de e-mail și a unicității acesteia )else( // Salvați mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Introduceți adresa dvs. de email

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) )else ( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) if( isset($_POST["parolă"]))( //Tăiați spațiile de la începutul și sfârșitul șirului $parolă = trim($_POST["parolă"]); if(!empty($parolă)) ( $parolă = htmlcaractere speciale ($parolă, ENT_QUOTES); //Criptați parola $parolă = md5($parolă."top_secret"); )else( // Salvați mesajul de eroare în sesiune. $_SESSION["messaje_de_eroare"] .= "

Introduceți parola

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) )else ( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) // (4) Locul pentru codul pentru adăugarea unui utilizator la baza de date

De o importanță deosebită este domeniul e-mail. Trebuie să verificăm formatul adresei poștale primite și unicitatea acesteia în baza de date. Adică există vreun utilizator cu aceeași adresă de e-mail deja înregistrat?

La locatia specificata" // (3) Locația codului pentru a verifica formatul adresei poștale și unicitatea acesteia" adăugați următorul cod:

//Verificați formatul adresei de e-mail primite folosind o expresie regulată $reg_email = "/^**@(+(*+)*\.)++/i"; //Dacă formatul adresei de e-mail primite nu se potrivește cu expresia regulată if(!preg_match($reg_email, $email))( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Ați introdus un e-mail incorect

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) // Verificăm dacă o astfel de adresă este deja în baza de date. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /Dacă numărul de primite există exact un rând, ceea ce înseamnă că utilizatorul cu această adresă de e-mail este deja înregistrat if($result_query->num_rows == 1)( //Dacă rezultatul rezultat nu este fals if(($row = $result_query->fetch_assoc()) != false) ( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Un utilizator cu această adresă de e-mail este deja înregistrat

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); )else( // Salvați mesajul de eroare la sesiune . $_SESSION["error_messages"] .= "

Eroare la interogarea bazei de date

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); ) /* închiderea selecției */ $ result_query-> close(); //Oprește scriptul exit(); ) /* închiderea selecției */ $result_query->close();

Și așa, am terminat cu toate verificările, este timpul să adăugăm utilizatorul la baza de date. La locatia specificata" // (4) Locul pentru codul pentru adăugarea unui utilizator la baza de date" adăugați următorul cod:

//Interogare pentru a adăuga un utilizator la baza de date $result_query_insert = $mysqli->query("INSERT INTO `users` (prenume, prenume, e-mail, parolă) VALUES ("".$prenume."", "".$nume ." ", "".$email.", "".$parolă."")"); if(!$result_query_insert)( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Eroare la solicitarea de adăugare a utilizatorului la baza de date

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); )else( $_SESSION["success_messages"] = "

Înregistrarea s-a încheiat cu succes!!!
Acum vă puteți autentifica folosind numele de utilizator și parola.

"; //Trimite utilizatorul la antetul paginii de autorizare ("HTTP/1.1 301 Mutat permanent"); header ("Locație: ".$address_site."/form_auth.php"); ) /* Completarea cererii */ $ result_query_insert-> close(); //Închide conexiunea la baza de date $mysqli->close();

Dacă a apărut o eroare în cererea de adăugare a unui utilizator la baza de date, adăugăm un mesaj despre această eroare în sesiune și returnăm utilizatorul la pagina de înregistrare.

În rest, dacă totul a mers bine, adăugăm și un mesaj la sesiune, dar de data aceasta este mai plăcut, și anume îi spunem utilizatorului că înregistrarea a avut succes. Și îl redirecționăm către pagina cu formularul de autorizare.

Scriptul pentru verificarea formatului adresei de e-mail și a lungimii parolei se află în fișier header.php, deci se va aplica și câmpurilor din acest formular.

Sesiunea este începută și în fișier header.php, deci în dosar form_auth.php Nu este nevoie să începem o sesiune, deoarece vom primi o eroare.


După cum am spus deja, aici funcționează și scriptul pentru verificarea formatului adresei de e-mail și a lungimii parolei. Prin urmare, dacă utilizatorul introduce o adresă de e-mail incorectă sau o parolă scurtă, va primi imediat un mesaj de eroare. Un buton a intra va deveni inactiv.

După remedierea erorilor, butonul a intra devine activ, iar utilizatorul va putea trimite formularul la server, unde va fi procesat.

Autorizarea utilizatorului

Pentru a atribui valoare acțiune handicapul de autorizare are un dosar specificat auth.php, aceasta înseamnă că formularul va fi procesat în acest fișier.

Și așa, deschideți fișierul auth.phpși scrieți codul pentru a procesa formularul de autorizare. Primul lucru pe care trebuie să-l faceți este să începeți o sesiune și să conectați fișierul dbconnect.php pentru a se conecta la baza de date.

Când faceți clic pe linkul de ieșire de pe site, suntem duși la un fișier logout.php, unde pur și simplu distrugem celulele cu adresa de e-mail și parola din sesiune. După aceasta, returnăm utilizatorul înapoi la pagina pe care a fost făcut clic pe link Ieșire.

Cod fișier logout.php:

Asta e tot. Acum știți cum să implementați și să procesați formularele de înregistrare și autorizare a utilizatorilor pe site-ul dvs. Aceste formulare se găsesc pe aproape fiecare site web, așa că fiecare programator ar trebui să știe cum să le creeze.

De asemenea, am învățat cum să validăm datele de intrare, atât pe partea client (în browser, folosind JavaScript, jQuery), cât și pe partea server (folosind PHP). De asemenea, am învățat cum să implementăm o procedură de părăsire a site-ului.

Toate scripturile au fost testate și funcționează. Puteți descărca arhiva cu fișierele acestui mic site de pe acest link.

Pe viitor voi scrie un articol unde voi descrie. Și mai am de gând să scriu un articol în care să explic (fără a reîncărca pagina). Deci, pentru a fi la curent cu lansarea de noi articole, vă puteți abona la site-ul meu.

Dacă aveți întrebări, vă rugăm să mă contactați, iar dacă observați vreo eroare în articol, vă rog să-mi spuneți.

Planul de lecție (Partea 5):

  • Crearea unei structuri HTML pentru formularul de autorizare
  • Prelucrăm datele primite
  • Afișăm salutul utilizatorului în antetul site-ului
  • Ți-a plăcut articolul?

    Nu știu de ce... nu, știu de ce nu poți activa directiva register_globals, dar nu știu de ce în literatură, de regulă, nu se spune nimic despre asta.

    În acest articol, voi încerca să îi scot pe toți cei care stau în el din rezervor și să explic ce este (mai ales pentru cei din trenul blindat - nota editorului). Nu degeaba unii hosteri dezactivează această directivă. Asa de…

    Cum functioneaza

    În setările PHP (fișierul php.ini) există o astfel de directivă register_globals. Înțelesul său este că, dacă este activat (register_globals = on), atunci toate variabilele transmise prin GET și POST vor fi înregistrate automat ca globale. Ce înseamnă?

    De exemplu, trecem metoda GET scriptului index.php o anumită valoare a paginii: index.php?page=2. Valoarea transmisă este stocată într-o matrice GET și poate fi folosită într-un script ca $_GET[„pagina”]. Cu toate acestea, dacă avem register_globals activat, atunci o variabilă $page va fi creată pentru valoarea transmisă, care este disponibilă în orice parte a scriptului index.php.

    Un mic rezumat și completare. Când register_globals este activat, sunt create trei copii ale variabilei: în matricea GET, în matricea GLOBALS și pur și simplu variabila în sine ($_GET["pagina"], $GLOBALS["pagina"], $pagina), în timp ce când register_globals este dezactivat, valoarea transmisă poate fi accesibilă numai prin intermediul matricei GET ($_GET["page"]). Tine minte.

    Pericol de utilizare

    Să ne uităm la un exemplu simplu pentru a înțelege ce ne rezervă (de la 3 la 5 ani - nota editorului). Pentru a fi mai ușor, voi spune imediat că $login și $password sunt variabile transmise prin metoda GET/POST.

    Pe scurt despre ceea ce face scenariul:

      Linia 2. Facem o solicitare la baza de date pentru a scoate parola reala pentru login introdusa de utilizator.

      Linia 3. Obținem această parolă și o atribuim variabilei $real_pass.

      Linia 4. Comparăm parola reală și parola introdusă și dacă se potrivesc, variabila $check va fi atribuită adevărată.

      Rândurile 5-8. Dacă $check este adevărat, atunci scriem că autorizarea a avut succes etc.

    Scenariul propus, prin definiție, este cel mai scurs din lume, iar acum vă voi arăta aceste găuri. Condiție: register_globals este activat.

    Să presupunem că transferul se efectuează folosind metoda GET. Apoi URL-ul va arăta cam așa:
    www.site.com/index.php?login =admin&parolă =qwerty
    Este clar că variabilele globale $login și $parolă sunt create imediat. Acum uită-te la scenariu. Conține variabila $check. Ce se întâmplă dacă îl transmiteți prin URL?

    www.site.com/index.php?login =admin&parolă =qwerty&check =1
    Apoi verificarea potrivirii parolei este ocolită și utilizatorul este imediat autorizat (la urma urmei, vă amintiți că 1 este adevărat și 0 este fals?). Același rezultat va apărea dacă scriem www.site-ul.com/index.php?Verifica =1 . Și chiar dacă utilizați metoda POST, toate astfel de fraude vor funcționa în continuare, deoarece când register_globals este activat, nu contează ce metodă folosiți - GET sau POST.

    Cred că cineva are o întrebare, de unde știe un cracker despre variabila de verificare, că este responsabil pentru tot? Dacă nu ați arătat scenariul nimănui, este puțin probabil ca acesta să-l cunoască. Cu toate acestea, nu toată lumea își folosește propriile scripturi, CMS etc., dar folosește ceea ce este disponibil în rețea. În astfel de cazuri, un cracker, de exemplu, poate studia codul CMS și poate ataca site-urile create cu ajutorul său.

    Cu toate acestea, nu toți hosterii dezactivează register_globals și, chiar dacă scripturile dvs. sunt concepute pentru a nu avea activat register_globals, un cracker vă poate sparge scriptul folosind vulnerabilitatea acestei directive.

    Să luăm exemplul nostru. Pentru a-l proteja în cazul în care register_globals este activat, după linie dacă ($parola==$real_trece)$verifica =Adevărat; adăugați următoarele: altfel$verifica =fals;. În acest caz, chiar dacă variabila de verificare egală cu unu este trecută prin metoda GET, scriptul va seta în continuare $check=false dacă parola este incorectă.

    Da, aș dori să vă atrag atenția și asupra faptului că, dacă dezactivați register_globals, atunci exemplul nostru nu va funcționa. Și pentru ca acesta să funcționeze, trebuie să scrieți $login = $_POST["login"]; $parolă = $_POST[„parolă”];

    Să rezumam...

    și trageți două concluzii principale:

    1) Când register_globals este activat, puteți trece diverse variabile, ale căror valori nu au fost calculate pentru a fi primite prin GET sau POST.

    2) Register_globals în sine nu este atât de periculos ca un scenariu scris strâmb.

    Asta e tot pentru azi! Voi fi foarte bucuros să văd comentariile, observațiile, sugestiile și doar feedback-ul. Prin urmare, scrie, nu fi timid!

    Cu urări pentru o săptămână reușită,
    Alexandru ȘUYSKY