Proč je nebezpečné povolit parametr PHP register_globals? Vytvoření jednoduchého systému registrace uživatelů v PHP a MySQL Impersonal index php register

Ahoj! Nyní se pokusíme implementovat nejjednodušší registraci na webu pomocí PHP + MySQL. Chcete-li to provést, musí být na vašem počítači nainstalován Apache. Princip fungování našeho skriptu je zobrazen níže.

1. Začněme vytvořením tabulky uživatelů v databázi. Bude obsahovat uživatelská data (login a heslo). Pojďme na phpmyadmin (pokud vytváříte databázi na vašem PC http://localhost/phpmyadmin/). Vytvoříme tabulku users , bude mít 3 pole.

Já to vytvářím v databázi mysql, můžete si to vytvořit v jiné databázi. Dále nastavte hodnoty jako na obrázku:

2. Je vyžadováno připojení k této tabulce. Vytvoříme soubor bd.php. Jeho obsah:

V mém případě to vypadá takto:

Uložit bd.php .
Skvělý! V databázi máme tabulku a připojení k ní. Nyní můžete začít vytvářet stránku, na které uživatelé zanechají svá data.

3. Vytvořte soubor reg.php s obsahem (všechny komentáře uvnitř):



Registrace


Registrace


Vaše přihlašovací jméno:




Vaše heslo:








4. Vytvořte soubor, který zadá data do databáze a uloží uživatele. save_user.php (komentáře uvnitř):

5. Nyní se naši uživatelé mohou registrovat! Dále musíte vytvořit „dveře“ pro již registrované uživatele pro vstup na web. index.php (komentáře uvnitř):




Domovská stránka


Domovská stránka


Vaše přihlašovací jméno:


Vaše heslo:






Registrovat



Dobře, teď je po všem! Lekce je možná nudná, ale velmi užitečná. Zde je zobrazena pouze myšlenka registrace, poté ji můžete vylepšit: přidat zabezpečení, design, datová pole, načítání avatarů, odhlášení z účtu (k tomu jednoduše zničte proměnné z relace pomocí funkce unset) a již brzy. Hodně štěstí!

Všechno jsem zkontroloval, funguje to správně!

Reg.ru: domény a hosting

Největší registrátor a poskytovatel hostingu v Rusku.

V provozu je více než 2 miliony doménových jmen.

Propagace, doménová pošta, obchodní řešení.

Již si vybralo více než 700 tisíc zákazníků po celém světě.

*Najetím myší pozastavíte rolování.

Zpět dopředu

Vytvoření jednoduchého systému registrace uživatelů v PHP a MySQL

Vytvoření registračního systému je hodně práce. Musíte napsat kód, který ověří e-mailové adresy, odešle e-mail s potvrzením registrace a také ověří další pole formuláře a mnoho dalšího.

A i poté, co tohle všechno napíšete, se uživatelé budou zdráhat registrovat, protože... to z jejich strany vyžaduje určité úsilí.

V tomto tutoriálu vytvoříme velmi jednoduchý registrační systém, který vůbec nevyžaduje ani neukládá hesla! Výsledek bude snadné upravit a přidat na existující PHP stránky. Chcete zjistit, jak to funguje? Čtěte níže.



Náš super jednoduchý systém bude fungovat následovně:

Spojíme autorizační formulář a registraci. Tento formulář bude obsahovat pole pro zadání vaší e-mailové adresy a registrační tlačítko;
- Při vyplnění pole emailovou adresou se kliknutím na tlačítko registrace vytvoří záznam o novém uživateli, ale pouze v případě, že zadaná emailová adresa nebyla nalezena v databázi.

Poté je vytvořena náhodná jedinečná sada znaků (token), která je odeslána na e-mail zadaný uživatelem ve formě odkazu, který bude relevantní po dobu 10 minut;
- Odkaz přesměruje uživatele na naše webové stránky. Systém určí přítomnost tokenu a autorizuje uživatele;

Výhody tohoto přístupu:

Není potřeba ukládat hesla ani ověřovat pole;
- Není třeba obnovit heslo, bezpečnostní otázky atd.;
- Od chvíle, kdy se uživatel zaregistruje/přihlásí, si můžete být vždy jisti, že tento uživatel bude ve vaší přístupové zóně (že e-mailová adresa je pravdivá);
- Neuvěřitelně jednoduchý registrační proces;

nedostatky:

Zabezpečení uživatelského účtu. Pokud má někdo přístup k poště uživatele, může se přihlásit.
- E-mail není bezpečný a může být zachycen. Mějte na paměti, že tato otázka je relevantní i v případě, kdy bylo heslo zapomenuto a je třeba jej obnovit, nebo v jakémkoli autorizačním systému, který pro přenos dat nepoužívá HTTPS (login/heslo);
- Zatímco správně nakonfigurujete svůj poštovní server, existuje možnost, že zprávy s autorizačními odkazy skončí ve spamu;

Srovnáním výhod a nevýhod našeho systému lze konstatovat, že systém má vysokou použitelnost (maximální pohodlí pro koncového uživatele) a zároveň nízký bezpečnostní ukazatel.

Proto se doporučuje používat jej pro registrace na fórech a ve službách, které nepracují s důležitými informacemi.

Jak používat tento systém

V případě, že potřebujete pouze použít systém k autorizaci uživatelů na vašem webu a nechcete tuto lekci rozebírat na kusy, musíte udělat toto:

Musíte si stáhnout zdroje připojené k lekci
- Najděte v archivu soubor tables.sql a importujte jej do své databáze pomocí možnosti importu v phpMyAdmin. Alternativní způsob: otevřete tento soubor pomocí textového editoru, zkopírujte SQL dotaz a spusťte jej;
- Otevřete include/main.php a vyplňte nastavení pro připojení k vaší databázi (uveďte uživatele a heslo pro připojení k databázi a také hostitele a název databáze). Ve stejném souboru musíte také zadat e-mail, který bude použit jako původní adresa pro zprávy odesílané systémem. Někteří hostitelé blokují odchozí e-maily, pokud formulář neobsahuje skutečnou e-mailovou adresu, která byla vytvořena z ovládacího panelu hostitele, takže zadejte skutečnou adresu;
- Nahrajte všechny soubory index.php, protected.php a aktiva a složky přes FTP do vašeho hostitele;
- Přidejte níže uvedený kód na každou stránku PHP, kde chcete zobrazit přihlašovací formulář;

Require_once "includes/main.php"; $user = nový uživatel(); if(!$user->loggedIn())( redirect("index.php"); )
- Připraveno!

Koho zajímá, jak to celé funguje, čtěte níže!

Prvním krokem je zapsání HTM kódu pro autorizační formulář. Tento kód se nachází v souboru index.php. Tento soubor také obsahuje PHP kód, který zpracovává data formulářů a další užitečné funkce přihlašovacího systému. Více se o tom můžete dozvědět v sekci níže věnované recenzi kódu PHP.

index.php

Tutoriál: Super jednoduchý registrační systém s PHP a MySQL Přihlášení nebo registrace

Výše zadejte svou e-mailovou adresu a my vám zašleme
máte přihlašovací odkaz.

Přihlášení/Registrace

Do sekce head (mezi tagy a) jsem zahrnul hlavní styly (v tomto tutoriálu se jimi nezabývají, takže se na ně můžete podívat sami. Folder assets/css/style.css). Před uzavírací značku jsem zařadil knihovnu jQuery a soubor script.js, které napíšeme a analyzujeme níže.


JavaScript

jQuery pomocí funkce sleduje stav tlačítka „Registrovat/Přihlásit se“. e.preventDefault() a odesílá požadavky AJAX. V závislosti na odpovědi serveru zobrazí jednu nebo druhou zprávu a určí další akce/

aktiva/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("načítání"); )); $(document).ajaxComplete(function()) ( form. removeClass("načítání"); )); ));

byl přidán do formuláře pro zobrazení aktuálního stavu požadavku AJAX (to bylo umožněno díky metodám ajaxStart()) A ajaxComplete(), který najdete na konci souboru).

Tato třída zobrazuje rotující animovaný soubor GIF (jako by nám chtěl naznačit, že požadavek se zpracovává), a také funguje jako příznak, který zabrání opětovnému odeslání formuláře (když již bylo jednou kliknuto na tlačítko registrace). Třída .loggedIn je dalším příznakem – nastavuje se při odeslání e-mailu. Tento příznak okamžitě zablokuje jakékoli další akce s formulářem.

Schéma databáze

Náš neuvěřitelně jednoduchý logovací systém používá 2 MySQL tabulky (SQL kód je v souboru tables.sql). První ukládá data o uživatelských účtech. Druhý ukládá informace o počtu pokusů o přihlášení.


Schéma uživatelské tabulky.

Systém nepoužívá hesla, jak je vidět na schématu. Na něm můžete vidět sloupec tokenů s tokeny sousedícími se sloupcem token_validity. Token se nainstaluje, jakmile se uživatel připojí k systému a nastaví svůj email pro odesílání zprávy (více o tom v dalším bloku). Sloupec token_validity nastavuje čas o 10 minut později, po kterém token již není platný.


Schéma tabulky, které počítá počet pokusů o autorizaci.

V obou tabulkách je IP adresa uložena ve zpracované podobě pomocí funkce ip2long v poli typu integer.

Nyní můžeme napsat nějaký PHP kód. Hlavní funkcionalita systému je přiřazena třídě User.class.php, kterou můžete vidět níže.

Tato třída aktivně využívá idorm (docs), tyto knihovny jsou minimálními nezbytnými nástroji pro práci s databázemi. Zajišťuje přístup k databázi, generování tokenů a ověřování tokenů. Poskytuje jednoduché rozhraní, které usnadňuje připojení registračního systému k vašemu webu, pokud používá PHP.

User.class.php

Class User( // Private ORM case private $orm; /** * Najít uživatele podle tokenu. Ke zvážení jsou přijímány pouze platné tokeny. Token je generován pouze po dobu 10 minut od okamžiku, kdy byl vytvořen * @param string $token . Toto je ten, který hledáme token * @return User Vrátí hodnotu uživatelské funkce */ veřejná statická funkce findByToken($token)( // vyhledejte token v databázi a ujistěte se, že je nastaveno správné časové razítko $result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("platnost_tokenu > NOW()") ->find_one(); if(!$result)( return false; ) return new User($result); ) /** * Autorizujte nebo registrujte uživatele * @param string $email. E-mailová adresa uživatele * @return User */ veřejná statická funkce loginOrRegister($email)( // Pokud takový uživatel již existuje, vrátí hodnotu funkce Uživatel ze zadané e-mailové adresy uložené v databázi if(User::exists($email))( return new User($email); ) // V opačném případě vytvořte nového uživatele v databázi a vrátí hodnotu funkce User::create ze zadaného emailu return User::create($email ); ) /** * Vytvořte nového uživatele a uložte do databáze * @param string $email. E-mailová adresa uživatele * @return User */ private static function create($email)( // Napište nového uživatele a vraťte výsledek funkce User z těchto hodnot ​​$result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Zkontrolujte, zda takový uživatel existuje v databázi a vraťte booleovskou hodnotu proměnná * @param řetězec $email. E-mailová adresa uživatele * @return boolean */ veřejná statická funkce existuje($email)( // Existuje uživatel v databázi? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Vytvořte nový uživatelský objekt * @param instance $param ORM , id, email nebo 0 * @return User */ public function __construct($param = null) ( if($param instanceof ORM)( // kontrola ORM prošla $this->orm = $param; ) else if(is_string($param))( // Kontrola e-mailu prošla $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // hodnota proměnné $param je předán identifikátoru uživatele $id = $param; ) else if(isset($_SESSION["loginid"]))( // Jinak viz session $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Vygeneruje nový autorizační token SHA1, zapíše jej do databáze a vrátí jeho hodnotu * @return string */ public function generationToken( )( // Vygenerování tokenu pro oprávněného uživatele a jeho uložení do databáze $token = sha1($this->email.time().rand(0, 1000000)); // Uložte token do databáze // A označte jej tak, aby byl platný pouze na dalších 10 minut $this->orm->set("token", $token); $this->orm->set_expr("platnost_tokenu", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); vrátit $token; ) /** * Autorizujte uživatele * @return void */ public function login())( // Označte uživatele jako přihlášeného $_SESSION["loginid"] = $this->orm->id; // Aktualizujte hodnota databázového pole last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Zničit relaci a odhlásit uživatele * @return void */ odhlášení z veřejné funkce ()( $_SESSION = array(); unset($_SESSION); ) /** * Zkontrolujte, zda je uživatel přihlášen * @return boolean */ veřejná funkce přihlášen())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Zkontroluje, zda je uživatel administrátorem * @return boolean */ public function isAdmin())( return $this->rank() = = "administrator"; ) /** * Najděte typ uživatele, může to být buď administrátor nebo normální * @return string */ public function rank())( pokud ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Metoda, která umožňuje získat soukromé informace uživatele jako * vlastnosti objektu User * @ param string $key Název vlastnosti, která získá přístup * @return mixed */ public function __get($key)( if(isset($this->orm->$key))( return $this->orm-> $klíč; ) return null; ))

Tokeny jsou generovány pomocí algoritmu SHA1 a ukládány do databáze. Používám funkce časování MySQL k nastavení 10minutového časového limitu pro platnost tokenu.

Když je token ověřen, říkáme přímo obsluze, že bereme v úvahu pouze tokeny, které ještě nevypršely, uložené ve sloupci token_validity.

Vezměte prosím na vědomí, že používám magickou metodu __dostat Knihovna dokumentů na konci souboru pro zachycení přístupu k vlastnostem objektu User.

Díky tomu je možné přistupovat k informacím uloženým v databázi díky vlastnostem $user->email, $user->token atd. V dalším fragmentu kódu se podíváme na to, jak tyto třídy použít jako příklad .


Chráněná stránka

Dalším souborem, který uchovává užitečné a potřebné funkce, je soubor functions.php. Existuje několik tzv. pomocníků – pomocných funkcí, které umožňují vytvářet čistší a čitelnější kód v jiných souborech.

funkce.php

Funkce send_email($from, $to, $subject, $message)( // Pomocník, který odesílá e-maily $headers = "MIME-Version: 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čení URL souboru 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"]; ) return $url; ) funkce rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Počet pokusů o přihlášení na tuto 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 pokusů o přihlášení za posledních 10 minut na této 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("Příliš mnoho pokusů o přihlášení!"); ) ) funkce rate_limit_tick($ip, $email)( // Vytvořte nový záznam v tabulce který počítá počet pokusů o přihlášení $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; )

Funkce sazba_limit A rate_limit_tick sledovat počet autorizačních pokusů za uplynulou dobu od prvního pokusu. Pokus o přihlášení se zaznamená do databáze ve sloupci reg_login_attempt. Tyto funkce jsou volány při zpracování a odeslání dat formuláře, jak můžete vidět z následujícího fragmentu kódu.

Níže uvedený kód je převzat ze souboru index.php a zpracovává odeslání formuláře. Vrací odpověď JSON, kterou zase zpracuje jQuery v souboru assets/js/script.js, na který jsme se podívali dříve.

index.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Výstup záhlaví JSON("Content-type: application/json"); // Je tato e-mailová adresa platná, pokud (!isset($_POST["e-mail"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Zadejte prosím platný e-mail."); ) // Zkontrolujte. Je uživatel se může přihlásit, překročil počet povolených připojení? (soubor Functions.php pro více informací) rate_limit($_SERVER["REMOTE_ADDR"]); // Zaznamenat tento pokus o přihlášení rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Odeslání e-mailu uživateli $message = ""; $email = $_POST["e-mail"]; $subject = "Váš odkaz na přihlášení"; if(!User:: existuje($email) )( $subject = "Děkujeme za registraci!"; $message = "Děkujeme za registraci na našem webu!\n\n"; ) // Pokus o autorizaci nebo registraci uživatele $user = Uživatel ::loginOrRegister($_POST[ "e-mail"]); $message.= "Můžete se přihlásit z této adresy URL:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Platnost odkazu vyprší automaticky po 10 minutách."; $result = send_email($fromEmail, $_POST["e-mail"], $předmět, $zpráva); if(!$result)( throw new Exception("Při odesílání vašeho e-mailu došlo k chybě. Zkuste to prosím znovu."); ) die(json_encode(array("message" => "Děkujeme! Poslali jsme odkaz) do vaší doručené pošty. Zkontrolujte také složku se spamem."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage()) )));)

Po úspěšném přihlášení/registraci odešle výše uvedený kód uživateli odkaz pro přihlášení. Token bude dostupný, protože je předávána jako proměnná ve vygenerovaném odkazu metodou $_GET se značkou tkn

index.php

If(isset($_GET["tkn"]))( // Je tento token platný pro autorizaci? $user = User::findByToken($_GET["tkn"]); if($user)( // Ano , je. Přesměrování na chráněnou stránku $user->login(); redirect("protected.php"); ) // Ne, token není platný. Přesměrování na stránku s autorizačním/registračním formulářem redirect("index. php");)

$user->login()

vytvoří potřebné proměnné pro relaci, takže uživatel, který si prohlíží následující stránky webu, zůstane vždy autorizovaný.

Zpracování funkce pro ukončení systému je uspořádáno podobným způsobem.

index.php

If(isset($_GET["logout"]))( $user = nový uživatel(); if($user->loggedIn())( $user->logout(); ) redirect("index.php") ;)

Na konci kódu jsem opět nastavil přesměrování na index.php, tedy parametr ?logout=1 přenos přes URL není vyžadován.

Náš soubor index.php vyžaduje další. ochrana - nechceme, aby lidé, kteří se přihlásili do systému, znovu viděli registrační formulář. Pro tyto účely používáme metodu $user->loggedIn().

index.php

$user = nový uživatel(); if($user->loggedIn())( redirect("protected.php"); )

Nakonec je zde část kódu, která vám umožní chránit stránky vašeho webu a zpřístupnit je pouze po autorizaci.

protected.php

// Pro ochranu každé stránky na vašem webu zahrňte soubor main.php // a vytvořte nový objekt uživatele. Takhle je to snadné! require_once "includes/main.php"; $user = nový uživatel(); if(!$user->loggedIn())( redirect("index.php"); )

Po této kontrole si můžete být jisti, že uživatel byl úspěšně autorizován. K uloženým informacím v databázi můžete také přistupovat pomocí vlastností objektu $user. Chcete-li zobrazit e-mail a stav uživatele, použijte tento kód:

Echo "Váš email: ".$user->email; echo "Vaše hodnost: ".$user->rank();

Metoda hodnost() se zde používá proto, že databáze obvykle ukládá čísla (0 pro běžného uživatele, 1 pro administrátora) a tato data potřebujeme převést do stavů, ke kterým patří, v čemž nám tato metoda pomáhá.

Chcete-li z běžného uživatele udělat správce, jednoduše upravte záznam uživatele prostřednictvím phpMyAdmin (nebo jiného programu, který vám umožňuje spravovat databáze). Status správce neuděluje žádná oprávnění; v tomto příkladu se na stránce zobrazí, že jste správce – a to je vše.

Co s tím ale uděláte, je ponecháno na vašem uvážení, můžete sami napsat a sestavit kód, který nastaví určitá oprávnění a možnosti pro administrátory.

Jsme hotovi!

S tímto neuvěřitelně super kvazi jednoduchým tvarem jsme skončili! Můžete jej použít na svých PHP stránkách, je to docela jednoduché. Můžete si ho také upravit pro sebe a udělat si ho tak, jak chcete.

Materiál připravil Denis Malyshok speciálně pro web

P.S. Chcete se posunout dále v ovládání PHP a OOP? Věnujte pozornost prémiovým lekcím o různých aspektech tvorby webových stránek, včetně programování v PHP, a také bezplatnému kurzu vytváření vlastního CMS systému v PHP od nuly pomocí OOP:

Líbil se vám materiál a chcete mi poděkovat?
Stačí sdílet se svými přáteli a kolegy!


Vzhledem k tomu, že se velmi často objevují dotazy na globální proměnné a problémy spojené s deaktivací direktivy register_globals, pokusíme se v tomto článku toto téma trochu pokrýt.

Nejprve si definujme, co jsou externí proměnné. Jedná se o libovolné proměnné, které do programu přicházejí zvenčí, tzn. nejsou definovány v samotném programu. U php skriptu jsou všechny proměnné, které jsou předávány přes řádek prohlížeče nebo přes formulář, externí.
Podívejme se, jak vznikají.

Pokud je na serveru (v php.ini) povolena direktiva register_globals = On, pak se při předávání proměnných přes formulář nebo přes řádek prohlížeče ve skriptu, kterému jsou tyto proměnné určeny, automaticky vytvoří. Tito. pokud máte na řádku prohlížeče napsáno: www.server.ru/index.php?var=1, pak se ve skriptu index.php automaticky vytvoří proměnná $var s hodnotou rovnou 1.

Komentář

Tato směrnice je jedním z nejkontroverznějších bodů v jazyce PHP. Na jedné straně může jeho použití skutečně způsobit skutečné problémy s ochranou PHP skriptů, pokud nejsou řádně zohledněny případné chybové situace, a mnoho vývojářů správně poznamenává, že psaní skriptů bez použití globálních proměnných snižuje zranitelnost skriptů vůči různé typy útoků o 90 %. Na druhou stranu na úsvitu PHP důvěřovalo vývojářům jazyků více než tisíc uživatelů (do PHP 4.3 byla tato direktiva standardně povolena), díky čemuž v současnosti existují miliony skutečně fungujících skriptů napsaných pomocí globálních proměnných (tj. stojí za zmínku, že pro vzdělávací účely se někdy zcela vyplatí psát skripty pomocí globálních proměnných, protože jejich nahrazení superglobálními poli značně zhoršuje čitelnost kódu).

V současné době má většina poskytovatelů hostitelů tuto direktivu povolenou a pravděpodobně zůstane povolená ještě dlouho, protože jinak může narušit kontinuitu kódu.

Když je direktiva register_globals zakázána, přístup k takovým proměnným je možný dvěma způsoby:

  • přes asociativní pole HTTP_***_VARS (HTTP_POST_VARS atd.)
  • prostřednictvím superglobálních polí ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES atd.)

Superglobální pole jsou k dispozici v jakémkoli rozsahu. Vývojáři PHP doporučují vypnout na serveru direktivu register_globals a pracovat s proměnnými prostřednictvím superglobálních polí. Toto doporučení je způsobeno bezpečnostními problémy, které mohou nastat, když je povolena direktiva register_globals.

Ačkoli až donedávna zůstala direktiva register_globals povolena na hostitelských webech. Situace se začala měnit s vydáním PHP 5, kde je tato direktiva standardně zakázána a hostitelé s jejím povolením nespěchají (možná právem).

Takže, co přesně byste měli udělat, abyste získali proměnné? Musíte je vzít ze superglobálních polí. Chcete-li například získat proměnné předané řádkem prohlížeče, použijte pole $_GET. Řekněme, že řádek prohlížeče říká www.server.ru/index.php?var=1. Chcete-li získat proměnnou var v index.php, musíte napsat:

$var=$_GET["var"];

A například pro příjem proměnných přenesených z formuláře pomocí metody POST musíte do skriptu obslužného programu formuláře napsat:

$var=$_POST["var"];

V tomto článku se dozvíte, jak vytvořit registrační a přihlašovací formulář pomocí HTML, JavaScript, PHP a MySql. Takové formuláře se používají téměř na každém webu bez ohledu na jeho typ. Jsou vytvořeny pro fórum, internetový obchod, sociální sítě (jako je Facebook, Twitter, Odnoklassniki) a mnoho dalších typů stránek.

Pokud máte webovou stránku na svém místním počítači, doufám, že již máte nainstalovaný a spuštěný místní server. Bez toho nebude nic fungovat.

Vytvoření tabulky v databázi

Abychom mohli implementovat registraci uživatelů, potřebujeme nejprve databázi. Pokud už to máte, tak skvělé, jinak si to musíte vytvořit. V článku podrobně vysvětluji, jak na to.

A tak máme databázi (zkráceně DB), nyní musíme vytvořit tabulku uživatelů do kterého přidáme naše registrované uživatele.

V článku jsem také vysvětlil, jak vytvořit tabulku v databázi. Před vytvořením tabulky si musíme určit, jaká pole bude obsahovat. Tato pole budou odpovídat polím z registračního formuláře.

Tak jsme si řekli, představili si, jaká pole bude mít náš formulář, a vytvořili jsme tabulku uživatelů s těmito poli:

  • id- Identifikátor. Pole id Každá tabulka v databázi by ho měla mít.
  • jméno- Chcete-li uložit jméno.
  • příjmení- Pro zachování příjmení.
  • e-mailem- Chcete-li uložit poštovní adresu. Jako přihlašovací jméno použijeme e-mail, takže toto pole musí být jedinečné, to znamená mít UNIKÁTNÍ index.
  • stav_e-mailu- Pole pro označení, zda je e-mail potvrzený nebo ne. Pokud je mail potvrzen, bude mít hodnotu 1, jinak je hodnota 0.
  • Heslo- Chcete-li uložit heslo.


Pokud chcete, aby váš registrační formulář obsahoval další pole, můžete je také přidat zde.

To je ono, náš stůl uživatelů připraven. Pojďme k další fázi.

Připojení k databázi

Vytvořili jsme databázi, nyní se k ní potřebujeme připojit. Připojíme se pomocí PHP rozšíření MySQLi.

Ve složce našeho webu vytvořte soubor s názvem dbconnect.php a napište do něj následující skript:

Tento soubor dbconnect.php bude nutné připojit k obslužným rutinám formulářů.

Všimněte si proměnné $address_site, zde jsem uvedl název mého testovacího webu, na kterém budu pracovat. Uveďte prosím odpovídajícím způsobem název svého webu.

Struktura webu

Nyní se podíváme na HTML strukturu našeho webu.

Přesuneme záhlaví a zápatí webu do samostatných souborů, hlavička.php A zápatí.php. Uvedeme je na všech stránkách. A to na hlavní stránce (soubor index.php), na stránku s registračním formulářem (soubor formulář_registr.php) a na stránku s autorizačním formulářem (soubor form_auth.php).

Blokujte pomocí našich odkazů, Registrace A oprávnění, přidejte je do záhlaví webu, aby se zobrazily na všech stránkách. Jeden odkaz vstoupí na stránku s registračním formulářem (soubor formulář_registr.php) a druhý na stránku s autorizačním formulářem (soubor form_auth.php).

Obsah souboru header.php:

Název našeho webu

V důsledku toho naše hlavní stránka vypadá takto:


Vaše stránky mohou mít samozřejmě úplně jinou strukturu, ale to pro nás nyní není důležité. Hlavní věc je, že existují odkazy (tlačítka) pro registraci a autorizaci.

Nyní přejdeme k registračnímu formuláři. Jak jste již pochopili, máme to v evidenci formulář_registr.php.

Přejděte do Databáze (v phpMyAdmin), otevřete strukturu tabulky uživatelů a podívejte se, jaká pole potřebujeme. To znamená, že potřebujeme pole pro zadání jména a příjmení, pole pro zadání poštovní adresy (Email) a pole pro zadání hesla. A z bezpečnostních důvodů přidáme pole pro zadání captcha.

Na serveru může v důsledku zpracování registračního formuláře dojít k různým chybám, kvůli kterým se uživatel nebude moci zaregistrovat. Proto, aby uživatel pochopil, proč se registrace nezdaří, je nutné zobrazovat zprávy o těchto chybách.

Před zobrazením formuláře přidejte blok pro zobrazení chybových zpráv z relace.

A ještě jedna věc, pokud je uživatel již autorizován a ze zvědavosti přejde na registrační stránku přímo napsáním do adresního řádku prohlížeče site_address/form_register.php, pak v tomto případě místo registračního formuláře zobrazíme hlavičku, že je již registrován.

Obecně platí, že kód souboru formulář_registr.php máme toto:

Již jste zaregistrováni

V prohlížeči vypadá stránka s registračním formulářem takto:


Pomocí požadovaného atributu jsme učinili všechna pole povinná.

Věnujte pozornost kódu registračního formuláře, kde se zobrazuje captcha:


Cestu k souboru jsme zadali v hodnotě atributu src pro obrázek captcha.php, který generuje tento captcha.

Podívejme se na kód souboru captcha.php:

Kód je dobře komentovaný, takže se zaměřím pouze na jeden bod.

Uvnitř funkce imageTtfText(), je určena cesta k písmu verdana.ttf. Aby tedy captcha fungovala správně, musíme vytvořit složku fonty a umístěte tam soubor písma verdana.ttf. Můžete jej najít a stáhnout z internetu, nebo si jej převzít z archivu s materiály tohoto článku.

Se strukturou HTML jsme skončili, je čas jít dál.

Kontrola platnosti emailu pomocí jQuery

Jakýkoli formulář potřebuje zkontrolovat platnost zadaných údajů, a to jak na straně klienta (pomocí JavaScriptu, jQuery), tak na straně serveru.

Zvláštní pozornost musíme věnovat poli Email. Je velmi důležité, aby byla zadaná poštovní adresa platná.

U tohoto vstupního pole nastavujeme typ emailu (type="email"), to nás mírně varuje před nesprávným formátem. To ale nestačí, protože prostřednictvím inspektoru kódu, který nám prohlížeč poskytuje, můžeme snadno změnit hodnotu atributu typ S e-mailem na text, a to je vše, náš šek již nebude platný.


A v tomto případě musíme provést spolehlivější kontrolu. K tomu nám poslouží knihovna jQuery z JavaScriptu.

Chcete-li připojit knihovnu jQuery, v souboru hlavička.php mezi tagy , před závěrečnou značkou , přidejte tento řádek:

Ihned za tento řádek přidáme ověřovací kód e-mailu. Zde přidáme kód pro kontrolu délky zadaného hesla. Jeho délka musí být alespoň 6 znaků.

Pomocí tohoto skriptu zkontrolujeme platnost zadané emailové adresy. Pokud uživatel zadal nesprávný e-mail, zobrazíme o tom chybovou zprávu a deaktivujeme tlačítko pro odeslání formuláře. Pokud je vše v pořádku, pak chybu odstraníme a aktivujeme tlačítko odeslání formuláře.

Tím máme hotovou validaci formuláře na straně klienta. Nyní jej můžeme odeslat na server, kde také provedeme pár kontrol a přidáme data do databáze.

Registrace uživatele

Formulář odesíláme do souboru ke zpracování register.php, prostřednictvím metody POST. Název tohoto souboru manipulátoru je uveden v hodnotě atributu akce. A způsob odeslání je uveden v hodnotě atributu metoda.

Otevřete tento soubor register.php a první věc, kterou musíme udělat, je napsat funkci spuštění relace a připojit soubor, který jsme vytvořili dříve dbconnect.php(V tomto souboru jsme provedli připojení k databázi). A také okamžitě deklarujme buňky chybové_zprávy A úspěšné_zprávy v poli globálních relací. V error_mesages zaznamenáme všechny chybové zprávy, které se vyskytnou během zpracování formuláře, a v úspěšné_zprávy, budeme zaznamenávat radostné zprávy.

Než budeme pokračovat, musíme zkontrolovat, zda byl formulář vůbec odeslán. Útočník se může podívat na hodnotu atributu akce z formuláře a zjistěte, který soubor tento formulář zpracovává. A může mít nápad přejít přímo na tento soubor zadáním následující adresy do adresního řádku prohlížeče: http://adresa_webu/register.php

Potřebujeme tedy vyhledat buňku v globálním poli POST, jejíž název odpovídá názvu našeho tlačítka „Registrovat“ z formuláře. Tímto způsobem zkontrolujeme, zda bylo kliknuto na tlačítko "Registrovat" nebo ne.

Pokud se útočník pokusí přejít přímo k tomuto souboru, zobrazí se mu chybová zpráva. Dovolte mi připomenout, že proměnná $address_site obsahuje název webu a byl deklarován v souboru dbconnect.php.

Hodnota captcha v relaci byla přidána při jejím vygenerování do souboru captcha.php. Pro připomenutí vám znovu ukážu tento kus kódu ze souboru captcha.php, kde je k relaci přidána hodnota captcha:

Nyní přistoupíme k samotnému ověření. V souboru register.php, uvnitř bloku if, kde zkontrolujeme, zda bylo kliknuto na tlačítko "Registrovat", nebo spíše tam, kde je uveden komentář "" // (1) Prostor pro další část kódu"píšeme:

//Zkontrolujte přijaté captcha //Ořízněte mezery od začátku a konce řádku $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Porovnejte přijatou hodnotu s hodnotou z relace. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Pokud není captcha správné, vrátíme uživatele na registrační stránku a tam mu zobrazíme chybovou zprávu, že zadal nesprávný captcha $error_message = "

Chyba! Zadali jste nesprávný obrázek captcha

"; // Uložte chybovou zprávu do relace. $_SESSION["error_messages"] = $error_message; // Vraťte uživatele na registrační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: " .$address_site ."/form_register.php"); //Zastavení skriptu exit(); ) // (2) Místo pro další část kódu )else( //Pokud není předán captcha nebo je prázdný, exit ("

Chyba! Neexistuje žádný ověřovací kód, tedy captcha kód. Můžete přejít na hlavní stránku.

"); }

Dále musíme zpracovat přijatá data z pole POST. Nejprve musíme zkontrolovat obsah globálního pole POST, tedy zda tam jsou buňky, jejichž názvy odpovídají názvům vstupních polí z našeho formuláře.

Pokud buňka existuje, pak ořízneme mezery od začátku a konce řádku z této buňky, jinak uživatele přesměrujeme zpět na stránku s registračním formulářem.

Dále po oříznutí mezer přidáme řádek do proměnné a zkontrolujeme prázdnotu této proměnné, pokud není prázdná, pokračujeme dále, jinak uživatele přesměrujeme zpět na stránku s registračním formulářem.

Vložte tento kód do určeného umístění" // (2) Místo pro další část kódu".

/* Zkontrolujte, zda jsou data odeslaná z formuláře v globálním poli $_POST a zabalte odeslaná data do běžných proměnných.*/ if(isset($_POST["first_name"]))( //Ořízněte mezery od začátku a konec řetězce $first_name = trim($_POST["first_name"]); //Zkontrolujte, zda je proměnná prázdná if(!empty($first_name))( // Pro jistotu převeďte speciální znaky na HTML entity $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Uložte chybovou zprávu do relace. $_SESSION["error_messages"] .= "

Zadejte své jméno

Chybí pole pro jméno

"; //Vrátí uživatele na registrační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Zastavení skriptu exit(); ) if( isset($_POST["last_name"]))( //Oříznout mezery od začátku a konce řádku $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // Pro zabezpečení převeďte speciální znaky na HTML entity $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Uložte chybovou zprávu do relace. $_SESSION["error_messages"] .= "

Prosím zadejte své příjmení

"; //Vrátí uživatele na registrační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Zastavení skriptu exit(); ) )else ( // Uložte chybovou zprávu do relace. $_SESSION["error_messages"] .= "

Chybí pole příjmení

"; //Vrátí uživatele na registrační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Zastavení skriptu exit(); ) if( isset($_POST["e-mail"]))( //Oříznout mezery od začátku a konce řádku $email = trim($_POST["e-mail"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Umístění kódu pro kontrolu formátu e-mailové adresy a její jedinečnosti )else( // Uložte chybovou zprávu do relace. $_SESSION["error_messages"] .= "

Vložte svůj e-mail

"; //Vrátí uživatele na registrační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Zastavení skriptu exit(); ) )else ( // Uložte chybovou zprávu do relace. $_SESSION["error_messages"] .= "

"; //Vrátí uživatele na registrační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Zastavení skriptu exit(); ) if( isset($_POST["heslo"]))( //Oříznout mezery od začátku a konce řetězce $password = trim($_POST["heslo"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Zašifrujte heslo $password = md5($password."top_secret"); )else( // Uložte chybovou zprávu do relace. $_SESSION["error_messages"] .= "

Zadejte heslo

"; //Vrátí uživatele na registrační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Zastavení skriptu exit(); ) )else ( // Uložte chybovou zprávu do relace. $_SESSION["error_messages"] .= "

"; //Vrátí uživatele na registrační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Zastavení skriptu exit(); ) // (4) Místo pro kód pro přidání uživatele do databáze

Zvláštní význam má pole e-mailem. Musíme zkontrolovat formát přijaté poštovní adresy a její jedinečnost v databázi. To znamená, je již registrován nějaký uživatel se stejnou e-mailovou adresou?

Na určeném místě" // (3) Umístění kódu pro kontrolu formátu poštovní adresy a její jedinečnosti“ přidejte následující kód:

//Zkontrolujte formát přijaté e-mailové adresy pomocí regulárního výrazu $reg_email = "/^**@(+(*+)*\.)++/i"; //Pokud formát přijaté e-mailové adresy neodpovídá regulárnímu výrazu if(!preg_match($reg_email, $email))( // Uložte chybovou zprávu do relace. $_SESSION["error_messages"] .= "

Zadali jste nesprávný email

"; //Vrátí uživatele na registrační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Zastavení skriptu exit(); ) // Zkontrolujeme, zda je taková adresa již v databázi. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /Pokud je počet přijatých přesně jeden řádek, což znamená, že uživatel s touto e-mailovou adresou je již registrován if($result_query->num_rows == 1)( //Pokud výsledný výsledek není nepravdivý if(($row = $result_query->fetch_assoc()) != false) ( // Uložte chybovou zprávu do relace. $_SESSION["error_messages"] .= "

Uživatel s touto e-mailovou adresou je již zaregistrován

"; //Vrátí uživatele na registrační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); )else( // Uložte chybovou zprávu do relace . $_SESSION["error_messages"] .= "

Chyba v dotazu na databázi

"; //Vrátí uživatele na stránku registrace header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); ) /* uzavření výběru */ $ result_query-> close(); //Zastavení skriptu exit(); ) /* uzavření výběru */ $result_query->close();

A tak jsme se všemi kontrolami hotovi, je čas přidat uživatele do databáze. Na určeném místě" // (4) Místo pro kód pro přidání uživatele do databáze“ přidejte následující kód:

//Dotaz na přidání uživatele do databáze $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žte chybovou zprávu do relace. $_SESSION["error_messages"] .= "

Chyba v požadavku na přidání uživatele do databáze

"; //Vrátí uživatele na registrační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Zastavení skriptu exit(); )else( $_SESSION["success_messages"] = "

Registrace úspěšně dokončena!!!
Nyní se můžete přihlásit pomocí svého uživatelského jména a hesla.

"; //Odeslat uživatele na autorizační stránku header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_auth.php"); ) /* Dokončení požadavku */ $ result_query_insert-> close(); //Uzavření připojení k databázi $mysqli->close();

Pokud došlo k chybě v požadavku na přidání uživatele do databáze, přidáme do relace zprávu o této chybě a vrátíme uživatele na registrační stránku.

V opačném případě, pokud vše proběhlo v pořádku, přidáme k relaci také zprávu, ale tentokrát je to příjemnější, konkrétně uživateli sdělíme, že registrace proběhla úspěšně. A přesměrujeme ho na stránku s autorizačním formulářem.

Skript pro kontrolu formátu e-mailové adresy a délky hesla je v souboru hlavička.php, tak to bude platit i pro pole z tohoto formuláře.

Relace je také spuštěna v souboru hlavička.php, tedy v souboru form_auth.php Není třeba spouštět relaci, protože se zobrazí chyba.


Jak jsem již řekl, funguje zde i skript pro kontrolu formátu emailové adresy a délky hesla. Pokud tedy uživatel zadá nesprávnou e-mailovou adresu nebo krátké heslo, okamžitě se mu zobrazí chybová zpráva. Tlačítko vejít do se stane neaktivní.

Po opravě chyb tlačítko vejít do se stane aktivní a uživatel bude moci odeslat formulář na server, kde bude zpracován.

Autorizace uživatele

Přiřadit hodnotu akce autorizační handicap má specifikovaný soubor auth.php, to znamená, že formulář bude zpracován v tomto souboru.

A tak otevřete soubor auth.php a napište kód pro zpracování autorizačního formuláře. První věc, kterou musíte udělat, je spustit relaci a připojit soubor dbconnect.php pro připojení k databázi.

Když kliknete na výstupní odkaz z webu, přejdeme do souboru logout.php, kde jednoduše zničíme buňky s emailovou adresou a heslem z relace. Poté vrátíme uživatele zpět na stránku, na které byl odkaz kliknut výstup.

Kód souboru logout.php:

To je vše. Nyní víte, jak implementovat a zpracovávat registrační a autorizační formuláře uživatelů na vašem webu. Tyto formuláře se nacházejí téměř na každém webu, takže každý programátor by měl vědět, jak je vytvořit.

Naučili jsme se také validovat vstupní data, a to jak na straně klienta (v prohlížeči, pomocí JavaScriptu, jQuery), tak na straně serveru (pomocí PHP). Také jsme se naučili, jak implementovat postup pro opuštění webu.

Všechny skripty byly testovány a fungují. Archiv se soubory tohoto malého webu si můžete stáhnout z tohoto odkazu.

V budoucnu napíšu článek, kde budu popisovat. A také plánuji napsat článek, kde vysvětlím (bez opětovného načítání stránky). Takže, abyste byli informováni o vydání nových článků, můžete se přihlásit k odběru mých webových stránek.

Pokud máte nějaké dotazy, kontaktujte mě, a pokud si všimnete nějaké chyby v článku, dejte mi vědět.

Plán lekce (část 5):

  • Vytvoření struktury HTML pro autorizační formulář
  • Přijatá data zpracováváme
  • V záhlaví webu zobrazíme pozdrav uživatele
  • Líbil se vám článek?

    Nevím proč... ne, vím, proč nemůžete povolit direktivu register_globals, ale nevím, proč se o tom v literatuře zpravidla nic neříká.

    V tomto článku se pokusím dostat z tanku všechny, kteří v něm sedí, a vysvětlit, co je co (zejména pro ty, kteří jsou v obrněném vlaku – pozn. red.). Ne nadarmo někteří hostitelé tuto direktivu deaktivují. Tak…

    Jak to funguje

    V nastavení PHP (soubor php.ini) je taková direktiva register_globals. Jeho význam spočívá v tom, že pokud je povoleno (register_globals = on), pak všechny proměnné předávané pomocí GET a POST budou automaticky zaregistrovány jako globální. Co to znamená?

    Například předáme metodě GET skriptu index.php nějakou hodnotu stránky: index.php?page=2. Předaná hodnota je uložena v poli GET a lze ji použít ve skriptu jako $_GET["page"]. Pokud však máme povoleno register_globals, pak se pro předávanou hodnotu vytvoří proměnná $page, která je dostupná v libovolné části skriptu index.php.

    Malé shrnutí a doplnění. Když je povolen register_globals, vytvoří se tři kopie proměnné: v poli GET, v poli GLOBALS a jednoduše samotná proměnná ($_GET["page"], $GLOBALS["page"], $page), zatímco když je register_globals zakázán, předaná hodnota může být přístupná pouze přes pole GET ($_GET["stránka"]). Pamatovat si.

    Nebezpečí použití

    Podívejme se na jednoduchý příklad, abychom pochopili, co nás čeká (od 3 do 5 let – poznámka redakce). Aby to bylo jednodušší, hned řeknu, že $login a $password jsou proměnné předávané metodou GET/POST.

    Stručně o tom, co skript dělá:

      Řádek 2. Požádáme databázi, abychom vytáhli skutečné heslo pro přihlášení zadané uživatelem.

      Řádek 3. Toto heslo získáme a přiřadíme jej do proměnné $real_pass.

      Řádek 4. Porovnáme skutečné a zadané heslo a pokud se shodují, pak bude proměnné $check přiřazena true.

      Řádky 5-8. Pokud je $check true, pak zapíšeme, že autorizace byla úspěšná atd.

    Navrhovaný scénář je podle definice nejděravější na světě a nyní vám ukážu tyto díry. Podmínka: register_globals je povolen.

    Řekněme, že přenos se provádí pomocí metody GET. Pak bude adresa URL vypadat nějak takto:
    www.site.com/index.php?login =admin&password =qwerty
    Je jasné, že se okamžitě vytvoří globální proměnné $login a $password. Nyní se podívejte na skript. Obsahuje proměnnou $check. Co když to předáte přes URL?

    www.site.com/index.php?login =admin&password =qwerty&check =1
    Poté je kontrola shody hesla vynechána a uživatel je okamžitě autorizován (ostatně, pamatujete si, že 1 je pravda a 0 je nepravda?). Ke stejnému výsledku dojde, pokud budeme psát www.místo.com/index.php?šek =1 . A i když použijete metodu POST, všechny takové podvody budou stále fungovat, protože když je povoleno register_globals, nezáleží na tom, jakou metodu použijete - GET nebo POST.

    Myslím, že někdo má otázku, jak cracker ví o kontrolní proměnné, že za všechno může? Pokud jste scénář nikomu neukázali, je nepravděpodobné, že by ho znal. Ne každý však používá vlastní skripty, CMS apod., ale využívá to, co je dostupné na síti. V takových případech může cracker například studovat CMS kód a útočit s jeho pomocí na stránky vytvořené.

    Ne všichni hostitelé však register_globals deaktivují, a i když jsou vaše skripty navrženy tak, aby neměly povolenou register_globals, cracker může váš skript stále hacknout pomocí zranitelnosti této směrnice.

    Vezměme si náš příklad. Chcete-li jej chránit v případě, že je povoleno register_globals, za řádkem pokud ($heslo==$nemovitý_projít) $zkontrolovat =skutečný; přidat následující: jinak $zkontrolovat =Nepravdivé;. V tomto případě, i když je kontrolní proměnná rovna jedné předána metodou GET, skript stále nastaví $check=false, pokud je heslo nesprávné.

    Ano, také bych vás chtěl upozornit na skutečnost, že pokud vypnete register_globals, náš příklad nebude fungovat. A aby to fungovalo, musíte napsat $login = $_POST["login"]; $password = $_POST["heslo"];

    Pojďme si to shrnout...

    a vyvodit dva hlavní závěry:

    1) Když je povolen register_globals, můžete předávat různé proměnné, jejichž hodnoty nebyly vypočteny, aby byly přijaty prostřednictvím GET nebo POST.

    2) Register_globals sám o sobě není ani tak nebezpečný jako křivě napsaný skript.

    To je pro dnešek vše! Budu velmi rád, když uvidím vaše komentáře, připomínky, návrhy a jen zpětnou vazbu. Proto pište, nestyďte se!

    S přáním úspěšného týdne,
    Alexandr SHUYSKY