Pse është e rrezikshme aktivizimi i parametrit PHP register_globals? Krijimi i një sistemi të thjeshtë regjistrimi të përdoruesve në regjistrin PHP dhe MySQL Impersonal index php

Përshëndetje! Tani do të përpiqemi të zbatojmë regjistrimin më të thjeshtë në sit duke përdorur PHP + MySQL. Për ta bërë këtë, Apache duhet të instalohet në kompjuterin tuaj. Parimi i funksionimit të skenarit tonë është paraqitur më poshtë.

1. Le të fillojmë duke krijuar një tabelë të përdoruesve në bazën e të dhënave. Ai do të përmbajë të dhënat e përdoruesit (identifikimi dhe fjalëkalimi). Le të shkojmë te phpmyadmin (nëse po krijoni një bazë të dhënash në kompjuterin tuaj http://localhost/phpmyadmin/). Ne krijojmë një tabelë të përdoruesve, ajo do të ketë 3 fusha.

Unë e krijoj atë në bazën e të dhënave mysql, ju mund ta krijoni në një bazë të dhënash tjetër. Më pas vendosni vlerat si në figurë:

2. Kërkohet një lidhje me këtë tabelë. Le të krijojmë një skedar bd.php. Përmbajtja e tij:

Në rastin tim duket kështu:

Ruaj bd.php.
E shkëlqyeshme! Ne kemi një tabelë në bazën e të dhënave dhe një lidhje me të. Tani mund të filloni të krijoni një faqe në të cilën përdoruesit do të lënë të dhënat e tyre.

3. Krijoni një skedar reg.php me përmbajtjen (të gjitha komentet brenda):



Regjistrimi


Regjistrimi


Hyrja juaj:




Fjalëkalimi juaj:








4. Krijoni një skedar që do të futë të dhëna në bazën e të dhënave dhe do të ruajë përdoruesin. save_user.php (komentet brenda):

5. Tani përdoruesit tanë mund të regjistrohen! Tjetra, duhet të krijoni një "derë" për përdoruesit e regjistruar tashmë që të hyjnë në sit. index.php (komentet brenda):




Faqja kryesore


Faqja kryesore


Hyrja juaj:


Fjalëkalimi juaj:






Regjistrohu



OK tani ka mbaruar! Mësimi mund të jetë i mërzitshëm, por shumë i dobishëm. Këtu shfaqet vetëm ideja e regjistrimit, atëherë mund ta përmirësoni: shtoni sigurinë, dizajnin, fushat e të dhënave, ngarkimin e avatarëve, daljen nga llogaria juaj (për ta bërë këtë, thjesht shkatërroni variablat nga seanca me funksionin e pacaktuar) dhe kështu me radhë. Paç fat!

Kontrollova gjithçka, funksionon siç duhet!

Reg.ru: domenet dhe pritja

Regjistruesi dhe ofruesi më i madh i pritjes në Rusi.

Më shumë se 2 milion emra domenesh në shërbim.

Promovim, postë domeni, zgjidhje biznesi.

Më shumë se 700 mijë klientë në mbarë botën kanë bërë tashmë zgjedhjen e tyre.

*Mausi mbi të për të ndaluar lëvizjen.

Kthehu përpara

Krijimi i një sistemi të thjeshtë regjistrimi të përdoruesve në PHP dhe MySQL

Krijimi i një sistemi regjistrimi është shumë punë. Ju duhet të shkruani kodin që vërteton adresat e emailit, dërgon një email që konfirmon regjistrimin dhe gjithashtu vërteton fushat e tjera të formularit dhe shumë më tepër.

Dhe edhe pasi t'i shkruani të gjitha këto, përdoruesit do të hezitojnë të regjistrohen, sepse... kjo kërkon disa përpjekje nga ana e tyre.

Në këtë tutorial, ne do të krijojmë një sistem regjistrimi shumë të thjeshtë që nuk kërkon ose ruan fare fjalëkalime! Rezultati do të jetë i lehtë për t'u modifikuar dhe shtuar në një sajt ekzistues PHP. Dëshironi të zbuloni se si funksionon? Lexo me poshte.



Ja se si do të funksionojë sistemi ynë super i thjeshtë:

Ne do të kombinojmë formularin e autorizimit dhe regjistrimin. Ky formular do të ketë një fushë për të futur adresën tuaj të emailit dhe një buton regjistrimi;
- Kur plotësoni fushën me një adresë emaili, duke klikuar në butonin e regjistrimit do të krijohet një regjistrim për një përdorues të ri, por vetëm nëse adresa e postës elektronike e futur nuk gjendet në bazën e të dhënave.

Pas kësaj, krijohet një grup unik i rastësishëm i karaktereve (token), i cili dërgohet në emailin e specifikuar nga përdoruesi në formën e një lidhjeje që do të jetë e rëndësishme për 10 minuta;
- Lidhja e çon përdoruesin në faqen tonë të internetit. Sistemi përcakton praninë e një token dhe autorizon përdoruesin;

Përparësitë e kësaj qasjeje:

Nuk ka nevojë të ruani fjalëkalime ose të vërtetoni fushat;
- Nuk ka nevojë të rikuperoni fjalëkalimin tuaj, pyetjet e sigurisë, etj.;
- Që nga momenti kur një përdorues regjistrohet/logohet, mund të jeni gjithmonë të sigurt se ky përdorues do të jetë në zonën tuaj të aksesit (që adresa e emailit është e vërtetë);
- Procesi tepër i thjeshtë i regjistrimit;

Të metat:

Siguria e llogarisë së përdoruesit. Nëse dikush ka qasje në postën e përdoruesit, ai mund të identifikohet.
- Emaili nuk është i sigurt dhe mund të përgjohet. Mbani në mend se kjo pyetje është gjithashtu e rëndësishme në rastin kur fjalëkalimi është harruar dhe duhet të rikthehet, ose në çdo sistem autorizimi që nuk përdor HTTPS për transferimin e të dhënave (hyrje/fjalëkalim);
- Ndërsa konfiguroni siç duhet serverin tuaj të postës, ekziston mundësia që mesazhet me lidhje autorizimi të përfundojnë në postë të padëshiruar;

Duke krahasuar avantazhet dhe disavantazhet e sistemit tonë, mund të themi se sistemi ka përdorshmëri të lartë (komoditet maksimal për përdoruesin përfundimtar) dhe, në të njëjtën kohë, ka një tregues të ulët sigurie.

Prandaj sugjerohet përdorimi i tij për regjistrime në forume dhe shërbime që nuk funksionojnë me informacione të rëndësishme.

Si të përdorni këtë sistem

Në rast se thjesht duhet të përdorni një sistem për të autorizuar përdoruesit në faqen tuaj dhe nuk dëshironi ta bëni këtë mësim në copa, ja çfarë duhet të bëni:

Ju duhet të shkarkoni burimet bashkangjitur mësimit
- Gjeni skedarin tables.sql në arkiv. Importojeni atë në bazën tuaj të të dhënave duke përdorur opsionin e importit në phpMyAdmin. Mënyra alternative: hapeni këtë skedar përmes një redaktuesi teksti, kopjoni pyetjen SQL dhe ekzekutoni atë;
- Hapni include/main.php dhe plotësoni cilësimet për t'u lidhur me bazën tuaj të të dhënave (specifikoni përdoruesin dhe fjalëkalimin për t'u lidhur me bazën e të dhënave, si dhe hostin dhe emrin e bazës së të dhënave). Në të njëjtin skedar, duhet të specifikoni edhe emailin, i cili do të përdoret si adresa origjinale për mesazhet e dërguara nga sistemi. Disa host bllokojnë emailet dalëse, përveç rastit kur formulari përmban një adresë të vërtetë emaili, e cila është krijuar nga paneli i kontrollit të hostit, prandaj jepni një adresë reale;
- Ngarko të gjithë skedarët dhe asetet index.php, protected.php dhe përfshin dosjet nëpërmjet FTP në hostin tuaj;
- Shtoni kodin më poshtë në secilën faqe PHP ku dëshironi të shfaqni formularin e hyrjes;

Require_once "përfshin/main.php"; $përdorues = Përdorues i ri(); if(!$user->loggedIn())( ridrejtoj("index.php"); )
- Gati!

Për ata që janë të interesuar se si funksionon gjithçka, lexoni më poshtë!

Hapi i parë është të shkruani kodin HTM për formularin e autorizimit. Ky kod ndodhet në skedarin index.php. Ky skedar përmban gjithashtu kodin PHP që trajton të dhënat e formularit dhe funksione të tjera të dobishme të sistemit të hyrjes. Mund të mësoni më shumë rreth kësaj në seksionin më poshtë kushtuar rishikimit të kodit PHP.

indeks.php

Tutorial: Sistemi super i thjeshtë i regjistrimit me PHP & MySQL Identifikohu ose Regjistrohu

Shkruani adresën tuaj të emailit më lart dhe ne do ta dërgojmë
ju një lidhje identifikimi.

Hyr/Regjistrohu

Në seksionin e kokës (midis etiketave dhe) kam përfshirë stilet kryesore (ato nuk janë të mbuluara në këtë tutorial, kështu që mund t'i shikoni vetë. Asetet e dosjeve/css/style.css). Përpara etiketës mbyllëse, përfshiva bibliotekën jQuery dhe skedarin script.js, të cilat do t'i shkruajmë dhe analizojmë më poshtë.


JavaScript

jQuery gjurmon gjendjen e butonit "Regjistrohu/Hyrja" duke përdorur funksionin e.preventDefault() dhe dërgon kërkesa AJAX. Në varësi të përgjigjes së serverit, ai shfaq një ose një mesazh tjetër dhe përcakton veprimet e mëtejshme/

asetet/js/script.js

$(function())( var forma = $("#login-register"); form.on("submit", funksion(e)( if(form.is(".loading, .loggedIn"))(kthim false ;) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (email: email), funksioni (m)( if(m.gabim)(form.addClass("gabim"); messageHolder.tekst(m.mesazh); ) else(form.removeClass("gabim").addClass("loggedIn"); mbajtësi i mesazhit . tekst(m.mesazh); ) )); )); $(dokument).ajaxStart(funksion())(form.addClass("po ngarkohet"); )); $(dokument).ajaxComplete(funksion()) (forma. removeClass ("loading"); )); ));

u shtua në formular për të shfaqur gjendjen aktuale të kërkesës AJAX (kjo u bë e mundur falë metodave ajaxStart()) Dhe ajaxComplete (), të cilin mund ta gjeni në fund të skedarit).

Kjo klasë shfaq një skedar GIF të animuar rrotullues (si për të na lënë të kuptohet se kërkesa është duke u përpunuar), dhe gjithashtu vepron si një flamur për të parandaluar që formulari të dorëzohet përsëri (kur butoni i regjistrimit është klikuar tashmë një herë). Klasa .loggedIn është një tjetër flamur - vendoset kur është dërguar emaili. Ky flamur bllokon menjëherë çdo veprim të mëtejshëm me formularin.

Skema e bazës së të dhënave

Sistemi ynë tepër i thjeshtë i regjistrimit përdor 2 tabela MySQL (kodi SQL është në skedarin tables.sql). I pari ruan të dhëna për llogaritë e përdoruesve. E dyta ruan informacione rreth numrit të përpjekjeve për hyrje.


Skema e tabelës së përdoruesit.

Sistemi nuk përdor fjalëkalime, siç mund të shihet në diagram. Në të mund të shihni kolonën e shenjave me shenja ngjitur me kolonën e vlefshmërisë token. Shenja instalohet sapo përdoruesi lidhet me sistemin dhe vendos emailin e tij për të dërguar një mesazh (më shumë për këtë në bllokun tjetër). Kolona token_validity vendos kohën 10 minuta më vonë, pas së cilës shenja nuk është më e vlefshme.


Skema e tabelës që numëron numrin e përpjekjeve për autorizim.

Në të dyja tabelat, adresa IP ruhet në formë të përpunuar, duke përdorur funksionin ip2long në një fushë të tipit numër të plotë.

Tani mund të shkruajmë disa kode PHP. Funksionaliteti kryesor i sistemit i është caktuar klasës User.class.php, të cilën mund ta shihni më poshtë.

Kjo klasë përdor në mënyrë aktive idorm (docs), këto biblioteka janë mjetet minimale të nevojshme për të punuar me bazat e të dhënave. Ai trajton aksesin në bazën e të dhënave, gjenerimin e shenjave dhe vërtetimin e shenjave. Ai siguron një ndërfaqe të thjeshtë që e bën të lehtë lidhjen e një sistemi regjistrimi me faqen tuaj nëse përdor PHP.

User.class.php

Përdoruesi i klasës( // Rasti privat i ORM-së private $orm; /** * Gjeni një përdorues sipas shenjës. Vetëm argumentet e vlefshme pranohen për shqyrtim. Shenja gjenerohet vetëm për 10 minuta nga momenti kur u krijua * @param string $token Ky është ai që po kërkojmë token * @return Përdoruesi Ktheni vlerën e funksionit të Përdoruesit */ funksionin statik publik findByToken($token)( // gjeni tokenin në bazën e të dhënave dhe sigurohuni që vula kohore e saktë është vendosur $rezultat = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) kthe përdoruesin e ri($result); ) /** * Autorizoni ose regjistroni një përdorues * @param string $email Adresa e emailit të përdoruesit * @return Përdoruesi */ funksioni statik publik loginOrRegjistrohu($email)( // Nëse një përdorues i tillë tashmë ekziston, ktheni vlerën e funksionit të Përdoruesit nga adresa e specifikuar e emailit e ruajtur në bazën e të dhënave nëse(Përdoruesi::ekziston($email))( ktheni përdoruesin e ri($email); ) // Përndryshe, krijoni një përdorues të ri në bazën e të dhënave dhe ktheni vlerën e funksionit User::create nga emaili i specifikuar kthye User::create($email ); ) /** * Krijoni një përdorues të ri dhe ruajeni në bazën e të dhënave * @param string $email. Adresa e emailit të përdoruesit * @return Përdoruesi */ funksioni statik privat krijoni($email)( // Shkruani një përdorues të ri dhe ktheni rezultatin e funksionit të Përdoruesit nga këto vlera $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); ktheni përdoruesin e ri($result); ) /** * Kontrolloni nëse një përdorues i tillë ekziston në bazën e të dhënave dhe ktheni vlerën Boolean të variabli * @param string $email. Adresa e emailit të përdoruesit * @return boolean */ funksioni statik publik ekziston ($email)( // A ekziston përdoruesi në bazën e të dhënave? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); kthe $rezultat == 1;) /** * Krijo një objekt të ri përdoruesi * @param shembull $param ORM , id, email ose 0 * @return Përdoruesi */ funksioni publik __construct($param = null) ( if($param instanceof ORM)( // Kontrolli ORM kaloi $this->orm = $param; ) ndryshe if(is_string($param))( // Kontrolli i emailit kaloi $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) other( $id = 0; if(is_numeric($param))( // vlera e variablës $param është i kalohet identifikuesit të përdoruesit $id = $param; ) else if(isset($_SESSION["loginid"]))( // Përndryshe, shiko seancën $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Gjeneroni një token të ri autorizimi SHA1, e shkruan atë në bazën e të dhënave dhe kthen vlerën e tij * vargu @return */ funksioni publik generateToken( )( // Gjeneroni një shenjë për një përdorues të autorizuar dhe ruani atë në bazën e të dhënave $token = sha1($this->email.time().rand(0, 1000000)); // Ruajeni shenjën në bazën e të dhënave // ​​Dhe shënojeni në mënyrë që të jetë e vlefshme vetëm për 10 minutat e ardhshme $this->orm->set("token", $token); $this->orm->set_expr("vlefshmëria_token", "ADDTIME(TANI(),"0:10")"); $this->orm->save(); ktheje $token; ) /** * Autorizoni përdoruesin * @return void */ funksionin publik login())( // Shënoni përdoruesin si të regjistruar në $_SESSION["loginid"] = $this->orm->id; // Përditësoni vlera e fushës së bazës së të dhënave last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Shkatërroni seancën dhe dilni nga përdoruesi * @return void */ dalje e funksionit publik () ( $_SESSION = grup (); i pacaktuar ($_SESSION); ) /** * Kontrollo nëse përdoruesi është i identifikuar * @return boolean */ funksioni publik logedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Kontrollon nëse përdoruesi është administrator * @return boolean */ public funksioni isAdmin())( return $this->rank() = = "administrator"; ) /** * Gjeni llojin e përdoruesit, mund të jetë ose administrator ose i rregullt * @return string */ renditja e funksionit publik())( nëse ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Metoda që ju lejon të merrni informacionin privat të përdoruesit si * vetitë e objektit User * @ vargu i parametrit $key Emri i pronës që merr akses * @return i përzier */ funksioni publik __get($key)( if(isset($this->orm->$key))( return $this->orm-> $kyç; ) kthen null; ) )

Shenjat gjenerohen duke përdorur algoritmin SHA1 dhe ruhen në bazën e të dhënave. Unë jam duke përdorur funksionet e kohës së MySQL për të vendosur një kufi kohor 10-minutësh për vlefshmërinë e një token.

Kur një token vërtetohet, ne i tregojmë drejtpërdrejt mbajtësit se po shqyrtojmë vetëm shenjat që nuk kanë skaduar ende, të ruajtura në kolonën token_validity.

Ju lutemi vini re se unë jam duke përdorur metodën magjike __marr biblioteka e dokumenteve në fund të skedarit për të përgjuar aksesin në vetitë e objektit Përdorues.

Falë kësaj, bëhet e mundur qasja në informacionin e ruajtur në bazën e të dhënave falë vetive $user->email, $user->token, etj. Në fragmentin tjetër të kodit, do të shohim se si t'i përdorim këto klasa si shembull .


Faqe e mbrojtur

Një skedar tjetër që ruan funksione të dobishme dhe të nevojshme është skedari functions.php. Ekzistojnë disa të ashtuquajtura funksione ndihmëse - ndihmëse që ju lejojnë të krijoni kode më të pastër dhe më të lexueshëm në skedarë të tjerë.

funksionet.php

Funksioni send_email($from, $to, $subject, $message)( // Ndihmës që dërgon email $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Lloji i përmbajtjes: tekst /plain; charset=utf-8" . "\r\n"; $headers .= "Nga: ".$from . "\r\n"; kthese postën($to, $subject, $message, $headers ); ) funksioni get_page_url())( // Përcaktoni URL-në e skedarit PHP $url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://" .$_SERVER ["SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) tjetër( $url. = $_SERVER["PATH_INFO"]; ) kthe $url; ) funksion rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Numri i përpjekjeve për hyrje në orën e fundit në këtë adresë IP $ count_hour = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00 ")") ->count(); // Numri i përpjekjeve për hyrje në 10 minutat e fundit në këtë adresë IP $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)( hedh një përjashtim të ri ("Shumë përpjekje për hyrje!"); ) ) funksion rate_limit_tick($ip, $email)( // Krijo një rekord të ri në tabelë që numëron numrin e përpjekjeve për hyrje $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->save(); ) ridrejtimi i funksionit($url)( header("Vendndodhja: $url"); dalje; )

Funksione norma_kufi Dhe norma_kufi_tiku monitoroni numrin e përpjekjeve për autorizim gjatë periudhës kohore të kaluar që nga përpjekja e parë. Përpjekja për hyrje regjistrohet në bazën e të dhënave në kolonën reg_login_attempt. Këto funksione thirren kur të dhënat e formularit përpunohen dhe dorëzohen siç mund ta shihni nga pjesa e mëposhtme e kodit.

Kodi më poshtë është marrë nga skedari index.php dhe trajton paraqitjen e formularit. Ai kthen një përgjigje JSON, e cila nga ana tjetër përpunohet nga jQuery në skedarin assets/js/script.js që kemi parë më herët.

indeks.php

Provoni( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Nxjerr një kokë të kokës JSON ("Lloji i përmbajtjes: aplikacion/json"); // A është e vlefshme kjo adresë emaili nëse (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( hidhni një përjashtim të ri ("Ju lutemi shkruani një email të vlefshëm"); ) // Kontrolloni. përdoruesi i lejuar të identifikohet, a e ka tejkaluar numrin e lidhjeve të lejuara? (skedari functions.php për më shumë informacion) rate_limit($_SERVER["REMOTE_ADDR"]); // Regjistro këtë përpjekje për hyrje rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Dërgoni një email te përdoruesi $message = ""; $email = $_POST["email"]; $subject = "Lidhja juaj e hyrjes"; if(!Përdoruesi:: ekziston ($email) )( $subject = "Faleminderit për Regjistrimin!"; $message = "Faleminderit që u regjistrove në faqen tonë!\n\n"; ) // Përpjekje për të autorizuar ose regjistruar një përdorues $user = Përdorues ::loginOrRegister($_POST[ "email"]);$message.= "Ju mund të identifikoheni nga kjo URL:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Lidhja do të skadojë automatikisht pas 10 minutash."; $rezultat = dërgoni_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( hedh një Përjashtim të ri ("Ka pasur një gabim gjatë dërgimit të emailit tuaj. Ju lutemi provoni përsëri."); ) die(json_encode(array("message" => "Faleminderit! Ne\" kemi dërguar një lidhje në kutinë tuaj hyrëse. Kontrolloni gjithashtu dosjen e postës së padëshiruar."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() )))))

Pas hyrjes/regjistrimit të suksesshëm, kodi i mësipërm do t'i dërgojë përdoruesit një lidhje identifikimi. Shenja bëhet e disponueshme sepse kalohet si variabël në lidhjen e gjeneruar nga metoda $_MERRNI me shënues tkn

indeks.php

If(isset($_GET["tkn"]))( // A është kjo shenjë e vlefshme për autorizim? $user = Përdoruesi::findByToken($_GET["tkn"]); if($user)( // Po , është. Ridrejto te një faqe e mbrojtur $user->login();redirect("protected.php"); ) // Jo, token nuk është i vlefshëm. Ridrejto te një faqe me një formular autorizimi/regjistrimi ridrejtim("indeks. php ");)

$user->login()

do të krijojë variablat e nevojshme për seancën, në mënyrë që përdoruesi, duke parë faqet e mëvonshme të faqes, të mbetet i autorizuar gjatë gjithë kohës.

Përpunimi i funksionit për të dalë nga sistemi është rregulluar në mënyrë të ngjashme.

indeks.php

If(isset($_GET["logout"]))($user = përdorues i ri(); if($user->loggedIn())($user->logout(); ) ridrejtim("index.php") ;)

Në fund të kodit, unë përsëri vendosa një ridrejtim në index.php, pra parametri ?logout=1 Transmetimi përmes URL-së nuk kërkohet.

Skedari ynë index.php kërkon shtesë. mbrojtje - ne nuk duam që personat që kanë hyrë në sistem të shohin përsëri formularin e regjistrimit. Për këto qëllime, ne përdorim metodën $user->logedIn().

indeks.php

$përdorues = Përdorues i ri(); if($user->loggedIn())( ridrejtoj("protected.php"); )

Më në fund, këtu është një pjesë e kodit që ju lejon të mbroni faqet e faqes tuaj dhe ta bëni atë të aksesueshme vetëm pas autorizimit.

të mbrojtura.php

// Për të mbrojtur çdo faqe në faqen tuaj, përfshini një skedar main.php // dhe krijoni një objekt të ri Përdoruesi. Ja sa e lehtë është! request_once "përfshin/main.php"; $përdorues = Përdorues i ri(); if(!$user->loggedIn())( ridrejtim("index.php"); )

Pas këtij kontrolli, mund të jeni i sigurt se përdoruesi është autorizuar me sukses. Ju gjithashtu mund të përdorni informacionin e ruajtur në bazën e të dhënave duke përdorur vetitë e objektit $përdorues. Për të shfaqur emailin dhe statusin e përdoruesit, përdorni këtë kod:

Echo "Email-i juaj: ".$user->email; echo "Ranku juaj: ".$user->rank();

Metoda gradë () përdoret këtu sepse baza e të dhënave zakonisht ruan numrat (0 për një përdorues të rregullt, 1 për një administrator) dhe ne duhet t'i konvertojmë këto të dhëna në statuset të cilave u përkasin, gjë që na ndihmon kjo metodë.

Për ta bërë një përdorues të rregullt një administrator, thjesht modifikoni hyrjen e përdoruesit përmes phpMyAdmin (ose çdo programi tjetër që ju lejon të menaxhoni bazat e të dhënave). Statusi i administratorit nuk jep asnjë privilegj; në këtë shembull, faqja do të shfaqë që ju jeni një administrator - dhe kjo është ajo.

Por çfarë të bëni me këtë lihet në diskrecionin tuaj; ju mund të shkruani dhe kompozoni vetë kodin që përcakton disa privilegje dhe aftësi për administratorët.

Janë bërë!

Ne kemi mbaruar me këtë formë tepër super kuazi të thjeshtë! Mund ta përdorni në faqet tuaja PHP, është mjaft e thjeshtë. Ju gjithashtu mund ta modifikoni atë për veten tuaj dhe ta bëni ashtu siç dëshironi.

Materiali u përgatit nga Denis Malyshok posaçërisht për faqen e internetit

P.S. Dëshironi të ecni më tej në zotërimin e PHP dhe OOP? Kushtojini vëmendje mësimeve premium në aspekte të ndryshme të ndërtimit të faqes në internet, duke përfshirë programimin në PHP, si dhe një kurs falas për krijimin e sistemit tuaj CMS në PHP nga e para duke përdorur OOP:

Ju pëlqeu materiali dhe dëshironi të më falënderoni?
Thjesht ndajeni me miqtë dhe kolegët tuaj!


Për shkak të faktit se shumë shpesh lindin pyetje në lidhje me variablat globale dhe problemet që lidhen me çaktivizimin e direktivës register_globals, ne do të përpiqemi ta trajtojmë pak këtë temë në këtë artikull.

Së pari, le të përcaktojmë se cilat janë variablat e jashtëm. Këto janë çdo variabël që hyn në program nga jashtë, d.m.th. nuk janë të përcaktuara në vetë programin. Për një skript php, të gjitha variablat që kalohen përmes linjës së shfletuesit ose përmes formularit janë të jashtëm.
Le të shohim se si janë krijuar.

Nëse direktiva register_globals = On është e aktivizuar në server (në php.ini), atëherë kur kaloni variablat përmes një formulari ose përmes një linje shfletuesi, në skriptin për të cilin synohen këto variabla, ato do të krijohen automatikisht. Ato. nëse keni të shkruar në linjën e shfletuesit tuaj: www.server.ru/index.php?var=1, atëherë ndryshorja $var me vlerë të barabartë me 1 do të krijohet automatikisht në skriptin index.php.

Komentoni

Kjo direktivë është një nga pikat më të diskutueshme në gjuhën PHP. Nga njëra anë, përdorimi i tij me të vërtetë mund të shkaktojë probleme reale me mbrojtjen e skripteve PHP, nëse situatat e mundshme të gabimit nuk merren parasysh siç duhet, dhe shumë zhvillues vërejnë me të drejtë se shkrimi i skripteve pa përdorur variabla globale redukton cenueshmërinë e skripteve ndaj lloje të ndryshme sulmesh me 90%. Nga ana tjetër, në agimin e PHP, më shumë se një mijë përdorues u besuan zhvilluesve të gjuhës (deri në PHP 4.3 kjo direktivë u aktivizua si parazgjedhje), për shkak të së cilës aktualisht ka miliona skripta që funksionojnë në të vërtetë të shkruar duke përdorur variabla globale (Është vlen të përmendet se për qëllime edukative ndonjëherë është plotësisht e vlefshme të shkruhen skripta duke përdorur variabla globale, pasi zëvendësimi i tyre me grupe superglobale dëmton shumë lexueshmërinë e kodit).

Aktualisht, shumica e ofruesve të hostit e kanë të aktivizuar këtë direktivë dhe ka të ngjarë të mbetet i aktivizuar për një kohë të gjatë, pasi përndryshe mund të prishë vazhdimësinë e kodit.

Kur direktiva register_globals është e çaktivizuar, qasja në këto variabla është e mundur në dy mënyra:

  • nëpërmjet vargjeve shoqëruese HTTP_***_VARS (HTTP_POST_VARS, etj.)
  • përmes vargjeve superglobale ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES, etj.)

Vargjet superglobale janë të disponueshme në çdo fushë. Zhvilluesit e PHP rekomandojnë çaktivizimin e direktivës register_globals në server dhe punën me variabla përmes vargjeve superglobale. Ky rekomandim është për shkak të çështjeve të sigurisë që mund të lindin kur aktivizohet direktiva register_globals.

Edhe pse deri vonë, direktiva register_globals mbeti e aktivizuar në faqet pritëse. Situata filloi të ndryshojë me lëshimin e PHP 5, ku kjo direktivë është çaktivizuar si parazgjedhje dhe hostet nuk po nxitojnë ta aktivizojnë atë (ndoshta me të drejtë).

Pra, çfarë saktësisht duhet të bëni për të marrë variabla?Duhet t'i merrni ato nga grupet superglobale. Për shembull, për të kaluar variablat përmes linjës së shfletuesit, përdorni grupin $_GET. Le të themi se linja e shfletuesit thotë www.server.ru/index.php?var=1. Më pas për të marrë variablin var në index.php duhet të shkruani:

$var=$_GET["var"];

Dhe, për shembull, për të marrë variabla të transferuara nga një formular duke përdorur metodën POST, në skriptin e trajtuesit të formularit duhet të shkruani:

$var=$_POST["var"];

Në këtë artikull, do të mësoni se si të krijoni një formular regjistrimi dhe identifikimi duke përdorur HTML, JavaScript, PHP dhe MySql. Forma të tilla përdoren pothuajse në çdo faqe interneti, pavarësisht nga lloji i saj. Ato janë krijuar për një forum, një dyqan online, rrjete sociale (si Facebook, Twitter, Odnoklassniki) dhe shumë lloje të tjera faqesh.

Nëse keni një faqe interneti në kompjuterin tuaj lokal, atëherë shpresoj që tashmë keni një server lokal të instaluar dhe funksional. Pa të, asgjë nuk do të funksionojë.

Krijimi i një tabele në bazën e të dhënave

Për të zbatuar regjistrimin e përdoruesve, para së gjithash na duhet një bazë e të dhënave. Nëse e keni tashmë, atëherë shkëlqyeshëm, përndryshe, ju duhet ta krijoni atë. Në artikull, unë shpjegoj në detaje se si ta bëj këtë.

Dhe kështu, ne kemi një bazë të dhënash (shkurtuar si DB), tani duhet të krijojmë një tabelë përdoruesit në të cilin do të shtojmë përdoruesit tanë të regjistruar.

Unë gjithashtu shpjegova se si të krijoni një tabelë në një bazë të dhënash në artikull. Para se të krijojmë një tabelë, duhet të përcaktojmë se cilat fusha do të përmbajë. Këto fusha do të korrespondojnë me fushat nga formulari i regjistrimit.

Kështu, menduam, imagjinuam se çfarë fusha do të kishte forma jonë dhe krijuam një tabelë përdoruesit me këto fusha:

  • id- Identifikues. Fusha idÇdo tabelë në bazën e të dhënave duhet ta ketë atë.
  • Emri- Për të ruajtur emrin.
  • mbiemri- Për të ruajtur mbiemrin.
  • email- Për të ruajtur adresën postare. Ne do të përdorim e-mail si hyrje, kështu që kjo fushë duhet të jetë unike, domethënë të ketë indeksin UNIQUE.
  • statusi_email- Fusha për të treguar nëse posta është konfirmuar apo jo. Nëse posta konfirmohet, atëherë ajo do të ketë një vlerë prej 1, përndryshe vlera është 0.
  • fjalëkalimin- Për të ruajtur fjalëkalimin.


Nëse dëshironi që formulari juaj i regjistrimit të ketë disa fusha të tjera, mund t'i shtoni edhe këtu.

Kjo është ajo, tavolina jonë përdoruesit gati. Le të kalojmë në fazën tjetër.

Lidhja e bazës së të dhënave

Ne kemi krijuar bazën e të dhënave, tani duhet të lidhemi me të. Ne do të lidhemi duke përdorur shtesën PHP MySQLi.

Në dosjen e faqes sonë, krijoni një skedar me emrin dbconnect.php, dhe shkruani skriptin e mëposhtëm në të:

Ky skedar dbconnect.php do të duhet të lidhen për mbajtësit e formave.

Vini re variablin $adresa_site, këtu kam treguar emrin e faqes sime të testimit në të cilën do të punoj. Ju lutemi tregoni emrin e faqes tuaj në përputhje me rrethanat.

Struktura e sitit

Tani le të shohim strukturën HTML të faqes sonë.

Ne do të zhvendosim kokën dhe fundin e faqes në skedarë të veçantë, header.php Dhe footer.php. Ne do t'i përfshijmë ato në të gjitha faqet. Gjegjësisht në faqen kryesore (skedar indeks.php), në faqen me formularin e regjistrimit (skedar form_regjistrim.php) dhe në faqen me formularin e autorizimit (skedar form_auth.php).

Blloko me lidhjet tona, regjistrimin Dhe autorizimi, shtoni ato në kokën e faqes në mënyrë që të shfaqen në të gjitha faqet. Një lidhje do të hyjë në faqen me formularin e regjistrimit (skedar form_regjistrim.php) dhe tjetra në faqen me formularin e autorizimit (skedar form_auth.php).

Përmbajtja e skedarit header.php:

Emri i faqes sonë

Si rezultat, faqja jonë kryesore duket si kjo:


Sigurisht, faqja juaj mund të ketë një strukturë krejtësisht të ndryshme, por kjo nuk është e rëndësishme për ne tani. Gjëja kryesore është se ka lidhje (butona) për regjistrim dhe autorizim.

Tani le të kalojmë te formulari i regjistrimit. Siç e kuptoni tashmë, ne e kemi atë në dosje form_regjistrim.php.

Shkoni te baza e të dhënave (në phpMyAdmin), hapni strukturën e tabelës përdoruesit dhe shikoni se cilat fusha na duhen. Kjo do të thotë se na duhen fusha për futjen e emrit dhe mbiemrit, një fushë për futjen e adresës postare (Email) dhe një fushë për futjen e fjalëkalimit. Dhe për qëllime sigurie, ne do të shtojmë një fushë për të futur një captcha.

Në server, si rezultat i përpunimit të formularit të regjistrimit, mund të ndodhin gabime të ndryshme për shkak të të cilave përdoruesi nuk do të jetë në gjendje të regjistrohet. Prandaj, në mënyrë që përdoruesi të kuptojë pse regjistrimi dështon, është e nevojshme të shfaqen mesazhe në lidhje me këto gabime.

Përpara se të shfaqni formularin, shtoni një bllok për të shfaqur mesazhet e gabimit nga sesioni.

Dhe një gjë tjetër, nëse përdoruesi është tashmë i autorizuar, dhe për kuriozitet ai shkon direkt në faqen e regjistrimit duke shkruar në shiritin e adresave të shfletuesit adresa_site/form_register.php, atëherë në këtë rast, në vend të formularit të regjistrimit, ne do të shfaqim një kokë që thotë se ai tashmë është i regjistruar.

Në përgjithësi, kodi i skedarit form_regjistrim.php kemi marrë këtë:

Ju jeni regjistruar tashmë

Në shfletues, faqja me formularin e regjistrimit duket si kjo:


Duke përdorur atributin e kërkuar, ne i bëmë të detyrueshme të gjitha fushat.

Kushtojini vëmendje kodit të formularit të regjistrimit ku shfaqet captcha:


Ne specifikuam shtegun e skedarit në vlerën e atributit src për imazhin captcha.php, e cila gjeneron këtë captcha.

Le të shohim kodin e skedarit captcha.php:

Kodi është komentuar mirë, ndaj do të fokusohem vetëm në një pikë.

Brenda një funksioni imageTtfText(), shtegu për në font është specifikuar verdana.ttf. Pra, që captcha të funksionojë siç duhet, duhet të krijojmë një dosje fontet, dhe vendosni skedarin e shkronjave atje verdana.ttf. Mund ta gjeni dhe ta shkarkoni nga Interneti, ose ta merrni nga arkivi me materialet e këtij artikulli.

Kemi mbaruar me strukturën HTML, është koha për të ecur përpara.

Kontrollimi i vlefshmërisë së emailit duke përdorur jQuery

Çdo formë duhet të kontrollojë vlefshmërinë e të dhënave të futura, si në anën e klientit (duke përdorur JavaScript, jQuery) dhe në anën e serverit.

Ne duhet t'i kushtojmë vëmendje të veçantë fushës Email. Është shumë e rëndësishme që adresa postare e futur të jetë e vlefshme.

Për këtë fushë hyrëse, ne vendosëm llojin e emailit (type="email"), kjo na paralajmëron pak nga formatet e pasakta. Por kjo nuk mjafton, sepse përmes inspektorit të kodit që na ofron shfletuesi, mund të ndryshojmë lehtësisht vlerën e atributit lloji Me emailteksti, dhe kaq, çeku ynë nuk do të jetë më i vlefshëm.


Dhe në këtë rast, ne duhet të bëjmë një kontroll më të besueshëm. Për ta bërë këtë, ne do të përdorim bibliotekën jQuery nga JavaScript.

Për të lidhur bibliotekën jQuery, në skedar header.php midis etiketave , përpara etiketës mbyllëse , shtoni këtë rresht:

Menjëherë pas kësaj rreshti, ne do të shtojmë kodin e vërtetimit të emailit. Këtu do të shtojmë një kod për të kontrolluar gjatësinë e fjalëkalimit të futur. Gjatësia e saj duhet të jetë së paku 6 karaktere.

Duke përdorur këtë skript, ne kontrollojmë adresën e postës elektronike të futur për vlefshmëri. Nëse përdoruesi ka futur një email të pasaktë, ne shfaqim një mesazh gabimi në lidhje me këtë dhe çaktivizojmë butonin e paraqitjes së formularit. Nëse gjithçka është në rregull, atëherë ne heqim gabimin dhe aktivizojmë butonin e paraqitjes së formularit.

Dhe kështu, ne kemi përfunduar me vërtetimin e formularit në anën e klientit. Tani mund ta dërgojmë në server, ku do të bëjmë edhe disa kontrolle dhe do të shtojmë të dhëna në bazën e të dhënave.

Regjistrimi i përdoruesit

Ne e dërgojmë formularin në dosje për përpunim regjistrohen.php, me metodën POST. Emri i këtij skedari mbajtës është specifikuar në vlerën e atributit veprim. Dhe metoda e dërgimit specifikohet në vlerën e atributit metodë.

Hapeni këtë skedar regjistrohen.php dhe gjëja e parë që duhet të bëjmë është të shkruajmë një funksion të nisjes së sesionit dhe të lidhim skedarin që kemi krijuar më parë dbconnect.php(Në këtë skedar kemi bërë një lidhje me bazën e të dhënave). Dhe gjithashtu, le të deklarojmë menjëherë qelizat mesazhet_error Dhe mesazhet_sukses në grupin global të sesioneve. NË mesazhet_error ne do të regjistrojmë të gjitha mesazhet e gabimit që ndodhin gjatë përpunimit të formularit, dhe në mesazhet_sukses, do të regjistrojmë mesazhe të gëzueshme.

Përpara se të vazhdojmë, duhet të kontrollojmë nëse formulari është dorëzuar fare. Një sulmues mund të shikojë vlerën e atributit veprim nga formulari dhe zbuloni se cili skedar po përpunon këtë formular. Dhe ai mund të ketë idenë të shkojë drejtpërdrejt te ky skedar duke shtypur adresën e mëposhtme në shiritin e adresave të shfletuesit: http://site_adresa/register.php

Pra, ne duhet të kontrollojmë për një qelizë në grupin global POST, emri i së cilës përputhet me emrin e butonit tonë "Regjistrohu" nga formulari. Në këtë mënyrë kontrollojmë nëse butoni "Regjistrohu" është klikuar apo jo.

Nëse një sulmues përpiqet të shkojë drejtpërdrejt në këtë skedar, ai do të marrë një mesazh gabimi. Më lejoni t'ju kujtoj se ndryshorja $address_site përmban emrin e sajtit dhe është deklaruar në skedar dbconnect.php.

Vlera captcha në seancë u shtua kur u krijua, në skedar captcha.php. Si kujtesë, do t'ju tregoj përsëri këtë pjesë të kodit nga skedari captcha.php, ku vlera captcha i shtohet seancës:

Tani le të vazhdojmë me vetë verifikimin. Në dosje regjistrohen.php, brenda bllokut if, ku kontrollojmë nëse është klikuar butoni "Regjistrohu", ose më mirë ku tregohet komenti "" // (1) Hapësirë ​​për pjesën tjetër të kodit"ne shkruajmë:

//Kontrollo kaptchën e marrë //Të shkurtosh hapësirat nga fillimi dhe fundi i rreshtit $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Krahaso vlerën e marrë me vlerën nga sesioni. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Nëse captcha nuk është e saktë, atëherë ne e kthejmë përdoruesin në faqen e regjistrimit dhe atje do t'i shfaqim atij një mesazh gabimi se ai ka futur captcha të gabuar $error_message = "

Gabim! Ke futur captcha të gabuar

"; // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] = $error_message; // Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Moved Permanently"); header("Vendndodhja: " .$address_site ."/form_register.php"); //Ndalo daljen e skriptit(); ) // (2) Vendi për pjesën tjetër të kodit )else( //Nëse captcha nuk kalohet ose është bosh dilni ("

Gabim! Nuk ka asnjë kod verifikimi, domethënë një kod captcha. Mund të shkoni në faqen kryesore.

"); }

Më pas, duhet të përpunojmë të dhënat e marra nga grupi POST. Para së gjithash, duhet të kontrollojmë përmbajtjen e grupit global POST, domethënë nëse ka qeliza atje, emrat e të cilëve korrespondojnë me emrat e fushave hyrëse nga forma jonë.

Nëse qeliza ekziston, atëherë shkurtojmë hapësirat nga fillimi dhe fundi i rreshtit nga kjo qelizë, përndryshe, e ridrejtojmë përdoruesin përsëri në faqen me formularin e regjistrimit.

Më pas, pasi të kemi shkurtuar hapësirat, i shtojmë rreshtin variablës dhe e kontrollojmë këtë variabël për zbrazëti, nëse nuk është bosh, vazhdojmë, përndryshe e ridrejtojmë përdoruesin përsëri në faqen me formularin e regjistrimit.

Ngjite këtë kod në vendndodhjen e specifikuar" // (2) Hapësirë ​​për pjesën tjetër të kodit".

/* Kontrolloni nëse ka të dhëna të dërguara nga formulari në grupin global $_POST dhe mbështillni të dhënat e dorëzuara në variabla të rregullt.*/ if(isset($_POST["first_name"]))( //Shkurtoni hapësirat nga fillimi dhe fundi i vargut $first_name = trim($_POST["first_name"]); //Kontrollo variablin për zbrazëti if(!empty($first_name))( // Për siguri, konverto karaktere speciale në entitete HTML $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

Shkruaj emrin tend

Mungon fusha e emrit

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_register.php"); //Ndalo daljen e skriptit(); ) if( isset($_POST["last_name"]))( //Shkurto hapësirat nga fillimi dhe fundi i rreshtit $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // Për siguri, konvertoni karakteret speciale në entitete HTML $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

Ju lutemi shkruani mbiemrin tuaj

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_register.php"); //Ndalo daljen e skriptit(); ) )else ( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

Mungon fusha e mbiemrit

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_register.php"); //Ndalo daljen e skriptit(); ) if( isset($_POST["email"]))( //Shkurto hapësirat nga fillimi dhe fundi i rreshtit $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Vendndodhja e kodit për kontrollimin e formatit të adresës së emailit dhe unike të saj )else( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] . = "

Shkruani emailin tuaj

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_register.php"); //Ndalo daljen e skriptit(); ) )else ( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_register.php"); //Ndalo daljen e skriptit(); ) if( isset($_POST["fjalëkalimi"]))( //Prit hapësirat nga fillimi dhe fundi i vargut $password = trim($_POST["password"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Enkriptoni fjalëkalimin $password = md5($password."top_secret"); )else( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] . = "

Futni fjalëkalimin tuaj

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_register.php"); //Ndalo daljen e skriptit(); ) )else ( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_register.php"); //Ndalo daljen e skriptit(); ) // (4) Vendi për kodin për shtimin e një përdoruesi në bazën e të dhënave

Me rëndësi të veçantë është fusha email. Ne duhet të kontrollojmë formatin e adresës postare të marrë dhe veçantinë e saj në bazën e të dhënave. Kjo do të thotë, a ka ndonjë përdorues me të njëjtën adresë emaili të regjistruar tashmë?

në vendin e caktuar" // (3) Vendndodhja e kodit për të kontrolluar formatin e adresës postare dhe veçantinë e saj" shtoni kodin e mëposhtëm:

//Kontrollo formatin e adresës së emailit të marrë duke përdorur një shprehje të rregullt $reg_email = "/^**@(+(*+)*\.)++/i"; //Nëse formati i adresës së emailit të marrë nuk përputhet me shprehjen e rregullt if(!preg_match($reg_email, $email))( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

Ke futur një email të pasaktë

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_register.php"); //Ndalo daljen e skriptit(); ) // Kontrollojmë nëse një adresë e tillë është tashmë në bazën e të dhënave. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /Nëse numri i të pranuarve është saktësisht një rresht, që do të thotë se përdoruesi me këtë adresë emaili është tashmë i regjistruar nëse ($result_query->num_rows == 1)( //Nëse rezultati që rezulton nuk është i rremë nëse (($row = $result_query->fetch_assoc()) != false) ( // Ruaje mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

Një përdorues me këtë adresë emaili është regjistruar tashmë

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 u zhvendos përgjithmonë"); header("Vendndodhja: ".$address_site."/form_register.php"); )else( // Ruani mesazhin e gabimit në seancë . $_SESSION["error_messages"] .= "

Gabim në pyetjen e bazës së të dhënave

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_register.php"); ) /* duke mbyllur përzgjedhjen */ $ result_query-> mbyll (); //Ndalo daljen e skriptit (); ) /* duke mbyllur përzgjedhjen */ $result_query->mbyll();

Dhe kështu, ne kemi mbaruar me të gjitha kontrollet, është koha për të shtuar përdoruesin në bazën e të dhënave. në vendin e caktuar" // (4) Vendi për kodin për shtimin e një përdoruesi në bazën e të dhënave" shtoni kodin e mëposhtëm:

//Pyetje për të shtuar një përdorues në bazën e të dhënave $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email, password) VALUES ("".$first_name."", "".$last_name ." ", "".$email.", "".$password."")"); if(!$result_query_insert)( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

Gabim në kërkesën për të shtuar përdorues në bazën e të dhënave

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_register.php"); //Ndalo daljen e skriptit(); )else( $_SESSION["success_messages"] = "

Regjistrimi përfundoi me sukses!!!
Tani mund të identifikoheni duke përdorur emrin e përdoruesit dhe fjalëkalimin tuaj.

"; //Dërgo përdoruesin në kokën e faqes së autorizimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_auth.php"); ) /* Përfundimi i kërkesës */ $ result_query_insert-> close();//Mbyll lidhjen me bazën e të dhënave $mysqli->close();

Nëse ka ndodhur një gabim në kërkesën për të shtuar një përdorues në bazën e të dhënave, ne shtojmë një mesazh në lidhje me këtë gabim në seancë dhe e kthejmë përdoruesin në faqen e regjistrimit.

Përndryshe, nëse gjithçka shkoi mirë, ne i shtojmë edhe një mesazh seancës, por këtë herë është më e këndshme, domethënë i themi përdoruesit që regjistrimi ishte i suksesshëm. Dhe ne e ridrejtojmë atë në faqen me formularin e autorizimit.

Skripti për kontrollimin e formatit të adresës së emailit dhe gjatësisë së fjalëkalimit është në skedar header.php, kështu që do të zbatohet edhe për fushat nga ky formular.

Fillohet edhe seanca në dosje header.php, pra në dosje form_auth.php Nuk ka nevojë të fillojmë një seancë, sepse do të kemi një gabim.


Siç thashë tashmë, skripti për kontrollimin e formatit të adresës së postës elektronike dhe gjatësisë së fjalëkalimit gjithashtu funksionon këtu. Prandaj, nëse përdoruesi fut një adresë të gabuar emaili ose fjalëkalim të shkurtër, ai menjëherë do të marrë një mesazh gabimi. Një buton për të hyrë do të bëhet joaktive.

Pas rregullimit të gabimeve, butoni për të hyrë bëhet aktiv dhe përdoruesi do të mund ta dërgojë formularin në server, ku do të përpunohet.

Autorizimi i përdoruesit

Për të atribuar vlerën veprim handikapi i autorizimit ka një dosje të specifikuar auth.php, kjo do të thotë se formulari do të përpunohet në këtë skedar.

Dhe kështu, hapni skedarin auth.php dhe shkruani kodin për të përpunuar formularin e autorizimit. Gjëja e parë që duhet të bëni është të filloni një seancë dhe të lidhni skedarin dbconnect.php për t'u lidhur me bazën e të dhënave.

Kur klikoni në lidhjen e daljes nga faqja, ne çojmë te një skedar dalje.php, ku thjesht shkatërrojmë qelizat me adresën e emailit dhe fjalëkalimin nga sesioni. Pas kësaj, ne e kthejmë përdoruesin në faqen në të cilën është klikuar lidhja dalje.

Kodi i skedarit logout.php:

Kjo eshte e gjitha. Tani ju e dini se si të zbatoni dhe përpunoni formularët e regjistrimit dhe autorizimit të përdoruesve në faqen tuaj të internetit. Këto forma gjenden pothuajse në çdo faqe interneti, kështu që çdo programues duhet të dijë se si t'i krijojë ato.

Mësuam gjithashtu se si të vërtetojmë të dhënat hyrëse, si në anën e klientit (në shfletues, duke përdorur JavaScript, jQuery) dhe në anën e serverit (duke përdorur PHP). Mësuam gjithashtu se si të zbatojmë një procedurë për largimin nga siti.

Të gjitha skriptet janë testuar dhe janë duke punuar. Nga kjo lidhje mund ta shkarkoni arkivin me skedarët e kësaj faqeje të vogël.

Në të ardhmen do të shkruaj një artikull ku do të përshkruaj. Dhe gjithashtu planifikoj të shkruaj një artikull ku do të shpjegoj (pa ringarkuar faqen). Pra, në mënyrë që të qëndroni të informuar për publikimin e artikujve të rinj, ju mund të abonoheni në faqen time të internetit.

Nëse keni ndonjë pyetje, ju lutem më kontaktoni dhe nëse vëreni ndonjë gabim në artikull, ju lutem më njoftoni.

Plani i mësimit (Pjesa 5):

  • Krijimi i një strukture HTML për formularin e autorizimit
  • Ne përpunojmë të dhënat e marra
  • Ne shfaqim përshëndetjen e përdoruesit në kokën e faqes
  • Ju pëlqeu artikulli?

    Nuk e di pse... jo, e di pse nuk mund të aktivizosh direktivën register_globals, por nuk e di pse në literaturë, si rregull, nuk thuhet asgjë për këtë.

    Në këtë artikull do të përpiqem t'i nxjerr nga tanku të gjithë ata që janë ulur në të dhe të shpjegoj se çfarë është (sidomos për ata në trenin e blinduar - shënimi i redaktorit). Nuk është më kot që disa hoste e çaktivizojnë këtë direktivë. Kështu që…

    Si punon

    Në cilësimet e PHP (skedari php.ini) ekziston një direktivë e tillë register_globals. Kuptimi i tij është se nëse është i aktivizuar (register_globals = on), atëherë të gjitha variablat e kaluar përmes GET dhe POST do të regjistrohen automatikisht si globale. Çfarë do të thotë?

    Për shembull, ne ia kalojmë metodën GET skriptit index.php disa vlera të faqes: index.php?page=2. Vlera e kaluar ruhet në një grup GET dhe mund të përdoret në një skript si $_GET["faqe"]. Megjithatë, nëse kemi të aktivizuar register_globals, atëherë do të krijohet një variabël $page për vlerën e kaluar, e cila është e disponueshme në çdo pjesë të skriptit index.php.

    Një përmbledhje dhe një shtesë e vogël. Kur aktivizohet register_globals, krijohen tre kopje të ndryshores: në grupin GET, në grupin GLOBALS dhe thjesht vetë variablin ($_GET["page"], $GLOBALS["page"], $page), ndërsa kur register_globals është i çaktivizuar, vlera e kaluar mund të aksesohet vetëm përmes grupit GET ($_GET["faqe"]). Mbani mend.

    Rreziku i përdorimit

    Le të shohim një shembull të thjeshtë për të kuptuar se çfarë na pret (nga 3 deri në 5 vjet - shënimi i redaktorit). Për ta bërë më të lehtë, do të them menjëherë se $login dhe $password janë variabla të kaluar nga metoda GET/POST.

    Shkurtimisht për atë që bën skenari:

      Rreshti 2. Ne bëjmë një kërkesë në bazën e të dhënave në mënyrë që të nxjerrim fjalëkalimin e vërtetë për hyrjen e futur nga përdoruesi.

      Rreshti 3. Marrim këtë fjalëkalim dhe ia caktojmë variablit $real_pass.

      Rreshti 4. Krahasojmë fjalëkalimin real me atë të futur dhe nëse ato përputhen, atëherë ndryshorja $check do t'i caktohet true.

      Rreshtat 5-8. Nëse $check është e vërtetë, atëherë shkruajmë se autorizimi ishte i suksesshëm, etj.

    Skenari i propozuar, sipas përkufizimit, është më i rrjedhshëm në botë, dhe tani unë do t'ju tregoj këto vrima. Kushti: register_globals është i aktivizuar.

    Le të themi se transferimi kryhet duke përdorur metodën GET. Atëherë url do të duket diçka si kjo:
    www.site.com/index.php?login =admin&fjalëkalimi =qwerty
    Është e qartë se ndryshoret globale $login dhe $password krijohen menjëherë. Tani shikoni skenarin. Ai përmban variablin $check. Po sikur ta kaloni përmes URL-së?

    www.site.com/index.php?login =admin&fjalëkalimi =qwerty&kontrollo =1
    Pastaj kontrolli i përputhjes së fjalëkalimit anashkalohet dhe përdoruesi autorizohet menjëherë (në fund të fundit, a ju kujtohet se 1 është e vërtetë dhe 0 është e gabuar?). I njëjti rezultat do të ndodhë nëse shkruajmë www.faqe.com/indeks.php?kontrolloni =1 . Dhe edhe nëse përdorni metodën POST, të gjitha mashtrimet e tilla do të vazhdojnë të funksionojnë, pasi kur aktivizohet register_globals, nuk ka rëndësi se çfarë metode përdorni - GET ose POST.

    Unë mendoj se dikush ka një pyetje, si e di një cracker për variablin e kontrollit, se ai është përgjegjës për gjithçka? Nëse nuk ia keni treguar askujt skenarin, ai nuk ka gjasa ta dijë atë. Megjithatë, jo të gjithë përdorin skriptet e tyre, CMS, etj., por përdorin atë që është në dispozicion në rrjet. Në raste të tilla, një krisur, për shembull, mund të studiojë kodin CMS dhe të sulmojë faqet e krijuara me ndihmën e tij.

    Megjithatë, jo të gjithë hostet çaktivizojnë register_globals, dhe edhe nëse skriptet tuaja janë krijuar që të mos kenë të aktivizuar register_globals, një cracker mund të hakojë skriptin tuaj duke përdorur cenueshmërinë e kësaj direktive.

    Le të marrim shembullin tonë. Për ta mbrojtur atë në rast se register_globals është i aktivizuar, pas rreshtit nëse ($fjalëkalim==$real_kaloj)$kontrollo =e vërtetë; shtoni sa vijon: tjetër$kontrollo =i rremë;. Në këtë rast, edhe nëse ndryshorja e kontrollit e barabartë me një kalohet nga metoda GET, skripti do të vendosë përsëri $check=false nëse fjalëkalimi është i pasaktë.

    Po, unë gjithashtu do të doja të tërhiqja vëmendjen tuaj për faktin se nëse fikni register_globals, atëherë shembulli ynë nuk do të funksionojë. Dhe që të funksionojë, duhet të shkruani $login = $_POST["login"]; $fjalëkalim = $_POST["fjalëkalim"];

    Le ta përmbledhim ...

    dhe nxirrni dy përfundime kryesore:

    1) Kur register_globals është i aktivizuar, mund të kaloni variabla të ndryshëm, vlerat për të cilat nuk janë llogaritur të merren përmes GET ose POST.

    2) Register_globals në vetvete nuk është aq i rrezikshëm sa një skenar i shkruar shtrembër.

    Kaq për sot! Do të jem shumë i lumtur të shoh komentet, vërejtjet, sugjerimet dhe vetëm komentet tuaja. Prandaj, shkruani, mos ki turp!

    Me urime për një javë të suksesshme,
    Alexander SHUYSKY