Prečo je nebezpečné povoliť parameter register_globals PHP? Vytvorenie jednoduchého systému registrácie užívateľov v PHP a MySQL Impersonal index php register

Ahoj! Teraz sa pokúsime implementovať najjednoduchšiu registráciu na stránke pomocou PHP + MySQL. Aby ste to dosiahli, musí byť na vašom počítači nainštalovaný Apache. Princíp fungovania nášho skriptu je uvedený nižšie.

1. Začnime vytvorením tabuľky používateľov v databáze. Bude obsahovať používateľské údaje (prihlasovacie meno a heslo). Poďme na phpmyadmin (ak vytvárate databázu na vašom PC http://localhost/phpmyadmin/). Vytvoríme tabuľku users , bude mať 3 polia.

Ja ho vytvorím v databáze mysql, môžete si ho vytvoriť v inej databáze. Ďalej nastavte hodnoty ako na obrázku:

2. Vyžaduje sa pripojenie k tejto tabuľke. Vytvorme súbor bd.php. Jej obsah:

V mojom prípade to vyzerá takto:

Uložiť bd.php .
Skvelé! V databáze máme tabuľku a spojenie s ňou. Teraz môžete začať vytvárať stránku, na ktorej používatelia zanechajú svoje údaje.

3. Vytvorte súbor reg.php s obsahom (všetky komentáre v ňom):



Registrácia


Registrácia


Vaše prihlasovacie meno:




Tvoje heslo:








4. Vytvorte súbor, ktorý zadá údaje do databázy a uloží používateľa. save_user.php (komentáre vnútri):

5. Teraz sa môžu registrovať naši užívatelia! Ďalej musíte vytvoriť „dvere“ pre už registrovaných používateľov na vstup na stránku. index.php (komentáre vnútri):




Domovská stránka


Domovská stránka


Vaše prihlasovacie meno:


Tvoje heslo:






Registrovať



OK, teraz je po všetkom! Lekcia môže byť nudná, ale veľmi užitočná. Tu je zobrazená iba myšlienka registrácie, potom ju môžete vylepšiť: pridať bezpečnosť, dizajn, dátové polia, načítať avatarov, odhlásiť sa z účtu (na tento účel jednoducho zničte premenné z relácie pomocou nenastavenej funkcie) a tak ďalej. Veľa štastia!

Všetko som skontroloval, funguje to správne!

Reg.ru: domény a hosting

Najväčší registrátor a poskytovateľ hostingu v Rusku.

V prevádzke je viac ako 2 milióny doménových mien.

Propagácia, doménová pošta, obchodné riešenia.

Svoj výber si už vybralo viac ako 700 tisíc zákazníkov po celom svete.

* Ak chcete pozastaviť posúvanie, prejdite myšou.

Späť dopredu

Vytvorenie jednoduchého systému registrácie používateľov v PHP a MySQL

Vytvorenie registračného systému je veľa práce. Musíte napísať kód, ktorý overí e-mailové adresy, odošle e-mail s potvrdením registrácie a tiež overí ďalšie polia formulára a oveľa viac.

A aj keď toto všetko napíšete, používatelia sa budú zdráhať registrovať, pretože... to si vyžaduje určité úsilie z ich strany.

V tomto návode vytvoríme veľmi jednoduchý registračný systém, ktorý vôbec nevyžaduje ani neuchováva heslá! Výsledok bude možné ľahko upraviť a pridať na existujúcu stránku PHP. Chcete zistiť, ako to funguje? Prečítajte si nižšie.



Náš super jednoduchý systém bude fungovať takto:

Spojíme autorizačný formulár a registráciu. Tento formulár bude obsahovať pole na zadanie vašej e-mailovej adresy a tlačidlo registrácie;
- Pri vyplnení e-mailovej adresy sa kliknutím na tlačidlo registrácie vytvorí záznam o novom užívateľovi, avšak len v prípade, že zadaná e-mailová adresa nebola nájdená v databáze.

Potom sa vytvorí náhodná jedinečná sada znakov (token), ktorá sa odošle na e-mail zadaný používateľom vo forme odkazu, ktorý bude relevantný 10 minút;
- Odkaz presmeruje používateľa na našu webovú stránku. Systém určí prítomnosť tokenu a autorizuje používateľa;

Výhody tohto prístupu:

Nie je potrebné ukladať heslá ani overovať polia;
- Nie je potrebné obnoviť heslo, bezpečnostné otázky atď.;
- Od chvíle, keď sa používateľ zaregistruje/prihlási, vždy si môžete byť istý, že tento používateľ bude vo vašej prístupovej zóne (že e-mailová adresa je pravdivá);
- Neuveriteľne jednoduchý proces registrácie;

nedostatky:

Zabezpečenie používateľského účtu. Ak má niekto prístup k pošte používateľa, môže sa prihlásiť.
- E-mail nie je bezpečný a možno ho zachytiť. Majte na pamäti, že táto otázka je relevantná aj v prípade, keď bolo heslo zabudnuté a je potrebné ho obnoviť, alebo v akomkoľvek autorizačnom systéme, ktorý nepoužíva HTTPS na prenos dát (login/heslo);
- Kým správne nakonfigurujete svoj poštový server, existuje šanca, že správy s autorizačnými odkazmi skončia v spame;

Pri porovnaní výhod a nevýhod nášho systému môžeme konštatovať, že systém má vysokú využiteľnosť (maximálny komfort pre koncového užívateľa) a zároveň má nízky bezpečnostný indikátor.

Preto sa odporúča používať ho na registrácie na fórach a v službách, ktoré nepracujú s dôležitými informáciami.

Ako používať tento systém

V prípade, že len potrebujete použiť systém na autorizáciu používateľov na vašom webe a nechcete túto lekciu rozoberať na kusy, musíte urobiť toto:

Musíte si stiahnuť zdroje pripojené k lekcii
- Nájdite v archíve súbor tables.sql a importujte ho do svojej databázy pomocou možnosti importu v phpMyAdmin. Alternatívny spôsob: otvorte tento súbor v textovom editore, skopírujte SQL dotaz a spustite ho;
- Otvorte include/main.php a vyplňte nastavenia pre pripojenie k vašej databáze (uveďte používateľa a heslo pre pripojenie k databáze, ako aj hostiteľa a názov databázy). V tom istom súbore musíte zadať aj email, ktorý bude použitý ako pôvodná adresa pre správy odoslané systémom. Niektorí hostitelia blokujú odchádzajúce e-maily, pokiaľ formulár neobsahuje skutočnú e-mailovú adresu, ktorá bola vytvorená z ovládacieho panela hostiteľa, takže zadajte skutočnú adresu;
- Nahrajte všetky index.php, protected.php súbory a aktíva a obsahuje priečinky cez FTP na váš hostiteľ;
- Pridajte nižšie uvedený kód na každú stránku PHP, kde chcete zobraziť prihlasovací formulár;

Require_once "includes/main.php"; $user = novy User(); if(!$user->loggedIn())( redirect("index.php"); )
- Pripravený!

Pre tých, ktorých zaujíma, ako to celé funguje, čítajte ďalej!

Prvým krokom je napísanie HTM kódu pre autorizačný formulár. Tento kód sa nachádza v súbore index.php. Tento súbor obsahuje aj PHP kód, ktorý spracováva údaje formulárov a ďalšie užitočné funkcie prihlasovacieho systému. Viac sa o tom môžete dozvedieť v časti nižšie venovanej recenzii kódu PHP.

index.php

Návod: Super jednoduchý registračný systém s PHP a MySQL Prihláste sa alebo zaregistrujte

Vyššie zadajte svoju e-mailovú adresu a my vám pošleme
máte prihlasovací odkaz.

Prihlásenie/Registrácia

V sekcii head (medzi tagy a) som zahrnul hlavné štýly (v tomto návode nie sú zahrnuté, takže si ich môžete pozrieť sami. Folder assets/css/style.css). Pred uzatváraciu značku som zaradil knižnicu jQuery a súbor script.js, ktoré napíšeme a analyzujeme nižšie.


JavaScript

jQuery pomocou funkcie sleduje stav tlačidla „Registrácia/Prihlásenie“. e.preventDefault() a odosiela požiadavky AJAX. V závislosti od odpovede servera zobrazí jednu alebo druhú správu a určí ďalšie akcie/

aktíva/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, (e-mail: email), function (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder . text(m.message); ) )); )); $(document).ajaxStart(function())( form.addClass("loading"); )); $(document).ajaxComplete(function()) ( form. removeClass("načítava"); )); ));

bol pridaný do formulára na zobrazenie aktuálneho stavu požiadavky AJAX (toto bolo možné vďaka metódam ajaxStart()) A ajaxComplete(), ktorý nájdete na konci súboru).

Táto trieda zobrazuje otáčajúci sa animovaný súbor GIF (akoby nám chcel naznačiť, že požiadavka sa spracováva) a tiež funguje ako príznak, ktorý zabráni opätovnému odoslaniu formulára (keď už bolo raz kliknuté na tlačidlo registrácie). Trieda .loggedIn je ďalším príznakom – nastavuje sa pri odoslaní e-mailu. Tento príznak okamžite zablokuje všetky ďalšie akcie s formulárom.

Schéma databázy

Náš neuveriteľne jednoduchý logovací systém používa 2 MySQL tabuľky (SQL kód je v súbore tables.sql). Prvý ukladá údaje o používateľských účtoch. Druhá ukladá informácie o počte pokusov o prihlásenie.


Schéma užívateľskej tabuľky.

Systém nepoužíva heslá, ako je vidieť na obrázku. Na ňom môžete vidieť stĺpec tokenov s tokenmi susediacimi so stĺpcom token_validity. Token sa nainštaluje hneď, ako sa používateľ pripojí k systému a nastaví svoj email na odosielanie správy (viac o tom v ďalšom bloku). Stĺpec token_validity nastavuje čas o 10 minút neskôr, po ktorom už token nie je platný.


Schéma tabuľky, ktorá počíta počet pokusov o autorizáciu.

V oboch tabuľkách je IP adresa uložená v spracovanej forme pomocou funkcie ip2long v poli typu integer.

Teraz môžeme napísať nejaký PHP kód. Hlavná funkcionalita systému je priradená triede User.class.php, ktorú môžete vidieť nižšie.

Táto trieda aktívne používa idorm (docs), tieto knižnice sú minimom nevyhnutných nástrojov pre prácu s databázami. Zaoberá sa prístupom k databáze, generovaním tokenov a validáciou tokenov. Poskytuje jednoduché rozhranie, ktoré uľahčuje pripojenie registračného systému k vašej stránke, ak používa PHP.

User.class.php

Class User( // Súkromný prípad ORM private $orm; /** * Vyhľadanie používateľa podľa tokenu. Do úvahy sa berú iba platné tokeny. Token sa generuje iba 10 minút od okamihu, keď bol vytvorený * @param string $token . Toto je ten, ktorý hľadáme token * @return User Vráti hodnotu funkcie Používateľ */ verejná statická funkcia findByToken($token)( // nájdite token v databáze a uistite sa, že je nastavená správna časová pečiatka $result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("platnosť_tokenu > TERAZ()") ->find_one(); if(!$result)( return false; ) return new User($result); ) /** * Autorizácia alebo registrácia používateľa * @param string $email.E-mailová adresa používateľa * @return User */ verejná statická funkcia loginOrRegister($email)( // Ak už taký používateľ je existuje, vráti hodnotu funkcie Používateľ zo zadanej e-mailovej adresy uloženej v databáze if(User::exists($email))( return new User($email); ) // V opačnom prípade vytvorte nového používateľa v databáze a vráti hodnotu funkcie User::create zo zadaného emailu return User::create($email ); ) /** * Vytvorenie nového užívateľa a uloženie do databázy * @param string $email. E-mailová adresa používateľa * @return User */ súkromná statická funkcia create($email)( // Napíšte nového používateľa a vráťte výsledok funkcie Používateľ z týchto hodnôt $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Skontrolujte, či takýto používateľ existuje v databáze a vráťte boolovskú hodnotu premenná * @param reťazec $email. E-mailová adresa používateľa * @return boolean */ existuje verejná statická funkcia ($email)( // Existuje používateľ v databáze? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Vytvorenie nového používateľského objektu * @param inštancia $param ORM , id, email alebo 0 * @return User */ verejná funkcia __construct($param = null) ( if($param instanceof ORM)( // kontrola ORM prebehla $this->orm = $param; ) else if(is_string($param))( // Kontrola e-mailu prebehla $this->orm = ORM:: for_table ("reg_users") ->where("e-mail", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // hodnota premennej $param je odovzdaný identifikátoru používateľa $id = $param; ) else if(isset($_SESSION["loginid"]))( // V opačnom prípade pozri reláciu $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Vygeneruje nový autorizačný token SHA1, zapíše ho do databázy a vráti jeho hodnotu * @return string */ public function generationToken( )( // Generovanie tokenu pre oprávneného používateľa a jeho uloženie do databázy $token = sha1($this->email.time().rand(0, 1000000)); // Uložte token do databázy // A označte ho ako platný len na nasledujúcich 10 minút $this->orm->set("token", $token); $this->orm->set_expr("platnosť_tokenu", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); vrátiť $token; ) /** * Autorizácia používateľa * @return void */ prihlásenie do verejnej funkcie())( // Označenie používateľa ako prihláseného $_SESSION["loginid"] = $this->orm->id; // Aktualizácia hodnota databázového poľa last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Zničiť reláciu a odhlásiť používateľa * @return void */ odhlásenie z verejnej funkcie ()( $_SESSION = array(); unset($_SESSION); ) /** * Skontrolujte, či je používateľ prihlásený * @return boolean */ verejná funkcia prihlásený())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Skontroluje, či je používateľ správcom * @return boolean */ public function isAdmin())( return $this->rank() = = "administrator"; ) /** * Nájdite typ používateľa, môže to byť buď správca alebo obyčajný * @return string */ public function rank())( ak ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Metóda, ktorá vám umožňuje získať súkromné ​​informácie používateľa ako * vlastnosti objektu používateľa * @ param string $key Názov vlastnosti, ktorá získa prístup * @return mixed */ public function __get($key)( if(isset($this->orm->$key))( return $this->orm-> $kľúč; ) return null; ))

Tokeny sa generujú pomocou algoritmu SHA1 a ukladajú sa do databázy. Používam funkcie časovania MySQL na nastavenie 10-minútového časového limitu platnosti tokenu.

Keď je token overený, priamo informujeme obsluhu, že berieme do úvahy iba tokeny, ktorých platnosť ešte nevypršala, uložené v stĺpci token_validity.

Upozorňujeme, že používam magickú metódu __získať knižnicu dokumentov na konci súboru na zachytenie prístupu k vlastnostiam objektu používateľa.

Vďaka tomu je možné pristupovať k informáciám uloženým v databáze vďaka vlastnostiam $user->email, $user->token atď. V ďalšom fragmente kódu sa pozrieme na to, ako tieto triedy použiť ako príklad .


Chránená stránka

Ďalším súborom, ktorý uchováva užitočnú a potrebnú funkcionalitu, je súbor functions.php. Existuje niekoľko takzvaných pomocníkov – asistentských funkcií, ktoré umožňujú vytvárať čistejší a čitateľnejší kód v iných súboroch.

funkcie.php

Funkcia send_email($from, $to, $subject, $message)( // Pomocník, ktorý odosiela e-maily $headers = "MIME-Verzia: 1.0" . "\r\n"; $headers .= "Typ obsahu: text /plain; charset=utf-8" . "\r\n"; $headers .= "Od: ".$from . "\r\n"; return mail($to, $subject, $message, $headers ); ) function get_page_url())( // Určenie adresy URL súboru PHP $url = "http".(prázdne($_SERVER["HTTPS"])?"":"s")."://" .$_SERVER ["SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) else( $url. = $_SERVER["PATH_INFO"]; ) return $url; ) funkcia rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Počet pokusov o prihlásenie na túto IP adresu za poslednú hodinu $ count_hour = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00 ")") ->count(); // Počet pokusov o prihlásenie za posledných 10 minút na tejto IP adrese $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("Príliš veľa pokusov o prihlásenie!"); ) ) funkcia rate_limit_tick($ip, $email)( // Vytvorenie nového záznamu v tabuľke ktorý počíta počet pokusov o prihlásenie $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip) )); $login_attempt->save(); ) function redirect($url)( header("Location: $url"); exit; )

Funkcie sadzba_limit A rate_limit_tick monitorovať počet pokusov o autorizáciu za časové obdobie, ktoré uplynulo od prvého pokusu. Pokus o prihlásenie sa zaznamená do databázy v stĺpci reg_login_attempt. Tieto funkcie sa volajú pri spracovaní a odoslaní údajov formulára, ako môžete vidieť z nasledujúceho útržku kódu.

Nižšie uvedený kód je prevzatý zo súboru index.php a spracováva odoslanie formulára. Vracia odpoveď JSON, ktorú zase spracuje jQuery v súbore aktív/js/script.js, na ktorý sme sa pozreli skôr.

index.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Výstup hlavičky JSON("Content-type: application/json"); // Je táto e-mailová adresa platná, ak (!isset($_POST["e-mail"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Zadajte platný e-mail."); ) // Skontrolujte. Je používateľ sa môže prihlásiť, prekročil počet povolených pripojení? (viac informácií v súbore functions.php) rate_limit($_SERVER["REMOTE_ADDR"]); // Zaznamenať tento pokus o prihlásenie rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["e-mail"]); // Odoslať e-mail používateľovi $message = ""; $email = $_POST["e-mail"]; $subject = "Váš odkaz na prihlásenie"; if(!User:: existuje($email) )( $subject = "Ďakujeme za registráciu!"; $message = "Ďakujeme za registráciu na našej stránke!\n\n"; ) // Pokus o autorizáciu alebo registráciu používateľa $user = Používateľ ::loginOrRegister($_POST[ "e-mail"]); $message.= "Môžete sa prihlásiť z tejto adresy URL:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Platnosť odkazu vyprší automaticky po 10 minútach."; $vysledok = send_email($fromEmail, $_POST["e-mail"], $predmet, $sprava); if(!$result)( throw new Exception("Pri odosielaní vášho e-mailu sa vyskytla chyba. Skúste to znova."); ) die(json_encode(array("message" => "Ďakujeme! Poslali sme odkaz) do svojej doručenej pošty. Skontrolujte si aj priečinok so spamom."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage()) )));)

Po úspešnom prihlásení/registrácii pošle vyššie uvedený kód užívateľovi prihlasovací odkaz. Token sa stáva dostupným, pretože je odovzdaná ako premenná vo vygenerovanom odkaze metódou $_GET s tkn markerom

index.php

If(isset($_GET["tkn"]))( // Je tento token platný na autorizáciu? $user = User::findByToken($_GET["tkn"]); if($user)( // Áno , je. Presmerovanie na chránenú stránku $user->login(); redirect("protected.php"); ) // Nie, token nie je platný. Presmerujte na stránku s autorizačným/registračným formulárom redirect("index. php");)

$user->login()

vytvorí potrebné premenné pre reláciu, takže používateľ, ktorý si prezerá nasledujúce stránky lokality, zostane vždy autorizovaný.

Spracovanie funkcie na ukončenie systému je usporiadané podobným spôsobom.

index.php

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

Na konci kódu som opäť nastavil presmerovanie na index.php, teda parameter ?logout=1 prenos cez URL sa nevyžaduje.

Náš súbor index.php vyžaduje ďalšie. ochrana - nechceme, aby ľudia, ktorí sa prihlásili do systému, znova videli registračný formulár. Na tieto účely používame metódu $user->loggedIn().

index.php

$user = novy User(); if($user->loggedIn())( redirect("protected.php"); )

Nakoniec je tu kúsok kódu, ktorý vám umožňuje chrániť stránky vášho webu a sprístupniť ich až po autorizácii.

protected.php

// Na ochranu každej stránky na vašom webe zahrňte súbor main.php // a vytvorte nový objekt používateľa. Takto je to jednoduché! require_once "includes/main.php"; $user = novy User(); if(!$user->loggedIn())( redirect("index.php"); )

Po tejto kontrole si môžete byť istí, že používateľ bol úspešne autorizovaný. K uloženým informáciám v databáze môžete pristupovať aj pomocou vlastností objektu $user. Ak chcete zobraziť e-mail a stav používateľa, použite tento kód:

Echo "Váš email: ".$user->email; echo "Vaša hodnosť: ".$user->rank();

Metóda rank() sa tu používa preto, lebo databáza zvyčajne uchováva čísla (0 pre bežného užívateľa, 1 pre administrátora) a tieto údaje potrebujeme previesť do stavov, do ktorých patria, v čom nám tento spôsob pomáha.

Ak chcete z bežného používateľa urobiť administrátora, jednoducho upravte záznam používateľa cez phpMyAdmin (alebo akýkoľvek iný program, ktorý vám umožňuje spravovať databázy). Stav správcu nedáva žiadne oprávnenia; v tomto príklade sa na stránke zobrazí, že ste správcom – a to je všetko.

Čo s tým však urobíte, je ponechané na vašom uvážení; môžete sami napísať a zostaviť kód, ktorý nastaví určité privilégiá a možnosti pre správcov.

Skončili sme!

S týmto neuveriteľne super kvázi jednoduchým tvarom sme skončili! Môžete ho použiť na svojich stránkach PHP, je to celkom jednoduché. Môžete si ho tiež upraviť pre seba a urobiť tak, ako chcete.

Materiál pripravil Denis Malyshok špeciálne pre webovú stránku

P.S. Chcete sa posunúť ďalej v ovládaní PHP a OOP? Venujte pozornosť prémiovým lekciám o rôznych aspektoch tvorby webových stránok, vrátane programovania v PHP, ako aj bezplatnému kurzu vytvárania vlastného CMS systému v PHP od nuly pomocou OOP:

Páčil sa vám materiál a chcete sa mi poďakovať?
Stačí zdieľať so svojimi priateľmi a kolegami!


Vzhľadom na to, že sa veľmi často vynárajú otázky o globálnych premenných a problémoch spojených s deaktiváciou smernice register_globals, pokúsime sa v tomto článku túto tému trochu pokryť.

Najprv si definujme, čo sú vonkajšie premenné. Sú to akékoľvek premenné, ktoré prichádzajú do programu zvonku, t.j. nie sú definované v samotnom programe. V prípade skriptu php sú všetky premenné, ktoré prechádzajú cez riadok prehliadača alebo cez formulár, externé.
Pozrime sa, ako vznikajú.

Ak je na serveri povolená direktíva register_globals = On (v php.ini), potom sa pri prechode premenných cez formulár alebo cez riadok prehliadača v skripte, ktorému sú tieto premenné určené, vytvoria automaticky. Tie. ak máte v riadku prehliadača napísané: www.server.ru/index.php?var=1, potom sa v skripte index.php automaticky vytvorí premenná $var s hodnotou rovnou 1.

Komentujte

Táto smernica je jedným z najkontroverznejších bodov v jazyku PHP. Na jednej strane môže jeho používanie skutočne spôsobiť skutočné problémy s ochranou PHP skriptov, ak nie sú riadne zohľadnené možné chybové situácie, a mnohí vývojári správne poznamenávajú, že písanie skriptov bez použitia globálnych premenných znižuje zraniteľnosť skriptov voči rôznych typov útokov o 90 %. Na druhej strane, na úsvite PHP dôverovalo vývojárom jazykov viac ako tisíc používateľov (do PHP 4.3 bola táto smernica štandardne povolená), vďaka čomu v súčasnosti existujú milióny skutočne fungujúcich skriptov napísaných pomocou globálnych premenných (tj. stojí za zmienku, že na vzdelávacie účely sa niekedy úplne oplatí písať skripty pomocou globálnych premenných, pretože ich nahradenie superglobálnymi poľami značne zhoršuje čitateľnosť kódu).

V súčasnosti má väčšina poskytovateľov hostiteľov túto smernicu povolenú a pravdepodobne zostane povolená ešte dlho, pretože inak môže narušiť kontinuitu kódu.

Keď je direktíva register_globals zakázaná, prístup k takýmto premenným je možný dvoma spôsobmi:

  • cez asociatívne polia HTTP_***_VARS (HTTP_POST_VARS atď.)
  • prostredníctvom superglobálnych polí ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES atď.)

Superglobálne polia sú dostupné v akomkoľvek rozsahu. Vývojári PHP odporúčajú vypnúť direktívu register_globals na serveri a pracovať s premennými prostredníctvom superglobálnych polí. Toto odporúčanie je spôsobené bezpečnostnými problémami, ktoré môžu nastať, keď je povolená direktíva register_globals.

Hoci až donedávna zostala smernica register_globals povolená na hostiteľských stránkach. Situácia sa začala meniť s vydaním PHP 5, kde je táto smernica štandardne vypnutá a hostitelia sa s jej povolením neponáhľajú (možno oprávnene).

Takže, čo presne by ste mali urobiť, aby ste získali premenné? Musíte ich vziať zo superglobálnych polí. Ak chcete napríklad získať premenné prechádzajúce cez riadok prehliadača, použite pole $_GET. Povedzme, že riadok prehliadača hovorí www.server.ru/index.php?var=1. Potom na získanie premennej var v index.php musíte napísať:

$var=$_GET["var"];

A napríklad, ak chcete prijať premenné prenesené z formulára pomocou metódy POST, do skriptu obslužného programu formulára musíte napísať:

$var=$_POST["var"];

V tomto článku sa dozviete, ako vytvoriť registračný a prihlasovací formulár pomocou HTML, JavaScript, PHP a MySql. Takéto formuláre sa používajú takmer na každej webovej stránke bez ohľadu na jej typ. Sú vytvorené pre fórum, internetový obchod, sociálne siete (napríklad Facebook, Twitter, Odnoklassniki) a mnoho ďalších typov stránok.

Ak máte webovú stránku na svojom lokálnom počítači, dúfam, že už máte nainštalovaný a spustený lokálny server. Bez toho nebude fungovať nič.

Vytvorenie tabuľky v databáze

Na implementáciu registrácie používateľov potrebujeme v prvom rade Databázu. Ak ho už máte, je to skvelé, inak si ho musíte vytvoriť. V článku podrobne vysvetľujem, ako to urobiť.

A tak máme Databázu (skrátene DB), teraz musíme vytvoriť tabuľku používateľov do ktorých budeme pridávať našich registrovaných užívateľov.

V článku som tiež vysvetlil, ako vytvoriť tabuľku v databáze. Pred vytvorením tabuľky si musíme určiť, aké polia bude obsahovať. Tieto polia budú zodpovedať poliam z registračného formulára.

Pomysleli sme si, predstavili sme si, aké polia bude mať náš formulár a vytvorili sme tabuľku používateľov s týmito poliami:

  • id- Identifikátor. Lúka id Každá tabuľka v databáze by ho mala mať.
  • krstné meno- Ak chcete uložiť meno.
  • priezvisko- Zachovať priezvisko.
  • email- Na uloženie poštovej adresy. Ako prihlásenie použijeme e-mail, takže toto pole musí byť jedinečné, to znamená, že musí mať UNIKÁTNY index.
  • stav_e-mailu- Pole na označenie, či je e-mail potvrdený alebo nie. Ak je e-mail potvrdený, bude mať hodnotu 1, inak bude mať hodnotu 0.
  • heslo- Na uloženie hesla.


Ak chcete, aby váš registračný formulár obsahoval aj ďalšie polia, môžete ich pridať aj tu.

To je všetko, náš stôl používateľov pripravený. Prejdime k ďalšej fáze.

Pripojenie k databáze

Vytvorili sme databázu, teraz sa k nej potrebujeme pripojiť. Pripojíme sa pomocou PHP rozšírenia MySQLi.

V priečinku našej stránky vytvorte súbor s názvom dbconnect.php a napíšte do neho nasledujúci skript:

Tento súbor dbconnect.php bude potrebné pripojiť k obslužným programom formulárov.

Všimnite si premennú $address_site, tu som uviedol názov mojej testovacej stránky, na ktorej budem pracovať. Označte podľa toho názov svojej stránky.

Štruktúra stránky

Teraz sa pozrime na štruktúru HTML našej stránky.

Hlavičku a pätu stránky presunieme do samostatných súborov, hlavička.php A footer.php. Zahrnieme ich na všetky strany. Konkrétne na hlavnej stránke (súbor index.php), na stránku s registračným formulárom (súbor formulár_register.php) a na stránku s autorizačným formulárom (súbor form_auth.php).

Blokujte pomocou našich odkazov, registrácia A autorizáciu, pridajte ich do hlavičky lokality, aby sa zobrazovali na všetkých stránkach. Jeden odkaz vstúpi na stránku s registračným formulárom (súbor formulár_register.php) a druhý na stránku s autorizačným formulárom (súbor form_auth.php).

Obsah súboru header.php:

Názov našej stránky

V dôsledku toho naša hlavná stránka vyzerá takto:


Samozrejme, vaša stránka môže mať úplne inú štruktúru, ale to pre nás teraz nie je dôležité. Hlavná vec je, že existujú odkazy (tlačidlá) na registráciu a autorizáciu.

Teraz prejdime k registračnému formuláru. Ako ste už pochopili, máme to v záznamoch formulár_register.php.

Prejdite do databázy (v phpMyAdmin), otvorte štruktúru tabuľky používateľov a pozrite sa, aké polia potrebujeme. To znamená, že potrebujeme polia na zadanie mena a priezviska, pole na zadanie poštovej adresy (Email) a pole na zadanie hesla. A z bezpečnostných dôvodov pridáme pole na zadanie captcha.

Na serveri sa v dôsledku spracovania registračného formulára môžu vyskytnúť rôzne chyby, kvôli ktorým sa používateľ nebude môcť zaregistrovať. Preto, aby používateľ pochopil, prečo registrácia zlyhá, je potrebné zobraziť správy o týchto chybách.

Pred zobrazením formulára pridajte blok na zobrazenie chybových hlásení z relácie.

A ešte jedna vec, ak je používateľ už autorizovaný a zo zvedavosti prejde na registračnú stránku priamo napísaním do adresného riadku prehliadača site_address/form_register.php, potom v tomto prípade namiesto registračného formulára zobrazíme hlavičku, že už je zaregistrovaný.

Vo všeobecnosti kód súboru formulár_register.php dostali sme toto:

Už si zaregistrovaný

V prehliadači vyzerá stránka s registračným formulárom takto:


Použitím požadovaného atribútu sme urobili všetky polia povinnými.

Venujte pozornosť kódu registračného formulára, kde sa zobrazuje captcha:


Cestu k súboru sme špecifikovali v hodnote atribútu src pre obrázok captcha.php, ktorý generuje tento captcha.

Pozrime sa na kód súboru captcha.php:

Kód je dobre komentovaný, takže sa zameriam len na jeden bod.

Vo vnútri funkcie imageTtfText(), je určená cesta k písmu verdana.ttf. Aby captcha fungovala správne, musíme vytvoriť priečinok fonty a umiestnite tam súbor písma verdana.ttf. Môžete ho nájsť a stiahnuť z internetu alebo si ho vziať z archívu s materiálmi tohto článku.

So štruktúrou HTML sme skončili, je čas posunúť sa ďalej.

Kontrola platnosti emailu pomocou jQuery

Každý formulár potrebuje skontrolovať platnosť zadaných údajov, a to na strane klienta (pomocou JavaScriptu, jQuery) aj na strane servera.

Osobitnú pozornosť musíme venovať poľu Email. Je veľmi dôležité, aby bola zadaná poštová adresa platná.

Pre toto vstupné pole nastavujeme typ emailu (type="email"), čo nás mierne varuje pred nesprávnym formátom. To však nestačí, pretože prostredníctvom inšpektora kódu, ktorý nám prehliadač poskytuje, môžeme ľahko zmeniť hodnotu atribútu typu s email na text, a to je všetko, náš šek už nebude platný.


A v tomto prípade musíme vykonať spoľahlivejšiu kontrolu. Na to nám poslúži knižnica jQuery z JavaScriptu.

Ak chcete pripojiť knižnicu jQuery, v súbore hlavička.php medzi značkami , pred záverečnou značkou , pridajte tento riadok:

Ihneď za tento riadok pridáme overovací kód emailu. Tu pridáme kód na kontrolu dĺžky zadaného hesla. Jeho dĺžka musí byť aspoň 6 znakov.

Pomocou tohto skriptu skontrolujeme platnosť zadanej emailovej adresy. Ak používateľ zadal nesprávny e-mail, zobrazíme o tom chybové hlásenie a vypneme tlačidlo odoslania formulára. Ak je všetko v poriadku, chybu odstránime a aktivujeme tlačidlo odoslania formulára.

A tak sme skončili s validáciou formulára na strane klienta. Teraz to môžeme poslať na server, kde tiež urobíme pár kontrol a pridáme dáta do databázy.

Registrácia používateľa

Formulár posielame do súboru na spracovanie register.php, prostredníctvom metódy POST. Názov tohto súboru obslužného programu je uvedený v hodnote atribútu akcie. A spôsob odoslania je špecifikovaný v hodnote atribútu metóda.

Otvorte tento súbor register.php a prvá vec, ktorú musíme urobiť, je napísať funkciu spustenia relácie a pripojiť súbor, ktorý sme vytvorili predtým dbconnect.php(V tomto súbore sme vytvorili pripojenie k databáze). A tiež okamžite vyhlásime bunky chybové_správy A úspešné_správy v poli globálnej relácie. IN error_mesages zaznamenáme všetky chybové hlásenia, ktoré sa vyskytnú počas spracovania formulára a v succes_messages, budeme zaznamenávať radostné správy.

Skôr ako budeme pokračovať, musíme skontrolovať, či bol formulár vôbec odoslaný. Útočník sa môže pozrieť na hodnotu atribútu akcie z formulára a zistite, ktorý súbor tento formulár spracúva. A môže mať nápad prejsť priamo na tento súbor zadaním nasledujúcej adresy do panela s adresou prehliadača: http://adresa_stránky/register.php

Musíme teda skontrolovať bunku v globálnom poli POST, ktorej názov sa zhoduje s názvom nášho tlačidla „Registrovať“ z formulára. Takto skontrolujeme, či bolo kliknuté na tlačidlo "Registrovať" alebo nie.

Ak sa útočník pokúsi prejsť priamo k tomuto súboru, zobrazí sa mu chybové hlásenie. Pripomínam, že premenná $address_site obsahuje názov stránky a bola deklarovaná v súbore dbconnect.php.

Hodnota captcha v relácii bola pridaná pri jej vygenerovaní do súboru captcha.php. Pre pripomenutie vám znova ukážem tento kúsok kódu zo súboru captcha.php, kde sa k relácii pridá hodnota captcha:

Teraz prejdime k samotnému overovaniu. V súbore register.php, vo vnútri bloku if, kde skontrolujeme, či bolo kliknuté na tlačidlo "Registrovať", alebo skôr, kde je uvedený komentár "" // (1) Priestor pre ďalšiu časť kódu"píšeme:

//Skontrolujte prijaté captcha //Orežte medzery od začiatku a konca riadku $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Porovnajte prijatú hodnotu s hodnotou z relácie. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Ak captcha nie je správny, vrátime používateľa na registračnú stránku a tam mu zobrazíme chybovú správu, že zadal nesprávny obrázok captcha $error_message = "

Chyba! Zadali ste nesprávny obrázok captcha

"; // Uložte chybovú správu do relácie. $_SESSION["error_messages"] = $error_message; // Vráťte používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: " .$address_site ."/form_register.php"); //Zastavenie skriptu exit(); ) // (2) Miesto pre ďalšiu časť kódu )else( //Ak captcha neprejde alebo je prázdny, ukončite ("

Chyba! Neexistuje žiadny overovací kód, teda captcha kód. Môžete prejsť na hlavnú stránku.

"); }

Ďalej musíme spracovať prijaté dáta z poľa POST. V prvom rade musíme skontrolovať obsah globálneho poľa POST, teda či sa tam nachádzajú bunky, ktorých názvy zodpovedajú názvom vstupných polí z nášho formulára.

Ak bunka existuje, odrežeme medzery od začiatku a konca riadku z tejto bunky, inak používateľa presmerujeme späť na stránku s registračným formulárom.

Ďalej po orezaní medzier pridáme riadok do premennej a skontrolujeme, či táto premenná nie je prázdna, ak nie je prázdna, ideme ďalej, inak užívateľa presmerujeme späť na stránku s registračným formulárom.

Vložte tento kód na určené miesto" // (2) Priestor pre ďalšiu časť kódu".

/* Skontrolujte, či existujú údaje odoslané z formulára v globálnom poli $_POST a zabaľte odoslané údaje do bežných premenných.*/ if(isset($_POST["first_name"]))( //Orezať medzery od začiatku a koniec reťazca $first_name = trim($_POST["first_name"]); //Skontrolujte, či je premenná prázdna if(!empty($first_name))( // Pre istotu skonvertujte špeciálne znaky na entity HTML $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Uloženie chybovej správy do relácie. $_SESSION["error_messages"] .= "

Zadajte svoje meno

Chýba pole s názvom

"; //Vrátenie používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_register.php"); //Zastavenie skriptu exit(); ) if( isset($_POST["priezvisko"]))( //Orezať medzery od začiatku a konca riadku $priezvisko = trim($_POST["priezvisko"]); if(!empty($priezvisko)) ( // Kvôli bezpečnosti konvertujte špeciálne znaky na HTML entity $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Uložte chybovú správu do relácie. $_SESSION["error_messages"] .= "

Zadajte svoje priezvisko

"; //Vrátenie používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_register.php"); //Zastavenie skriptu exit(); ) )else ( // Uložte chybovú správu do relácie. $_SESSION["error_messages"] .= "

Chýba pole priezviska

"; //Vrátenie používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_register.php"); //Zastavenie skriptu exit(); ) if( isset($_POST["email"]))( //Orezať medzery od začiatku a konca riadku $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Umiestnenie kódu na kontrolu formátu e-mailovej adresy a jej jedinečnosti )else( // Uložte chybovú správu do relácie. $_SESSION["error_messages"] .="

Zadajte svoj e-mail

"; //Vrátenie používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_register.php"); //Zastavenie skriptu exit(); ) )else ( // Uložte chybovú správu do relácie. $_SESSION["error_messages"] .= "

"; //Vrátenie používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_register.php"); //Zastavenie skriptu exit(); ) if( isset($_POST["heslo"]))( //Orezať medzery od začiatku a konca reťazca $password = trim($_POST["heslo"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Zašifrovať heslo $password = md5($password."top_secret"); )else( // Uložiť chybovú správu do relácie. $_SESSION["error_messages"] .="

Zadajte svoje heslo

"; //Vrátenie používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_register.php"); //Zastavenie skriptu exit(); ) )else ( // Uložte chybovú správu do relácie. $_SESSION["error_messages"] .= "

"; //Vrátenie používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_register.php"); //Zastavenie skriptu exit(); ) // (4) Miesto pre kód na pridanie užívateľa do databázy

Mimoriadne dôležité je pole email. Musíme skontrolovať formát prijatej poštovej adresy a jej jedinečnosť v databáze. To znamená, je už zaregistrovaný nejaký používateľ s rovnakou e-mailovou adresou?

Na určenom mieste" // (3) Umiestnenie kódu na kontrolu formátu poštovej adresy a jej jedinečnosti“ pridajte nasledujúci kód:

//Skontrolujte formát prijatej e-mailovej adresy pomocou regulárneho výrazu $reg_email = "/^**@(+(*+)*\.)++/i"; //Ak sa formát prijatej e-mailovej adresy nezhoduje s regulárnym výrazom if(!preg_match($reg_email, $email))( // Uložte chybovú správu do relácie. $_SESSION["error_messages"] .= "

Zadali ste nesprávny email

"; //Vrátenie používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_register.php"); //Zastavenie skriptu exit(); ) // Skontrolujeme, či sa takáto adresa už nachádza v databáze. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /Ak je počet prijatých presne jeden riadok, čo znamená, že používateľ s touto e-mailovou adresou je už zaregistrovaný if($result_query->num_rows == 1)( //Ak výsledný výsledok nie je nepravdivý if(($row = $result_query->fetch_assoc()) != false) ( // Uložte chybovú správu do relácie. $_SESSION["error_messages"] .= "

Používateľ s touto e-mailovou adresou je už zaregistrovaný

"; //Vrátiť používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_register.php"); )else( // Uložiť chybové hlásenie do relácie . $_SESSION["error_messages"] .= "

Chyba v databázovom dotaze

"; //Vrátenie používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_register.php"); ) /* zatvorenie výberu */ $ result_query-> close(); //Zastavenie skriptu exit(); ) /* zatvorenie výberu */ $result_query->close();

A tak sme skončili so všetkými kontrolami, je čas pridať používateľa do databázy. Na určenom mieste" // (4) Miesto pre kód na pridanie užívateľa do databázy“ pridajte nasledujúci kód:

//Dopyt na pridanie používateľa do databázy $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email, password) VALUES ("".$first_name."", "".$last_name ." ", ".$email.", ".$heslo."")"); if(!$result_query_insert)( // Uloženie chybovej správy do relácie. $_SESSION["error_messages"] .= "

Chyba v požiadavke na pridanie používateľa do databázy

"; //Vrátenie používateľa na hlavičku registračnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_register.php"); //Zastavenie skriptu exit(); )else( $_SESSION["success_messages"] = "

Registrácia úspešne dokončená!!!
Teraz sa môžete prihlásiť pomocou svojho používateľského mena a hesla.

"; //Odoslanie používateľa na hlavičku autorizačnej stránky("HTTP/1.1 301 Presunuté natrvalo"); header("Umiestnenie: ".$address_site."/form_auth.php"); ) /* Dokončenie požiadavky */ $ result_query_insert-> close(); //Ukončenie pripojenia k databáze $mysqli->close();

Ak sa v požiadavke na pridanie používateľa do databázy vyskytla chyba, do relácie pridáme správu o tejto chybe a používateľa vrátime na registračnú stránku.

V opačnom prípade, ak všetko prebehlo v poriadku, pridáme do relácie aj správu, ale tentokrát je to príjemnejšie, konkrétne povieme používateľovi, že registrácia prebehla úspešne. A presmerujeme ho na stránku s autorizačným formulárom.

Skript na kontrolu formátu e-mailovej adresy a dĺžky hesla je v súbore hlavička.php, tak to bude platiť aj pre polia z tohto formulára.

Relácia sa spustí aj v súbore hlavička.php, teda v súbore form_auth.php Nie je potrebné spustiť reláciu, pretože dostaneme chybu.


Ako som už povedal, funguje tu aj skript na kontrolu formátu emailovej adresy a dĺžky hesla. Ak teda používateľ zadá nesprávnu emailovú adresu alebo krátke heslo, okamžite dostane chybové hlásenie. Tlačítko vstúpiť sa stane neaktívnym.

Po odstránení chýb tlačidlo vstúpiť sa stane aktívnym a používateľ bude môcť odoslať formulár na server, kde bude spracovaný.

Autorizácia užívateľa

Pripisovať hodnotu akcie autorizačný handicap má špecifikovaný súbor auth.php, to znamená, že formulár bude spracovaný v tomto súbore.

A tak otvorte súbor auth.php a napíšte kód na spracovanie autorizačného formulára. Prvá vec, ktorú musíte urobiť, je spustiť reláciu a pripojiť súbor dbconnect.php na pripojenie k databáze.

Keď kliknete na výstupný odkaz zo stránky, prejdete do súboru odhlásiť.php, kde jednoducho zničíme bunky s emailovou adresou a heslom z relácie. Potom vrátime používateľa späť na stránku, na ktorej bol odkaz kliknutý VÝCHOD.

Kód súboru logout.php:

To je všetko. Teraz viete, ako implementovať a spracovať formuláre registrácie a autorizácie používateľov na vašej webovej stránke. Tieto formuláre sa nachádzajú takmer na každej webovej stránke, takže každý programátor by mal vedieť, ako ich vytvoriť.

Naučili sme sa tiež validovať vstupné dáta, a to ako na strane klienta (v prehliadači, pomocou JavaScriptu, jQuery), tak aj na strane servera (pomocou PHP). Naučili sme sa tiež, ako zaviesť postup pri opustení lokality.

Všetky skripty boli testované a fungujú. Archív so súbormi tejto malej stránky si môžete stiahnuť z tohto odkazu.

V budúcnosti napíšem článok, kde popíšem. A tiež plánujem napísať článok, kde vysvetlím (bez opätovného načítania stránky). Takže, aby ste boli informovaní o vydaní nových článkov, môžete sa prihlásiť na odber mojej webovej stránky.

Ak máte nejaké otázky, kontaktujte ma a ak si všimnete nejakú chybu v článku, dajte mi vedieť.

Plán lekcie (5. časť):

  • Vytvorenie štruktúry HTML pre autorizačný formulár
  • Prijaté údaje spracovávame
  • V hlavičke stránky zobrazíme pozdrav používateľa
  • Páčil sa vám článok?

    Neviem prečo... nie, viem, prečo nemôžete povoliť smernicu register_globals, ale neviem, prečo sa o tom v literatúre spravidla nič nehovorí.

    V tomto článku sa pokúsim dostať z tanku všetkých, ktorí v ňom sedia, a vysvetliť, čo je čo (najmä pre tých, ktorí sú v pancierovom vlaku – pozn. redakcie). Nie nadarmo niektorí hostitelia túto smernicu deaktivujú. Takže…

    Ako to funguje

    V nastaveniach PHP (súbor php.ini) je taká direktíva register_globals. Jeho význam je, že ak je povolený (register_globals = on), tak všetky premenné odovzdané cez GET a POST budú automaticky zaregistrované ako globálne. Čo to znamená?

    Napríklad odovzdáme metóde GET skriptu index.php nejakú hodnotu stránky: index.php?page=2. Odovzdaná hodnota je uložená v poli GET a môže byť použitá v skripte ako $_GET["page"]. Ak však máme povolenú register_globals, tak sa pre odovzdanú hodnotu vytvorí premenná $page, ktorá je dostupná v ktorejkoľvek časti skriptu index.php.

    Malé zhrnutie a doplnenie. Keď je povolený register_globals, vytvoria sa tri kópie premennej: v poli GET, v poli GLOBALS a jednoducho samotná premenná ($_GET["page"], $GLOBALS["page"], $page), pričom keď je register_globals zakázaný, odovzdaná hodnota môže byť prístupná iba cez pole GET ($_GET["stránka"]). Pamätajte.

    Nebezpečenstvo používania

    Pozrime sa na jednoduchý príklad, aby sme pochopili, čo nás čaká (od 3 do 5 rokov – poznámka redakcie). Aby som to uľahčil, hneď poviem, že $login a $password sú premenné odovzdávané metódou GET/POST.

    Stručne o tom, čo robí skript:

      Riadok 2. Požiadame databázu, aby sme vytiahli skutočné heslo pre prihlásenie zadané používateľom.

      Riadok 3. Získame toto heslo a priradíme ho k premennej $real_pass.

      Riadok 4. Porovnáme skutočné a zadané heslo a ak sa zhodujú, tak premennej $check bude priradená true.

      Riadky 5-8. Ak je $check true, potom napíšeme, že autorizácia bola úspešná atď.

    Navrhovaný scenár je podľa definície najpriepustnejší na svete a teraz vám ukážem tieto diery. Podmienka: register_globals je povolený.

    Povedzme, že prevod sa vykonáva pomocou metódy GET. Potom bude adresa URL vyzerať asi takto:
    www.site.com/index.php?login =admin&password =qwerty
    Je jasné, že globálne premenné $login a $password sú okamžite vytvorené. Teraz sa pozrite na skript. Obsahuje premennú $check. Čo ak to odošlete cez URL?

    www.site.com/index.php?login =admin&password =qwerty&check =1
    Potom sa kontrola zhody hesla obíde a používateľ je okamžite autorizovaný (napokon, pamätáte si, že 1 je pravda a 0 je nepravda?). Rovnaký výsledok nastane, ak napíšeme www.stránky.com/index.php?skontrolovať =1 . A aj keď použijete metódu POST, všetky takéto podvody budú stále fungovať, pretože keď je povolený register_globals, nezáleží na tom, akú metódu použijete - GET alebo POST.

    Myslím, že niekto má otázku, ako môže cracker vedieť o kontrolnej premennej, že za všetko môže? Ak ste scenár nikomu neukázali, je nepravdepodobné, že by ho poznal. Nie každý však používa vlastné skripty, CMS atď., ale využíva to, čo je dostupné v sieti. V takýchto prípadoch môže cracker napríklad študovať kód CMS a útočiť na stránky vytvorené s jeho pomocou.

    Nie všetci hostitelia však zakážu register_globals, a aj keď sú vaše skripty navrhnuté tak, aby nemali povolené register_globals, cracker môže stále hacknúť váš skript pomocou zraniteľnosti tejto smernice.

    Vezmime si náš príklad. Na ochranu v prípade, že je povolený register_globals, za riadkom ak ($heslo==$reálny_prejsť) $skontrolovať =pravda; pridať nasledovné: ine$skontrolovať =falošný;. V tomto prípade, aj keď je kontrolná premenná rovná jednej odovzdaná metódou GET, skript stále nastaví $check=false, ak je heslo nesprávne.

    Áno, tiež by som chcel upozorniť na skutočnosť, že ak vypnete register_globals, náš príklad nebude fungovať. A aby to fungovalo, musíte napísať $login = $_POST["login"]; $password = $_POST["heslo"];

    Poďme si to zhrnúť...

    a vyvodiť dva hlavné závery:

    1) Keď je povolený register_globals, môžete odovzdať rôzne premenné, ktorých hodnoty neboli vypočítané, aby sa dostali cez GET alebo POST.

    2) Register_globals sám o sebe nie je ani tak nebezpečný ako krivo napísaný skript.

    To je na dnes všetko! Budem veľmi rád, keď uvidím vaše komentáre, pripomienky, návrhy a len spätnú väzbu. Preto píšte, nehanbite sa!

    S prianím úspešného týždňa,
    Alexander SHUYSKY