Miért veszélyes a PHP register_globals paraméter engedélyezése? Egyszerű felhasználói regisztrációs rendszer készítése PHP-ben és MySQL-ben Személytelen index php register

Helló! Most megpróbáljuk megvalósítani a legegyszerűbb regisztrációt az oldalon a PHP + MySQL használatával. Ehhez telepíteni kell az Apache-t a számítógépére. Szkriptünk működési elve az alábbiakban látható.

1. Kezdjük egy felhasználói tábla létrehozásával az adatbázisban. Tartalmazni fogja a felhasználói adatokat (bejelentkezés és jelszó). Menjünk a phpmyadmin oldalra (ha adatbázist hoz létre a számítógépén http://localhost/phpmyadmin/). Létrehozunk egy felhasználói táblázatot, amely 3 mezőből áll.

Én a mysql adatbázisban készítem el, másik adatbázisban tudod létrehozni. Ezután állítsa be az értékeket az ábrán látható módon:

2. Csatlakozás ehhez a táblázathoz szükséges. Hozzunk létre egy bd.php fájlt. A tartalma:

Az én esetemben így néz ki:

Mentse el a bd.php fájlt.
Nagy! Van egy táblánk az adatbázisban és egy kapcsolatunk vele. Most elkezdhet létrehozni egy oldalt, amelyen a felhasználók meghagyják adataikat.

3. Hozzon létre egy reg.php fájlt a tartalommal (minden megjegyzés benne):



Bejegyzés


Bejegyzés


Az Ön bejelentkezési neve:




A jelszavad:








4. Hozzon létre egy fájlt, amely adatokat visz be az adatbázisba, és menti a felhasználót. save_user.php (megjegyzések belül):

5. Felhasználóink ​​most már regisztrálhatnak! Ezután létre kell hoznia egy „ajtót” a már regisztrált felhasználók számára, hogy beléphessenek az oldalra. index.php (belül megjegyzések):




Kezdőlap


Kezdőlap


Az Ön bejelentkezési neve:


A jelszavad:






Regisztráció



Rendben, most mindennek vége! A lecke lehet unalmas, de nagyon hasznos. Itt csak a regisztráció ötlete jelenik meg, majd javíthatja: biztonsági, tervezési, adatmezők hozzáadása, avatarok betöltése, fiókból való kijelentkezés (ehhez egyszerűen törölje a változókat a munkamenetből az Unset funkcióval) és hamar. Sok szerencsét!

Mindent megnéztem, hibátlanul működik!

Reg.ru: domainek és tárhely

A legnagyobb regisztrátor és tárhelyszolgáltató Oroszországban.

Több mint 2 millió domain név működik.

Promóció, domain levelezés, üzleti megoldások.

Világszerte több mint 700 ezer ügyfél választotta már.

*Vigye az egeret a görgetés szüneteltetéséhez.

Vissza előre

Egyszerű felhasználói regisztrációs rendszer készítése PHP és MySQL nyelven

A regisztrációs rendszer létrehozása sok munka. Olyan kódot kell írnia, amely ellenőrzi az e-mail címeket, küld egy e-mailt, amely megerősíti a regisztrációt, és más űrlapmezőket is érvényesít, és még sok mást.

És még azután is, hogy mindezt megírod, a felhasználók nem szívesen regisztrálnak, mert... ez némi erőfeszítést igényel részükről.

Ebben az oktatóanyagban egy nagyon egyszerű regisztrációs rendszert fogunk létrehozni, amelyhez egyáltalán nincs szükség jelszavakra, és egyáltalán nem tárolunk! Az eredmény könnyen módosítható és hozzáadható egy meglévő PHP webhelyhez. Szeretné tudni, hogyan működik? Olvassa el lent.



A szuperegyszerű rendszerünk így fog működni:

Összevonjuk az engedélyezési űrlapot és a regisztrációt. Ezen az űrlapon lesz egy mező az e-mail címének megadására és egy regisztrációs gomb;
- A mező email címmel történő kitöltésekor a regisztráció gombra kattintva rekord keletkezik új felhasználóról, de csak akkor, ha a megadott email cím nem található az adatbázisban.

Ezt követően egy véletlenszerű egyedi karakterkészlet (token) jön létre, amelyet a felhasználó által megadott e-mail címre küldenek egy hivatkozás formájában, amely 10 percig releváns lesz;
- A link a weboldalunkra viszi a felhasználót. A rendszer meghatározza a token jelenlétét és engedélyezi a felhasználót;

Ennek a megközelítésnek az előnyei:

Nincs szükség jelszavak tárolására vagy mezők érvényesítésére;
- Nincs szükség jelszó visszaállítására, biztonsági kérdésekre stb.;
- Attól a pillanattól kezdve, hogy egy felhasználó regisztrál/bejelentkezik, mindig biztos lehet benne, hogy ez a felhasználó az Ön hozzáférési zónájában lesz (az e-mail cím igaz);
- Hihetetlenül egyszerű regisztrációs folyamat;

Hibák:

Felhasználói fiók biztonsága. Ha valaki hozzáfér a felhasználó leveleihez, be tud jelentkezni.
- Az e-mail nem biztonságos, és lehallgatható. Ne feledje, hogy ez a kérdés abban az esetben is releváns, ha a jelszót elfelejtették és vissza kell állítani, vagy bármely olyan jogosultsági rendszerben, amely nem használ HTTPS-t az adatátvitelhez (bejelentkezés/jelszó);
- Ha megfelelően konfigurálja levelezőszerverét, előfordulhat, hogy az engedélyezési hivatkozásokat tartalmazó üzenetek spambe kerülnek;

Rendszerünk előnyeit és hátrányait összevetve elmondható, hogy a rendszer jól használható (maximális kényelem a végfelhasználó számára), ugyanakkor alacsony biztonsági mutatója van.

Javasoljuk tehát, hogy olyan fórumokon és szolgáltatásokon való regisztrációhoz használja, amelyek nem működnek fontos információkkal.

Hogyan kell használni ezt a rendszert

Abban az esetben, ha csak egy rendszert kell használnia a felhasználók engedélyezésére a webhelyen, és nem szeretné darabokra szedni ezt a leckét, a következőket kell tennie:

A leckéhez csatolt forrásokat le kell tölteni
- Keresse meg az archívumban a tables.sql fájlt, és importálja az adatbázisába a phpMyAdmin importálási opciójával. Alternatív mód: nyissa meg ezt a fájlt egy szövegszerkesztővel, másolja ki az SQL lekérdezést és futtassa azt;
- Nyissa meg az include/main.php-t, és adja meg az adatbázishoz való kapcsolódás beállításait (adja meg az adatbázishoz való csatlakozáshoz szükséges felhasználót és jelszót, valamint az adatbázis gazdagépét és nevét). Ugyanebben a fájlban meg kell adni az e-mail címet is, amely a rendszer által küldött üzenetek eredeti címe lesz. Egyes gazdagépek blokkolják a kimenő e-maileket, kivéve, ha az űrlap valódi e-mail címet tartalmaz, amelyet a gazdagép vezérlőpultjáról hoztak létre, ezért valódi címet adjon meg;
- Töltse fel az összes index.php , protected.php fájlt és eszközt, valamint a mappákat FTP-n keresztül a gazdagépére;
- Adja hozzá az alábbi kódot minden PHP oldalhoz, ahol meg szeretné jeleníteni a bejelentkezési űrlapot;

Require_once "includes/main.php"; $user = new User(); if(!$user->loggedIn())( redirect("index.php"); )
- Kész!

Akit érdekel, hogyan működik mindez, olvassa el lent!

Az első lépés a HTM kód megírása az engedélyezési űrlaphoz. Ez a kód az index.php fájlban található. Ez a fájl PHP kódot is tartalmaz, amely űrlapadatokat és egyéb hasznos bejelentkezési rendszerfunkciókat kezel. Erről többet megtudhat az alábbi, a PHP kód áttekintésével foglalkozó részben.

index.php

Oktatóanyag: Szuper egyszerű regisztrációs rendszer PHP-vel és MySQL-lel Bejelentkezés vagy regisztráció

Adja meg e-mail címét fent és küldjük
egy bejelentkezési linket kapsz.

Bejelentkezés/Regisztrálás

A fejrészbe (a és a címkék közé) beírtam a főbb stílusokat (ezekre ez az oktatóanyag nem tér ki, így te magad is megnézheted őket. Mappaeszközök/css/style.css). A záró tag előtt beillesztettem a jQuery könyvtárat és a script.js fájlt, amit alább írunk és elemezünk.


JavaScript

A jQuery a funkció segítségével nyomon követi a "Regisztráció/Bejelentkezés" gomb állapotát e.preventDefault()és AJAX kéréseket küld. A szerver válaszától függően egy vagy másik üzenetet jelenít meg, és meghatározza a további műveleteket/

property/js/script.js

$(function())( var form = $("#login-register"); form.on("submit", function(e)( if(form.is(".betöltés, .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("hiba"); messageHolder.text(m.message); ) else( form.removeClass("hiba").addClass("loggedIn"); messageHolder . text(m.message); ) )); )); $(document).ajaxStart(function())( form.addClass("betöltés"); )); $(document).ajaxComplete(function()) ( form. removeClass("betöltés"); )); ));

hozzáadva az űrlaphoz, hogy megjelenítse az AJAX kérés aktuális állapotát (ez a metódusoknak köszönhető ajaxStart()) És ajaxComplete(), amelyet a fájl vége felé találhat).

Ez az osztály egy pörgő animált GIF fájlt jelenít meg (mintha arra utalna nekünk, hogy a kérés feldolgozás alatt áll), és jelzőként is működik, hogy megakadályozza az űrlap újbóli elküldését (ha már egyszer rákattintott a regisztráció gombra). A .loggedIn osztály egy másik jelző – az e-mail elküldésekor van beállítva. Ez a jelző azonnal blokkol minden további műveletet az űrlappal.

Adatbázis séma

Hihetetlenül egyszerű naplózó rendszerünk 2 MySQL táblát használ (az SQL kód a tables.sql fájlban található). Az első a felhasználói fiókokról tárol adatokat. A második a bejelentkezési kísérletek számáról tárol információkat.


Felhasználói tábla séma.

A rendszer nem használ jelszavakat, ahogy az a diagramon is látható. Rajta látható a token oszlop a token_validity oszlop mellett a tokenekkel. A token azonnal telepítésre kerül, amint a felhasználó csatlakozik a rendszerhez, és beállítja az e-mail üzenetet (erről a következő blokkban bővebben). A token_validity oszlop 10 perccel később állítja be az időt, amely után a token már nem érvényes.


Táblázatséma, amely számolja az engedélyezési kísérletek számát.

Mindkét táblázatban az IP-cím feldolgozott formában van tárolva, az ip2long függvény használatával egy egész típusú mezőben.

Most írhatunk egy PHP kódot. A rendszer fő funkciói a User.class.php osztályhoz vannak rendelve, amelyet alább láthat.

Ez az osztály aktívan használja az idorm-ot (docs), ezek a könyvtárak a minimálisan szükséges eszközök az adatbázisokkal való munkához. Kezeli az adatbázis-hozzáférést, a token generálást és a jogkivonat érvényesítését. Egyszerű felületet biztosít, amely megkönnyíti a regisztrációs rendszer csatlakoztatását webhelyéhez, ha az PHP-t használ.

User.class.php

Class User( // Privát ORM case Ezt keressük a tokent = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) return new User($result); ) /** * Felhasználó engedélyezése vagy regisztrálása * @param string $email Felhasználó e-mail cím * @return User */ public static function loginOrRegister($email)( // Ha már van ilyen felhasználó létezik, adja vissza a User függvény értékét az adatbázisban tárolt megadott email címről if(User::exists($email))( return new User($email); ) // Ellenkező esetben hozzon létre egy új felhasználót az adatbázisban és visszaadja a User::create függvény értékét a megadott e-mailből return User::create($email ); ) /** * Új felhasználó létrehozása és mentése az adatbázisba * @param string $email. Felhasználó e-mail címe * @return User */ private static function create($email)( // Írjon egy új felhasználót, és adja vissza a User függvény eredményét ezekből az értékekből>$result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Ellenőrizze, hogy létezik-e ilyen felhasználó az adatbázisban, és adja vissza a logikai értékét a változó * @param string $email. Felhasználó email címe * @return logikai érték */ nyilvános statikus függvény létezik($email)( // Létezik a felhasználó az adatbázisban? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Új felhasználói objektum létrehozása * @param példány $param ORM , id, email vagy 0 * @return User */ public function __construct($param = null) ( if($param instanceof ORM)( // ORM ellenőrzés sikeres $this->orm = $param; ) else if(is_string($param))( // E-mail ellenőrzés sikeres $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // a $param változó értéke átadva a felhasználói azonosítónak $id = $param; ) else if(isset($_SESSION["loginid"]))( // Ellenkező esetben lásd: $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Új SHA1 jogosultsági tokent generál, beírja az adatbázisba és visszaadja az értékét * @return string */ public function generateToken( )( // Tokent generál egy jogosult felhasználó számára és mentse el az adatbázisba $token = sha1($this->email.time().rand(0, 1000000)); // Mentse el a tokent az adatbázisba // És jelölje meg, hogy csak a következő 10 percben legyen érvényes $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); return $token; ) /** * A felhasználó engedélyezése * @return void */ public function login())( // A felhasználó megjelölése bejelentkezettként: $_SESSION["loginid"] = $this->orm->id; // Frissítse a a last_login adatbázismező értéke $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * A munkamenet megsemmisítése és a felhasználó kijelentkezése * @return void */ public function kijelentkezés ()( $_SESSION = array(); unset($_SESSION); ) /** * Ellenőrizze, hogy a felhasználó be van-e jelentkezve * @return logikai érték */ public function loggedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Ellenőrzi, hogy a felhasználó rendszergazda-e * @return logikai érték */ public function isAdmin())( return $this->rank() = = "adminisztrátor"; ) /** * Keresse meg a felhasználó típusát, lehet rendszergazda vagy normál * @return string */ public function rank())( if ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * A módszer, amely lehetővé teszi, hogy a felhasználó személyes adatait a User objektum * tulajdonságaiként * @ param string $key A hozzáférést kapó tulajdonság neve * @return mix */ public function __get($key)( if(isset($this->orm->$key))( return $this->orm-> $kulcs; ) return null; ) )

A tokeneket az SHA1 algoritmus segítségével állítják elő és tárolják az adatbázisban. A MySQL időzítési funkcióit használom a token érvényességének 10 perces időkorlátjának beállítására.

A token érvényesítésekor közvetlenül közöljük a kezelővel, hogy csak azokat a tokeneket vesszük figyelembe, amelyek még nem jártak le, a token_validity oszlopban tárolva.

Kérjük, vegye figyelembe, hogy a varázslatos módszert használom __kap docs könyvtárat a fájl végén, hogy elfogja a hozzáférést a User objektum tulajdonságaihoz.

Ennek köszönhetően lehetővé válik az adatbázisban tárolt információk elérése a $user->email, $user->token stb. tulajdonságoknak köszönhetően. A következő kódrészletben megnézzük, hogyan lehet ezeket az osztályokat példaként használni. .


Védett oldal

Egy másik fájl, amely hasznos és szükséges funkciókat tárol, a functions.php fájl. Számos úgynevezett helper - asszisztens funkció létezik, amelyek lehetővé teszik, hogy tisztább és olvashatóbb kódokat hozzon létre más fájlokban.

függvények.php

függvény send_email($feladó, $címzett, $tárgy, $üzenet)( // Segítő, amely e-mailt küld $headers = "MIME-verzió: 1.0" . "\r\n"; $headers .= "Tartalom típusa: szöveg /plain; charset=utf-8" . "\r\n"; $headers .= "Feladó: ".$feladó . "\r\n"; levél visszaküldése ($címzett, $tárgy, $üzenet, $fejlécek ); ) függvény get_page_url())( // Határozza meg a PHP fájl URL-címét $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"]; ) visszaadja $url count_hour = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00 ")") ->count(); // Bejelentkezési kísérletek száma az elmúlt 10 percben ezen az IP-címen $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u" ", ip2long($ ip))) ->hol_raw("ts > SUBTIME(NOW(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new Exception("Túl sok bejelentkezési kísérlet!"); ) ) function rate_limit_tick($ip, $email)( // Új rekord létrehozása a táblázatban ami számolja a bejelentkezési kísérletek számát $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("Hely: $url"); exit; )

Funkciók rate_limitÉs rate_limit_tick figyelemmel kíséri az engedélyezési kísérletek számát az első kísérlet óta eltelt időszakban. A bejelentkezési kísérlet az adatbázisban a reg_login_attempt oszlopban kerül rögzítésre. Ezeket a függvényeket a rendszer az űrlapadatok feldolgozásakor és elküldésekor hívja meg, amint az a következő kódrészletből látható.

Az alábbi kód az index.php fájlból származik, és az űrlap beküldését kezeli. JSON-választ ad vissza, amelyet viszont a jQuery dolgoz fel a korábban megvizsgált eszközök/js/script.js fájlban.

index.php

Tri (!isset($_POST["e-mail"]) || !filter_var($_POST["e-mail"], FILTER_VALIDATE_EMAIL))( throw new Exception("Adjon meg egy érvényes e-mailt."); ) // Ellenőrizze. A felhasználó bejelentkezhet, túllépte a megengedett kapcsolatok számát? (további információért a functions.php fájl) rate_limit($_SERVER["REMOTE_ADDR"]); // Bejelentkezési kísérlet naplózása rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // E-mail küldése a felhasználónak $message = ""; $email = $_POST["email"]; $subject = "Az Ön bejelentkezési hivatkozása"; if(!User:: létezik($email) )( $subject = "Köszönjük a regisztrációt!"; $message = "Köszönjük, hogy regisztrált oldalunkra!\n\n"; ) // Felhasználó engedélyezésének vagy regisztrálásának kísérlete $user = Felhasználó ::loginOrRegister($_POST[ "email"]); $message.= "Erről az URL-ről tud bejelentkezni:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "A hivatkozás 10 perc múlva automatikusan lejár."; $eredmény = email_küldés($e-mailtől, $_POST["e-mail"], $tárgy, $üzenet); if(!$result)( throw new Exception("Hiba történt az e-mail küldésekor. Próbáld újra."); ) die(json_encode(array("message" => "Köszönjük! Küldtünk egy linket Ellenőrizze a spam mappát is."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage()) )));)

Sikeres bejelentkezés/regisztráció után a fenti kód bejelentkezési linket küld a felhasználónak. A token elérhetővé válik, mert a metódus változóként adja át a generált hivatkozásban $_GET tkn jelölővel

index.php

If(isset($_GET["tkn"]))( // Érvényes ez a token az engedélyezéshez? $user = User::findByToken($_GET["tkn"]); if($user)( // Igen , Átirányítás védett oldalra $user->login(); redirect("protected.php"); ) // Nem, a token nem érvényes. Átirányítás egy engedélyezési/regisztrációs űrlapot tartalmazó oldalra redirect("index. php ");)

$user->login()

létrehozza a munkamenethez szükséges változókat, így az oldal következő oldalait megtekintő felhasználó mindenkor jogosult marad.

A rendszerből való kilépés funkció feldolgozása hasonló módon történik.

index.php

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

A kód végén ismét beállítottam egy átirányítást az index.php-re, tehát a paramétert ?logout=1 URL-en keresztül továbbítani nem szükséges.

Az index.php fájlunk továbbiakat igényel. védelem – nem akarjuk, hogy a rendszerbe bejelentkezett személyek újra láthassák a regisztrációs űrlapot. Erre a célra a módszert használjuk $user->loggedIn().

index.php

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

Végül itt van egy kódrészlet, amely lehetővé teszi webhelye oldalainak védelmét, és csak engedélyezés után teszi hozzáférhetővé.

védett.php

// A webhely minden oldalának védelme érdekében adjon meg egy main.php fájlt // és hozzon létre egy új felhasználói objektumot. Ez milyen egyszerű! request_once "includes/main.php"; $user = new User(); if(!$user->loggedIn())( redirect("index.php"); )

Ezen ellenőrzés után biztos lehet benne, hogy a felhasználót sikeresen engedélyezték. Az adatbázisban tárolt információkat az objektumtulajdonságok segítségével is elérheti $user. A felhasználó e-mail-címének és állapotának megjelenítéséhez használja ezt a kódot:

Echo "Az Ön e-mailje: ".$user->email; echo "Az Ön rangja: ".$user->rank();

Módszer rang() azért használjuk itt, mert az adatbázis általában számokat tárol (0 normál felhasználónál, 1 rendszergazdánál), és ezeket az adatokat át kell alakítanunk olyan állapotokká, amelyekhez tartoznak, amiben ez a módszer segít.

Ha egy normál felhasználóból rendszergazdát szeretne tenni, egyszerűen szerkessze a felhasználói bejegyzést a phpMyAdmin (vagy bármely más adatbázisok kezelését lehetővé tevő program) segítségével. Az adminisztrátor státusz nem ad semmilyen jogosultságot; ebben a példában az oldal azt mutatja, hogy Ön rendszergazda – és ennyi.

De hogy ezzel mit kezd, az a te belátásodra van bízva; saját maga írhat és állíthat össze olyan kódot, amely bizonyos jogosultságokat és képességeket állít be a rendszergazdák számára.

Végeztünk!

Elkészültünk ezzel a hihetetlenül szuper kvázi egyszerű formával! Használhatod a PHP oldalaidban, elég egyszerű. Ön is módosíthatja saját maga, és úgy készítheti el, ahogyan szeretné.

Az anyagot Denis Malyshok készítette kifejezetten a weboldal számára

P.S. Szeretnél továbblépni a PHP és az OOP elsajátításában? Fordítson figyelmet a prémium leckékre a webhelykészítés különböző aspektusairól, beleértve a PHP programozást, valamint egy ingyenes kurzust, amely a saját CMS-rendszerének PHP nyelven történő létrehozásáról szól az OOP használatával:

Tetszett az anyag, és szeretnél megköszönni?
Csak ossza meg barátaival és kollégáival!


Tekintettel arra, hogy nagyon gyakran kérdések merülnek fel a globális változókkal és a register_globals direktíva letiltásával kapcsolatos problémákkal kapcsolatban, ebben a cikkben igyekszünk egy kicsit foglalkozni ezzel a témával.

Először is határozzuk meg, melyek a külső változók. Ezek olyan változók, amelyek kívülről kerülnek be a programba, pl. nincsenek meghatározva magában a programban. Egy php szkript esetén minden változó, amely a böngésző soron vagy az űrlapon keresztül kerül átadásra, külső.
Nézzük meg, hogyan készülnek.

Ha a register_globals = On direktíva engedélyezve van a szerveren (a php.ini-ben), akkor a változók űrlapon vagy böngészősoron keresztül történő átadásakor a szkriptben, amelyhez ezeket a változókat szánják, automatikusan létrejönnek. Azok. ha a böngésző sorába beírtad a következőt: www.server.ru/index.php?var=1, akkor az index.php szkriptben automatikusan létrejön az 1-es értékű $var változó.

Megjegyzés

Ez a direktíva a PHP nyelv egyik legvitatottabb pontja. Egyrészt használata valóban komoly problémákat vethet fel a PHP szkriptek védelmével kapcsolatban, ha az esetleges hibahelyzeteket nem veszik megfelelően figyelembe, és sok fejlesztő joggal veszi tudomásul, hogy a szkriptek globális változók használata nélkül történő írása csökkenti a szkriptek sebezhetőségét különböző típusú támadások 90%-a. Másrészt a PHP hajnalán több mint ezer felhasználó bízott a nyelvi fejlesztőkben (a PHP 4.3-ig ez a direktíva alapértelmezés szerint engedélyezve volt), aminek köszönhetően jelenleg több millió ténylegesen működő szkript íródik globális változókkal (ez Érdemes megjegyezni, hogy oktatási célból néha teljesen megéri globális változókat használó szkripteket írni, mivel ezek szuperglobális tömbökkel való helyettesítése nagymértékben rontja a kód olvashatóságát).

Jelenleg a legtöbb gazdagép szolgáltatónál engedélyezve van ez a direktíva, és valószínűleg még sokáig engedélyezve marad, különben megszakadhat a kódfolytonosság.

Ha a register_globals direktíva le van tiltva, az ilyen változókhoz kétféleképpen lehet hozzáférni:

  • HTTP_***_VARS asszociatív tömbökön keresztül (HTTP_POST_VARS stb.)
  • szuperglobális tömbökön keresztül ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES stb.)

A szuperglobális tömbök bármilyen körben rendelkezésre állnak. A PHP fejlesztői azt javasolják, hogy tiltsák le a register_globals direktívát a szerveren, és dolgozzanak a változókkal szuperglobális tömbökön keresztül. Ez az ajánlás a register_globals direktíva engedélyezése esetén felmerülő biztonsági problémák miatt merülhet fel.

Bár egészen a közelmúltig a register_globals direktíva engedélyezve maradt a tárhelyoldalakon. A helyzet a PHP 5 kiadásával kezdett megváltozni, ahol ez a direktíva alapértelmezés szerint le van tiltva, és a kiszolgálók nem sietnek engedélyezni (talán jogosan).

Tehát pontosan mit kell tennie, hogy változókat kapjon? Szuperglobális tömbökből kell átvenni őket. Például a böngésző soron átmenő változók lekéréséhez használja a $_GET tömböt. Tegyük fel, hogy a böngésző sora a következőt írja ki: www.server.ru/index.php?var=1. Ezután az index.php fájl var változójának beszerzéséhez a következőt kell írnia:

$var=$_GET["var"];

És például egy űrlapról POST metódussal átvitt változók fogadásához az űrlapkezelő szkriptben a következőket kell írni:

$var=$_POST["var"];

Ebből a cikkből megtudhatja, hogyan hozhat létre regisztrációs és bejelentkezési űrlapot HTML, JavaScript, PHP és MySql használatával. Az ilyen űrlapokat szinte minden webhelyen használják, függetlenül annak típusától. Fórumokhoz, online boltokhoz, közösségi hálózatokhoz (például Facebook, Twitter, Odnoklassniki) és sok más típusú webhelyhez készültek.

Ha van webhelye a helyi számítógépén, akkor remélem, hogy már telepítve van és fut egy helyi szerver. Enélkül semmi sem fog működni.

Táblázat létrehozása az adatbázisban

A felhasználói regisztráció megvalósításához mindenekelőtt adatbázisra van szükségünk. Ha már megvan, akkor nagyszerű, ellenkező esetben létre kell hozni. A cikkben részletesen elmagyarázom, hogyan kell ezt megtenni.

Tehát van egy adatbázisunk (rövidítve DB), most létre kell hoznunk egy táblát felhasználókat melybe felvesszük regisztrált felhasználóinkat.

A cikkben azt is elmagyaráztam, hogyan lehet táblázatot adatbázisban létrehozni. Mielőtt létrehoznánk egy táblázatot, meg kell határoznunk, hogy milyen mezőket fog tartalmazni. Ezek a mezők megfelelnek a regisztrációs űrlap mezőinek.

Így hát, gondoltuk, elképzeltük, milyen mezők lesznek az űrlapunkon, és létrehoztunk egy táblázatot felhasználókat ezekkel a mezőkkel:

  • id- Azonosító. Terület id Az adatbázisban minden táblának rendelkeznie kell vele.
  • keresztnév- Hogy mentse a nevet.
  • vezetéknév- Hogy megőrizzük a vezetéknevet.
  • email- A postacím mentéséhez. Bejelentkezésként az e-mailt fogjuk használni, ezért ennek a mezőnek egyedinek kell lennie, azaz rendelkeznie kell az EGYEDI indexszel.
  • email_status- Mező, amely jelzi, hogy a levél megerősítve van-e vagy sem. Ha a levél visszaigazolásra kerül, akkor annak értéke 1 lesz, ellenkező esetben az érték 0.
  • Jelszó- A jelszó mentéséhez.


Ha azt szeretné, hogy a regisztrációs űrlapon további mezők szerepeljenek, itt is felveheti azokat.

Ez az, a mi asztalunk felhasználókat kész. Térjünk át a következő szakaszra.

Adatbázis kapcsolat

Elkészítettük az adatbázist, most csatlakoznunk kell hozzá. A MySQLi PHP kiterjesztéssel fogunk csatlakozni.

Webhelyünk mappájában hozzon létre egy fájlt a névvel dbconnect.php, és írd bele a következő szkriptet:

Ez a fájl dbconnect.phpössze kell kapcsolni az űrlapkezelőkkel.

Figyeld meg a változót $cím_webhely, itt feltüntettem a tesztoldalam nevét, amin dolgozni fogok. Kérjük, ennek megfelelően adja meg webhelye nevét.

A webhely szerkezete

Most pedig nézzük meg oldalunk HTML szerkezetét.

A webhely fejlécét és láblécét külön fájlba helyezzük át, header.phpÉs lábléc.php. Minden oldalon feltüntetjük őket. Mégpedig a főoldalon (fájl index.php), a regisztrációs űrlapot tartalmazó oldalra (fájl form_register.php) és az engedélyezési űrlapot tartalmazó oldalra (fájl form_auth.php).

Blokkolás linkjeinkkel, bejegyzésÉs felhatalmazást, adja hozzá őket a webhely fejlécéhez, hogy minden oldalon megjelenjenek. Egy link fog belépni a regisztrációs űrlapot tartalmazó oldalra (fájl form_register.php), a másikat pedig az engedélyezési űrlapot tartalmazó oldalra (fájl form_auth.php).

A header.php fájl tartalma:

Oldalunk neve

Ennek eredményeként a főoldalunk így néz ki:


Természetesen lehet, hogy az Ön webhelye teljesen más szerkezetű, de ez most nem fontos számunkra. A lényeg az, hogy vannak linkek (gombok) a regisztrációhoz és az engedélyezéshez.

Most pedig térjünk át a regisztrációs űrlapra. Amint azt már érted, nyilvántartjuk form_register.php.

Lépjen az adatbázisba (a phpMyAdminban), nyissa meg a táblázat szerkezetét felhasználókatés nézzük meg, milyen mezőkre van szükségünk. Ez azt jelenti, hogy szükségünk van egy mezőre a vezeték- és utónév megadására, egy mezőre a postai cím megadására (Email) és egy mezőre a jelszó megadására. És biztonsági okokból hozzáadunk egy mezőt a captcha beviteléhez.

A szerveren a regisztrációs űrlap feldolgozása következtében különböző hibák léphetnek fel, amelyek miatt a felhasználó nem tud regisztrálni. Ezért ahhoz, hogy a felhasználó megértse, miért sikertelen a regisztráció, üzeneteket kell megjeleníteni ezekről a hibákról.

Az űrlap megjelenítése előtt adjon hozzá egy blokkot a munkamenet hibaüzeneteinek megjelenítéséhez.

És még valami, ha a felhasználó már jogosult, és kíváncsiságból közvetlenül a regisztrációs oldalra megy a böngésző címsorába írva site_address/form_register.php, akkor ebben az esetben a regisztrációs űrlap helyett egy fejlécet jelenítünk meg, amely szerint már regisztrált.

Általában a fájl kódja form_register.php ezt kaptuk:

Már regisztráltál

A böngészőben a regisztrációs űrlapot tartalmazó oldal így néz ki:


A kötelező attribútum használatával minden mezőt kötelezővé tettünk.

Ügyeljen a regisztrációs űrlap kódjára, ahol a captcha megjelenik:


A képhez tartozó src attribútum értékében megadtuk a fájl elérési útját captcha.php, amely ezt a captcha-t generálja.

Nézzük a fájl kódját captcha.php:

A kódot jól kommentálták, ezért csak egy pontra koncentrálok.

Egy függvény belsejében imageTtfText(), a betűtípus elérési útja meg van adva verdana.ttf. Tehát ahhoz, hogy a captcha megfelelően működjön, létre kell hoznunk egy mappát betűtípusok, és helyezze oda a fontfájlt verdana.ttf. Megtalálhatja és letöltheti az internetről, vagy átveheti az archívumból a cikk anyagaival együtt.

Elkészültünk a HTML szerkezettel, ideje továbblépni.

Az e-mail érvényességének ellenőrzése a jQuery segítségével

Minden űrlapnak ellenőriznie kell a bevitt adatok érvényességét, mind a kliens oldalon (JavaScript, jQuery használatával), mind a szerver oldalon.

Különös figyelmet kell fordítanunk az E-mail mezőre. Nagyon fontos, hogy a megadott postai cím érvényes legyen.

Ennél a beviteli mezőnél beállítjuk az e-mail típusát (type="email"), ez kissé figyelmeztet minket a helytelen formátumokra. Ez azonban nem elég, mert a böngésző által rendelkezésünkre bocsátott kódvizsgálón keresztül könnyedén megváltoztathatjuk az attribútum értékét típus Val vel email tovább szöveg, és ennyi, a csekkünk többé nem lesz érvényes.


És ebben az esetben megbízhatóbb ellenőrzést kell végeznünk. Ehhez a JavaScript jQuery könyvtárát fogjuk használni.

A jQuery könyvtár csatlakoztatásához a fájlban header.php címkék között , a záró címke előtt , add hozzá ezt a sort:

Közvetlenül e sor után hozzáadjuk az e-mail-ellenőrző kódot. Itt hozzáadunk egy kódot a beírt jelszó hosszának ellenőrzéséhez. A hossza legalább 6 karakter legyen.

Ezzel a szkripttel ellenőrizzük a megadott e-mail cím érvényességét. Ha a felhasználó hibás e-mailt adott meg, erről hibaüzenetet jelenítünk meg, és letiltjuk az űrlap elküldése gombot. Ha minden rendben van, akkor eltávolítjuk a hibát, és aktiváljuk az űrlap elküldése gombot.

És így elkészültünk az űrlap érvényesítésével az ügyfél oldalon. Most már elküldhetjük a szerverre, ahol szintén elvégzünk pár ellenőrzést és adatokat adunk az adatbázishoz.

Felhasználó regisztráció

Az űrlapot a fájlba küldjük feldolgozásra register.php, a POST módszerrel. Ennek a kezelőfájlnak a neve az attribútumértékben van megadva akció. A küldési mód pedig az attribútum értékében van megadva módszer.

Nyissa meg ezt a fájlt register.phpés az első dolgunk, hogy írjunk egy munkamenet-indító függvényt, és összekapcsoljuk a korábban létrehozott fájlt dbconnect.php(Ebben a fájlban hoztunk létre kapcsolatot az adatbázissal). És azt is, azonnal deklaráljuk a sejteket error_messagesÉs siker_üzenetek a globális munkamenet-tömbben. BAN BEN hibaüzenetek minden hibaüzenetet rögzítünk, ami az űrlap feldolgozása során, illetve az in siker_üzenetek, örömteli üzeneteket fogunk rögzíteni.

Mielőtt folytatnánk, ellenőriznünk kell, hogy az űrlapot egyáltalán elküldték-e. A támadó megnézheti az attribútum értékét akció az űrlapról, és megtudja, melyik fájl dolgozza fel ezt az űrlapot. És elképzelhető, hogy közvetlenül ehhez a fájlhoz lépjen a következő cím beírásával a böngésző címsorába: http://site_address/register.php

Tehát ellenőriznünk kell, hogy a globális POST tömbben van-e olyan cella, amelynek a neve megegyezik az űrlapon található "Regisztráció" gombunk nevével. Így ellenőrizzük, hogy a „Regisztráció” gombra kattintottak-e vagy sem.

Ha egy támadó megpróbál közvetlenül erre a fájlra lépni, hibaüzenetet kap. Hadd emlékeztesselek arra, hogy az $address_site változó tartalmazza a webhely nevét, és ez deklarálva lett a fájlban dbconnect.php.

A munkamenetben lévő captcha értéke előállításkor hozzáadásra került a fájlban captcha.php. Emlékeztetőül ismét megmutatom ezt a kódrészletet a fájlból captcha.php, ahol a captcha értéke hozzáadódik a munkamenethez:

Most folytassuk magával az ellenőrzéssel. Fájlban register.php, az if blokkon belül, ahol ellenőrizzük, hogy a "Regisztráció" gombra kattintottak-e, vagy ahol a " megjegyzés van feltüntetve" // (1) Szóköz a következő kódrészlet számára"mi írunk:

//A kapott captcha ellenőrzése //Vágja le a szóközöket a sor elejétől és végétől $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Hasonlítsa össze a kapott értéket a munkamenet értékével. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Ha a captcha nem megfelelő, akkor visszaküldjük a felhasználót a regisztrációs oldalra, és ott hibaüzenetet jelenítünk meg neki, hogy rossz captcha-t írt be $error_message = "

Hiba! Rossz captcha-t adott meg

"; // Mentse el a hibaüzenetet a munkamenetbe. $_SESSION["error_messages"] = $error_message; // A felhasználó visszaadása a regisztrációs oldal fejlécéhez("HTTP/1.1 301 Permanently Moved"); header("Hely: " .$address_site ."/form_register.php"); //Stop the script exit(); ) // (2) Hely a következő kódrészlethez )else( //Ha a captcha nem került átadásra, vagy üres, lépjen ki ("

Hiba! Nincs ellenőrző kód, azaz captcha kód. Mehet a főoldalra.

"); }

Ezután a POST tömbből kapott adatokat kell feldolgoznunk. Először is ellenőriznünk kell a globális POST tömb tartalmát, vagyis hogy vannak-e ott olyan cellák, amelyek neve megegyezik az űrlapunk beviteli mezőinek nevével.

Ha a cella létezik, akkor ebből a cellából levágjuk a sor elejétől és végétől a szóközöket, ellenkező esetben a felhasználót visszairányítjuk a regisztrációs űrlapot tartalmazó oldalra.

Ezután a szóközök levágása után hozzáadjuk a sort a változóhoz, és ellenőrizzük, hogy ez a változó üres-e, ha nem üres, akkor továbblépünk, ellenkező esetben a regisztrációs űrlappal visszairányítjuk a felhasználót az oldalra.

Illessze be ezt a kódot a megadott helyre" // (2) Szóköz a következő kódrészlet számára".

/* Ellenőrizze, hogy vannak-e az űrlapról küldött adatok a $_POST globális tömbben, és csomagolja a beküldött adatokat szabályos változókba.*/ if(isset($_POST["first_name"]))( //Vágja le a szóközöket az elejétől és a string vége $first_name = trim($_POST["first_name"]); //Emptiness ellenőrzése if(!empty($first_name))( // A biztonság kedvéért konvertálja a speciális karaktereket HTML entitásokká $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Mentse el a hibaüzenetet a munkamenetbe. $_SESSION["error_messages"] .= "

Adja meg nevét

A név mező hiányzik

"; //A felhasználó visszaküldése a regisztrációs oldal fejlécéhez("HTTP/1.1 301 Véglegesen áthelyezve"); header("Hely: ".$address_site."/form_register.php"); //Stop the script exit(); ) if( isset($_POST["last_name"]))( //Szóközök levágása a sor elejétől és végétől $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // A biztonság kedvéért konvertálja a speciális karaktereket HTML entitásokká $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Mentse el a hibaüzenetet a munkamenetbe. $_SESSION["error_messages"] .= "

Kérlek írd be a vezetékneved

"; //A felhasználó visszaküldése a regisztrációs oldal fejlécéhez("HTTP/1.1 301 Véglegesen áthelyezve"); header("Hely: ".$address_site."/form_register.php"); //Stop the script exit(); ) )else ( // Mentse el a hibaüzenetet a munkamenetbe. $_SESSION["error_messages"] .= "

A vezetéknév mező hiányzik

"; //A felhasználó visszaküldése a regisztrációs oldal fejlécéhez("HTTP/1.1 301 Véglegesen áthelyezve"); header("Hely: ".$address_site."/form_register.php"); //Stop the script exit(); ) if( isset($_POST["email"]))( //Szóközök levágása a sor elejétől és végétől $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) A kód helye az e-mail cím formátumának és egyediségének ellenőrzéséhez )else( // Mentse el a hibaüzenetet a munkamenetbe. $_SESSION["error_messages"] .= "

Írd be az email címed

"; //A felhasználó visszaküldése a regisztrációs oldal fejlécéhez("HTTP/1.1 301 Véglegesen áthelyezve"); header("Hely: ".$address_site."/form_register.php"); //Stop the script exit(); ) )else ( // Mentse el a hibaüzenetet a munkamenetbe. $_SESSION["error_messages"] .= "

"; //A felhasználó visszaküldése a regisztrációs oldal fejlécéhez("HTTP/1.1 301 Véglegesen áthelyezve"); header("Hely: ".$address_site."/form_register.php"); //Stop the script exit(); ) if( isset($_POST["jelszó"]))( //Szóközök levágása a karakterlánc elejétől és végétől $password = trim($_POST["jelszó"]); if(!empty($jelszó)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //A jelszó titkosítása $password = md5($password."top_secret"); )else( // Mentse el a hibaüzenetet a munkamenetbe. $_SESSION["error_messages"] .= "

Írd be a jelszavad

"; //A felhasználó visszaküldése a regisztrációs oldal fejlécéhez("HTTP/1.1 301 Véglegesen áthelyezve"); header("Hely: ".$address_site."/form_register.php"); //Stop the script exit(); ) )else ( // Mentse el a hibaüzenetet a munkamenetbe. $_SESSION["error_messages"] .= "

"; //A felhasználó visszaküldése a regisztrációs oldal fejlécéhez("HTTP/1.1 301 Véglegesen áthelyezve"); header("Hely: ".$address_site."/form_register.php"); //Stop the script exit(); ) // (4) A felhasználó adatbázishoz való hozzáadásához szükséges kód helye

Különösen fontos a terület email. Az adatbázisban ellenőriznünk kell a kapott postai cím formátumát és egyediségét. Vagyis van-e már regisztrált felhasználó ugyanazzal az e-mail címmel?

a megadott helyen" // (3) Kódhely a postai cím formátumának és egyediségének ellenőrzéséhez"adja hozzá a következő kódot:

//Ellenőrizze a kapott e-mail cím formátumát egy reguláris kifejezéssel $reg_email = "/^**@(+(*+)*\.)++/i"; //Ha a kapott e-mail cím formátuma nem egyezik a reguláris kifejezéssel if(!preg_match($reg_email, $email))( // Mentse el a hibaüzenetet a munkamenetbe. $_SESSION["error_messages"] .= "

Rossz e-mail-címet adott meg

"; //A felhasználó visszaküldése a regisztrációs oldal fejlécéhez("HTTP/1.1 301 Véglegesen áthelyezve"); header("Hely: ".$address_site."/form_register.php"); //Stop the script exit(); ) // Ellenőrizzük, hogy van-e már ilyen cím az adatbázisban. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /Ha a beérkezettek száma pontosan egy sor van, ami azt jelenti, hogy az ezzel az e-mail címmel rendelkező felhasználó már regisztrálva van if($result_query->num_rows == 1)( //Ha a kapott eredmény nem hamis if(($row = $result_query->fetch_assoc()) != false) ( // Mentse el a hibaüzenetet a munkamenetbe. $_SESSION["error_messages"] .= "

Az ezzel az e-mail címmel rendelkező felhasználó már regisztrálva van

"; //A felhasználó visszaküldése a regisztrációs oldal fejlécéhez("HTTP/1.1 301 véglegesen áthelyezve"); header("Hely: ".$address_site."/form_register.php"); )else( // Mentse el a hibaüzenetet a munkamenethez . $_SESSION["error_messages"] .= "

Hiba az adatbázis lekérdezésében

"; //A felhasználó visszaadása a regisztrációs oldal fejlécéhez("HTTP/1.1 301 Véglegesen áthelyezve"); header("Hely: ".$address_site."/form_register.php"); ) /* a kijelölés bezárása */ $ result_query-> close(); //A szkript leállítása exit(); ) /* a kijelölés bezárása */ $result_query->close();

És készen vagyunk az összes ellenőrzéssel, ideje hozzáadni a felhasználót az adatbázishoz. a megadott helyen" // (4) A felhasználó adatbázishoz adásához szükséges kód helye"adja hozzá a következő kódot:

//Lekérdezés egy felhasználó hozzáadásához az adatbázishoz $result_query_insert = $mysqli->query("INSERT INTO `users` (keresztnév, vezetéknév, email, jelszó) VALUES ("".$first_name."", "".$last_name ." ", "".$email.", "".$password."")"); if(!$result_query_insert)( // Mentse a hibaüzenetet a munkamenetbe. $_SESSION["error_messages"] .= "

Hiba a felhasználó adatbázishoz adásának kérésében

"; //A felhasználó visszaküldése a regisztrációs oldal fejlécéhez("HTTP/1.1 301 Véglegesen áthelyezve"); header("Hely: ".$address_site."/form_register.php"); //Stop the script exit(); )else( $_SESSION["success_messages"] = "

A regisztráció sikeresen lezárult!!!
Most már bejelentkezhet felhasználónevével és jelszavával.

"; //A felhasználó elküldése az engedélyezési oldal fejlécére("HTTP/1.1 301, véglegesen áthelyezve"); header("Hely: ".$address_site."/form_auth.php"); ) /* A kérés befejezése */ $ result_query_insert-> close(); //Az adatbázishoz való kapcsolat bezárása $mysqli->close();

Ha hiba történt a felhasználó adatbázishoz való felvételének kérésében, akkor erről a hibáról üzenetet adunk a munkamenethez, és visszaküldjük a felhasználót a regisztrációs oldalra.

Ellenkező esetben, ha minden jól ment, üzenetet is adunk a munkamenethez, de ezúttal kellemesebb, nevezetesen közöljük a felhasználóval, hogy a regisztráció sikeres volt. És átirányítjuk az engedélyezési űrlapot tartalmazó oldalra.

Az e-mail cím formátumának és a jelszó hosszának ellenőrzésére szolgáló szkript a fájlban található header.php, így ez az űrlap mezőire is vonatkozik.

A munkamenet is elindul a fájlban header.php, tehát a fájlban form_auth.php Nem kell munkamenetet indítani, mert hibaüzenetet kapunk.


Mint már mondtam, itt is működik az e-mail cím formátumának és a jelszó hosszának ellenőrzésére szolgáló szkript. Ezért ha a felhasználó hibás email címet vagy rövid jelszót ad meg, azonnal hibaüzenetet kap. Egy gomb bejönni inaktívvá válik.

A hibák kijavítása után a gombot bejönni aktívvá válik, és a felhasználó el tudja küldeni az űrlapot a szerverre, ahol az feldolgozásra kerül.

Felhasználói jogosultság

Érték tulajdonításához akció az engedélyezési hendikepnek van egy fájl megadva auth.php, ez azt jelenti, hogy az űrlap ebben a fájlban kerül feldolgozásra.

És hát nyissa meg a fájlt auth.phpés írjon kódot az engedélyezési űrlap feldolgozásához. Az első dolog, amit meg kell tennie, egy munkamenet elindítása és a fájl csatlakoztatása dbconnect.php az adatbázishoz való csatlakozáshoz.

Ha rákattint a kilépés linkre az oldalról, egy fájlhoz jutunk logout.php, ahol egyszerűen megsemmisítjük a munkamenetből származó e-mail címet és jelszót tartalmazó cellákat. Ezt követően visszaküldjük a felhasználót arra az oldalra, amelyen a linkre kattintott kijárat.

Fájl kódja logout.php:

Ez minden. Most már tudja, hogyan helyezze el és dolgozza fel a felhasználói regisztrációs és engedélyezési űrlapokat webhelyén. Ezek az űrlapok szinte minden webhelyen megtalálhatók, így minden programozónak tudnia kell, hogyan kell elkészíteni őket.

Megtanultuk a bemeneti adatok érvényesítését is, mind kliens oldalon (böngészőben, JavaScript, jQuery használatával), mind szerver oldalon (PHP használatával). Azt is megtanultuk, hogyan kell végrehajtani egy eljárást a helyszín elhagyására.

Minden szkriptet teszteltünk és működik. Erről a linkről letöltheti a kis oldal fájljait tartalmazó archívumot.

A jövőben írok egy cikket, ahol leírom. És tervezek egy cikket is írni, ahol elmagyarázom (az oldal újratöltése nélkül). Tehát, hogy mindig értesüljön az új cikkek megjelenéséről, feliratkozhat webhelyemre.

Ha kérdése van, forduljon hozzám, és ha hibát észlel a cikkben, jelezze.

Óraterv (5. rész):

  • HTML-struktúra létrehozása az engedélyezési űrlaphoz
  • A kapott adatokat feldolgozzuk
  • A webhely fejlécében megjelenítjük a felhasználó üdvözlését
  • Tetszett a cikk?

    Nem tudom miért... nem, tudom, hogy miért nem lehet engedélyezni a register_globals direktívát, de nem tudom, hogy a szakirodalomban általában miért nem mondanak erről semmit.

    Ebben a cikkben megpróbálom kiszedni a tartályból a benne ülőket, és elmagyarázom, mi az, ami (főleg a páncélvonaton utazóknak – a szerkesztő megjegyzése). Nem véletlenül tiltják le ezt az irányelvet egyes házigazdák. Így…

    Hogyan működik

    A PHP beállításokban (php.ini fájl) van egy ilyen register_globals direktíva. Jelentése az, hogy ha engedélyezve van (register_globals = on), akkor minden GET-en és POST-on keresztül átadott változó automatikusan globálisként lesz regisztrálva. Mit jelent?

    Például átadjuk a GET metódust az index.php szkriptnek valamilyen oldalértéket: index.php?page=2. Az átadott értéket a rendszer egy GET tömbben tárolja, és egy szkriptben $_GET["oldal"] néven használható. Ha azonban a register_globals engedélyezve van, akkor az átadott értékhez egy $page változó jön létre, amely az index.php szkript bármely részében elérhető.

    Egy kis összefoglaló és kiegészítés. Ha a register_globals engedélyezve van, a változó három másolata jön létre: a GET tömbben, a GLOBALS tömbben, és egyszerűen maga a változó ($_GET["oldal"], $GLOBALS["oldal"], $oldal), míg ha a register_globals le van tiltva, az átadott érték csak a GET tömbön keresztül érhető el ($_GET["oldal"]). Emlékezik.

    Használat veszélye

    Nézzünk egy egyszerű példát, hogy megértsük, mi vár ránk (3 és 5 év között - szerkesztő megjegyzése). A könnyebbség kedvéért azonnal elmondom, hogy a $login és a $password a GET/POST metódussal átadott változók.

    Röviden a forgatókönyv működéséről:

      2. sor. Kérést intézünk az adatbázishoz, hogy kinyerjük a felhasználó által beírt bejelentkezés valódi jelszavát.

      3. sor. Megkapjuk ezt a jelszót, és hozzárendeljük a $real_pass változóhoz.

      4. sor Összehasonlítjuk a valódi és a beírt jelszót, és ha egyezik, akkor a $check változót igaz lesz hozzárendelve.

      sorok 5-8. Ha a $check igaz, akkor azt írjuk, hogy az engedélyezés sikeres volt stb.

    A javasolt forgatókönyv értelemszerűen a legszivárgóbb a világon, és most megmutatom ezeket a lyukakat. Feltétel: a register_globals engedélyezve van.

    Tegyük fel, hogy az átvitel a GET módszerrel történik. Ekkor az url valahogy így fog kinézni:
    www.site.com/index.php?login =admin&password =qwerty
    Nyilvánvaló, hogy a $login és a $password globális változók azonnal létrejönnek. Most nézd meg a forgatókönyvet. Ez tartalmazza a $check változót. Mi van, ha URL-en keresztül adja át?

    www.site.com/index.php?login =admin&password =qwerty&check =1
    Ekkor a jelszó-egyeztetés ellenőrzése megkerül, és a felhasználó azonnal jogosultságot kap (végül is emlékszel, hogy az 1 igaz, a 0 pedig hamis?). Ugyanez az eredmény lesz, ha írunk www.webhely.com/index.php?jelölje be =1 . És még ha a POST módszert is használja, minden ilyen csalás továbbra is működni fog, mivel amikor a register_globals engedélyezve van, nem számít, milyen módszert használ - GET vagy POST.

    Gondolom valakinek olyan kérdése van, hogy honnan tud egy cracker a check változóról, hogy mindenért az a felelős? Ha nem mutattad meg a forgatókönyvet senkinek, valószínűleg nem fogják tudni. Azonban nem mindenki használja a saját szkriptjeit, CMS-jét stb., hanem azt, ami a hálózaton elérhető. Ilyenkor például egy cracker képes tanulmányozni a CMS kódot, és megtámadni a segítségével létrehozott oldalakat.

    Azonban nem minden tárhely tiltja le a register_globals attribútumot, és még ha a szkriptjeit úgy tervezték is, hogy ne legyen engedélyezve a register_globals, egy feltörő akkor is feltörheti a szkriptet az irányelv sebezhetőségét használva.

    Vegyük a példánkat. Megvédése érdekében, ha a register_globals engedélyezve van, a sor után ha ($jelszó==$igazi_pass)$ellenőrizze =igaz; add hozzá a következőket: más $ellenőrizze =hamis;. Ebben az esetben, még ha az eggyel egyenlő ellenőrző változót is átadja a GET metódus, a szkript továbbra is beállítja a $check=false értéket, ha a jelszó helytelen.

    Igen, arra is felhívnám a figyelmet, hogy ha kikapcsolja a register_globals-t, akkor a példánk nem fog működni. És ahhoz, hogy működjön, a következőt kell írni: $login = $_POST["bejelentkezés"]; $jelszó = $_POST["jelszó"];

    Foglaljuk össze...

    és vonjon le két fő következtetést:

    1) Ha a register_globals engedélyezve van, akkor különféle változókat adhat át, amelyek értékeit nem számítottuk úgy, hogy a GET-en vagy POST-on keresztül kapják meg.

    2) Maga a Register_globals nem annyira veszélyes, mint inkább egy ferdén megírt szkript.

    Ez minden mára! Nagyon örülök észrevételeinek, észrevételeinek, javaslatainak és csak visszajelzéseinek. Ezért írj, ne légy szégyenlős!

    Sikeres hetet kívánva:
    Sándor SHUYSKY