Ndryshuar për herë të fundit më 20 gusht 2019 nga Vincy.

Hyrja dhe regjistrimi i përdoruesit është një kërkesë bazë për çdo aplikacion CMS. Kjo është puna fillestare gjatë fillimit të një projekti. Aplikacioni me autentifikimin e hyrjes së përdoruesit ofron siguri duke parandaluar aksesin anonim. Ka mënyra të ndryshme për të aktivizuar vërtetimin në aplikacionin tonë si duke aktivizuar hyrjen në OAuth ose duke zbatuar Single Sign-on (SSO) dhe mënyra të tjera të ngjashme. Në një tutorial të mëparshëm, ne kemi parë se si të zbatojmë dhe gjithashtu rreth .

Ky shembull përfshin si funksionet e hyrjes ashtu edhe të regjistrimit. Unë kam përdorur bazën e të dhënave MySQL për të ruajtur anëtarët e regjistruar. Regjistrimi i përdoruesit do të përmbajë të dhëna për të marrë detajet nga përdoruesi. Me dorëzimin e këtij formulari, të dhënat e formularit postohen në PHP dhe ruhen në bazën e të dhënave. Fjalëkalimi i përdoruesit do të kodohet përpara se të ruhet në bazën e të dhënave. përpara se të postoni në kodin PHP. Kur përdoruesi është identifikuar me kredencialet e vlefshme, atëherë përdoruesi dhe ai do të lejohen të vazhdojnë më tej.

Formulari i regjistrimit të përdoruesit

Ky kod është për t'i treguar përdoruesit formularin e regjistrimit. Kur përdoruesi dorëzon formularin me të dhënat e tij, funksioni JavaScript do të thirret për të vërtetuar hyrjen e përdoruesit. Pas vërtetimit të suksesshëm, kodi PHP do të lexojë të dhënat e formularit të postuar për të ekzekutuar futjen e bazës së të dhënave.

">

Vleresimi i JavaScript do të kujdeset për kontrollin jo bosh të fushave të detyrueshme dhe gjithashtu vërtetimin e formatit të emailit me model regex.

Ky kod PHP për të krijuar insert duke përdorur të dhënat e formularit të regjistrimit. Pas ekzekutimit të insertit të bazës së të dhënave, përgjigja e suksesit/gabimit do të dërgohet për të njohur përdoruesin.

OpenConnection(); $sql1 = "zgjidh emrin, emailin nga tbl_registered_users ku email = "$email""; $user = $db->pyetës($sql1); $rezultat = $user->fetchAll(); $_SESSION["emailname"] = $rezultat["email"]; if (empty($result)) ( $sql = "fut në tbl_registered_users (emri, emaili, fjalëkalimi) vlerat ("$name","$email","$password")"; $db->exec($sql $database->closeConnection(); $response = array("type" => "sukses", "message" => "Je regjistruar me sukses.
Tani Hyr."); ) else ( $response = array("type" => "gabim", "message" => "Email tashmë në përdorim."); ) ) ?>

Autentifikimi i hyrjes duke përdorur PHP

Përdoruesi i regjistruar mund të identifikohet në aplikacion përmes këtij formulari identifikimi. Autentifikimi i hyrjes bëhet duke përputhur emailin e hyrjes dhe fjalëkalimin me bazën e të dhënave të përdoruesve të regjistruar. Nëse gjendet përputhje, atëherë aplikacioni do të lejojë përdoruesin të vazhdojë më tej. Përndryshe, paneli i hyrjes do të njohë përdoruesin për përpjekjen e pavlefshme.

Kodi PHP për vërtetimin e hyrjes së përdoruesit me bazën e të dhënave është paraqitur më poshtë. Pas hyrjes së suksesshme, unë e ridrejtoj përdoruesin në dashboard.php. Paneli do të shfaqë mesazhin e mirëseardhjes duke iu drejtuar anëtarit të identifikuar. Gjithashtu, do të ketë një opsion për të dalë nga sesioni aktual.

OpenConnection(); $sql = "zgjidh * nga tbl_registered_users ku email = "$email" dhe fjalëkalimi = "$password""; $user = $db->pyetës($sql); $rezultat = $user->fetchAll(PDO::FETCH_ASSOC); $id = $rezultat["id"]; $emri = $rezultat["emri"]; $email = $rezultat["email"]; $_SESSION["emri"] = $emri; $_SESSION["id"] = $id; $baza e të dhënave->closeConnection(); header ("lokacioni: dashboard.php"); ) ?>

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

Nëse keni një sajt në kompjuterin tuaj lokal, atëherë shpresoj ta keni tashmë. Asgjë nuk do të funksionojë pa të.

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

Për të zbatuar regjistrimin e përdoruesit, së pari na duhet një bazë të dhënash. 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 DB), tani duhet të krijojmë një tabelë përdoruesit në të cilin do të shtojmë përdoruesit tanë të regjistruar.

Si të krijoni një tabelë në bazën e të dhënave, shpjegova gjithashtu në artikull. Para se të krijojmë një tabelë, duhet të përcaktojmë se cilat fusha do të përmbajë. Këto fusha do të përputhen me fushat nga formulari i regjistrimit.

Pra, menduam, imagjinuam se çfarë fushash do të ketë forma jonë dhe krijojmë një tabelë përdoruesit me këto fusha:

  • id- Identifikues. Fusha id duhet të jetë në çdo tabelë nga baza e të dhënave.
  • 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ë një indeks UNIK.
  • statusi_email- Një fushë për të treguar nëse posta është konfirmuar apo jo. Nëse posta konfirmohet, atëherë ajo do të ketë vlerën 1, përndryshe vlerën 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ë hapin tjetër.

Lidhja me bazën e 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 MySQLi PHP.

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

Gabim i lidhjes së bazës së të dhënave. Përshkrimi i gabimit: ".mysqli_connect_error()."

"; exit(); ) // Vendosni kodimin e lidhjes $mysqli->set_charset("utf8"); //Për lehtësi, shtoni këtu një variabël që do të përmbajë emrin e faqes sonë $address_site = "http://testsite .lokale" ; ?>

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

Kushtojini vëmendje variablit $adresa_site, këtu kam treguar emrin e faqes sime të testimit, në të cilën do të punoj. Në përputhje me rrethanat, ju tregoni emrin e faqes tuaj.

Struktura e sitit

Tani le të hedhim një vështrim në strukturën HTML të faqes sonë.

Zhvendosni kokën dhe fundin e faqes në skedarë të veçantë, header.php dhe footer.php. Ne do t'i lidhim ato në të gjitha faqet. Gjegjësisht, në skedarin kryesor (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 në kokën e sajtit në mënyrë që ato të shfaqen në të gjitha faqet. Një lidhje do të hyjë faqja e formularit të regjistrimit(skedar form_regjistrim.php) dhe tjetra në faqen me formulari i 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 keni kuptuar tashmë, e kemi në dosje form_regjistrim.php.

Shkojmë në bazën e të dhënave (në phpMyAdmin), hapim strukturën e tabelës përdoruesit dhe shikoni se cilat fusha na duhen. Pra, na duhen fusha për futjen e emrit dhe mbiemrit, një fushë për futjen e një adrese postare (Email) dhe një fushë për futjen e një fjalëkalimi. Dhe për qëllime sigurie, ne do të shtojmë një fushë të hyrjes 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'i shfaqni atij mesazhe në lidhje me këto gabime.

Përpara shfaqjes së formularit, ne shtojmë një bllok për të shfaqur mesazhet e gabimit nga sesioni.

Dhe një moment tjetër, nëse përdoruesi është tashmë i autorizuar, dhe për hir të interesit, ai hyn direkt në faqen e regjistrimit duke shkruar në shiritin e adresave të shfletuesit website_url/form_register.php, atëherë në këtë rast, në vend të formularit të regjistrimit, do të shfaqim një titull për të që ai tashmë është i regjistruar.

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

Ju jeni regjistruar tashmë

Në shfletues, faqja e regjistrimit duket si kjo:


Nëpërmjet atributi i kërkuar, i kemi bërë të detyrueshme të gjitha fushat.

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


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

Le të shohim kodin e skedarit captcha.php:

Kodi është komentuar mirë, kështu që unë 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.

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

Validimi i emailit me jQuery

Çdo formë ka nevojë për vërtetim të 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 e postës elektronike 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ë ndryshoni 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, shtoni kodin e kontrollit të vërtetimit të emailit. Këtu shtojmë kodin për të kontrolluar gjatësinë e fjalëkalimit të futur. Duhet të jetë së paku 6 karaktere të gjatë.

Me ndihmën e këtij skripti, ne kontrollojmë adresën e postës elektronike të futur për vlefshmëri. Nëse përdoruesi ka futur emailin e gabuar, atëherë ne shfaqim një gabim në lidhje me 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, me vërtetimin e formularit në anën e klientit, ne kemi mbaruar. 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 dërgojmë formularin për përpunim në dosje regjistrohen.php, me metodën POST. Emri i këtij skedari mbajtës, i 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ë përfshijmë skedarin që kemi krijuar më parë dbconnect.php(Në këtë skedar kemi bërë një lidhje me bazën e të dhënave). E megjithatë, menjëherë deklaroni qelizat mesazhet_error dhe mesazhet_sukses në grupin global të sesionit. AT mesazhet_error ne do të regjistrojmë të gjitha mesazhet e gabimit që ndodhin gjatë përpunimit të formularit, dhe në mesazhet_sukses Le të shkruajmë mesazhe të lumtura.

Para se të vazhdojmë, duhet të kontrollojmë nëse formulari është dorëzuar fare. Një sulmues mund të shikojë vlerën e një atributi veprim nga formulari dhe zbuloni se cili skedar po përpunon këtë formular. Dhe ai mund të vijë me idenë për të shkuar direkt në këtë skedar duke shtypur adresën e mëposhtme në shiritin e adresave të shfletuesit: http://site_site/register.php

Pra, ne duhet të kontrollojmë nëse ka një qelizë në grupin global POST, emri i së cilës përputhet me emrin e butonit tonë "Regjistrohu" nga formulari. Kështu, ne kontrollojmë nëse butoni "Regjistrohu" është shtypur apo jo.

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

Gabim! Faqja Kryesore .

"); } ?>

Vlera captcha në seancë u shtua gjatë gjenerimit të saj, në skedar captcha.php. Si kujtesë, unë do të tregoj edhe një herë këtë pjesë të kodit nga skedari captcha.php, ku vlera captcha i shtohet seancës:

Tani le të kalojmë në vetë testin. Në dosje regjistrohen.php, brenda bllokut if, ku kontrollojmë nëse është shtypur butoni "Regjistrohu", ose më mirë, ku është komenti " // (1) Vendi për pjesën tjetër të kodit"ne shkruajmë:

//Kontrollo kaptchën e marrë //Trim hapësirat nga fillimi dhe nga fundi i vargut $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ë kthejeni përdoruesin në faqen e regjistrimit dhe atje do të shfaqim 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ë kodin captcha. Mund të shkoni në faqen kryesore.

"); }

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

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

Më tej, pasi të jenë shkurtuar hapësirat, i shtojmë një varg variablit dhe e kontrollojmë këtë variabël për zbrazëti, nëse nuk është bosh, atëherë vazhdojmë, përndryshe e ridrejtojmë përdoruesin përsëri në faqen me formularin e regjistrimit.

Ngjitni këtë kod në vendndodhjen e specifikuar // (2) Vendi për pjesën tjetër të kodit".

/* Kontrolloni nëse grupi global $_POST përmban të dhëna të dorëzuara nga formulari dhe bashkojini të dhënat e paraqitura në variabla të rregullt.*/ if(isset($_POST["first_name"]))( // Shkurtoni hapësirat nga fillimi dhe fundi i vargu $first_name = trim($_POST["first_name"]); //Kontrollo nëse ndryshorja është bosh if(!empty($first_name))( // Për siguri, konverto karakteret speciale në entitete HTML $first_name = htmlspecialchars( $first_name, ENT_QUOTES) ; )else( // Ruaje 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"]))( // Pritini hapësirat nga fillimi dhe fundi i vargut $last_name = shkurtoj($_POST["last_name"]); if(!empty($last_name)) ( // Për siguri, konvertoni karaktere speciale në entitete HTML $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

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 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["email"]))( // Pritini hapësirat nga fillimi dhe fundi i vargut $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Vendi i kodit për të kontrolluar formatin e adresës së postës elektronike dhe veçantinë e 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"]))( // Prisni hapësirat nga fillimi dhe fundi i vargut $password = trim($_POST["fjalëkalimi"]); 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

Fusha ka një rëndësi të veçantë. email. Duhet të kontrollojmë formatin e adresës postare të marrë dhe uniken e saj në bazën e të dhënave. Kjo do të thotë, nëse një përdorues me të njëjtën adresë emaili është regjistruar tashmë.

në vendin e caktuar" // (3) Vendi i 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 shprehjen e 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ë pavlefshëm

"; //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(); ) // Kontrolloni nëse ekziston tashmë një adresë e tillë në bazën e të dhënave $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); Nëse ka janë saktësisht një rresht, atëherë përdoruesi me këtë adresë emaili është tashmë i regjistruar nëse($result_query->num_rows == 1)( //Nëse rezultati nuk është false if(($row = $result_query->fetch_assoc()) ! = false) ( // Ruaje mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

Përdoruesi me këtë adresë emaili është tashmë i regjistruar

"; //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"); )else( //Ruaj mesazhin e gabimit në seancën .$_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 Moved Permanently"); header("Vendndodhja: ".$address_site."/form_register.php"); ) /* mbyllni përzgjedhjen */ $ result_query-> mbyll (); //Ndalo daljen e skriptit(); ) /* mbyll 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"] .= "

Kërkesë gabimi për të shtuar një 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ë hyrjes ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_auth.php"); ) /* Plotëso kërkesën */ $ result_query_insert-> close();//Mbyll lidhjen e bazës së të dhënave $mysqli->close();

Nëse ndodh 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 tashmë është më e këndshme, domethënë, i tregojmë përdoruesit se regjistrimi ishte i suksesshëm. Dhe ne e ridrejtojmë atë në faqen me formularin e autorizimit.

Skripti për të kontrolluar formatin e adresës së emailit dhe gjatësinë e fjalëkalimit është në skedar header.php, kështu që do të ndikojë edhe në fushat nga ajo formë.

Fillohet edhe seanca në dosje header.php, pra në dosje form_auth.php seanca nuk ka nevojë të fillohet, sepse kemi një gabim.


Siç thashë, skripti për të kontrolluar formatin e adresës së postës dhe gjatësinë e fjalëkalimit gjithashtu funksionon këtu. Prandaj, nëse përdoruesi fut adresën e gabuar të emailit ose fjalëkalimin e 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 mund ta dorëzojë formularin në serverin ku do të përpunohet.

Autorizimi i përdoruesit

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

Pra, le të hapim 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 seancën dhe të përfshini skedarin dbconnect.php për t'u lidhur me bazën e të dhënave.

//Deklaroni një qelizë për të shtuar gabime që mund të ndodhin gjatë përpunimit të formularit. $_SESSION["error_messages"] = ""; //Deklaroni një qelizë për të shtuar mesazhe të suksesshme $_SESSION["success_messages"] = "";

/* Kontrolloni nëse formulari është dorëzuar, domethënë nëse është klikuar butoni Login. Nëse po, atëherë shkojmë më tej, nëse jo, atëherë do t'i shfaqim përdoruesit një mesazh gabimi, duke thënë se ai shkoi drejtpërdrejt në këtë faqe. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) Vendi për pjesën tjetër të kodit )else( dalje ("

Gabim! Ju keni hyrë drejtpërdrejt në këtë faqe, kështu që nuk ka të dhëna për t'u përpunuar. Mund të shkoni në faqen kryesore.

"); }

//Kontrollo captcha-në e marrë if(isset($_POST["captcha"]))( //Të shkurtosh hapësirat nga fillimi dhe fundi i vargut $captcha = trim($_POST["captcha"]); if(!bosh ($captcha ))( //Krahaso vlerën e marrë me vlerën nga seanca. if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != ""))( // Nëse captcha është e pavlefshme, atëherë ne e kthejmë përdoruesin në faqen e autorizimit dhe aty do të shfaqim 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ë autorizimit ("HTTP/1.1 301 Moved Permanently"); header("Vendndodhja: " .$address_site ."/form_auth.php"); //Ndalo daljen e skriptit(); ) )else( $error_message = "

Gabim! Fusha e hyrjes captcha nuk duhet të jetë bosh.

"; // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] = $error_message; // Kthejeni përdoruesin në kokën e faqes së autorizimit ("HTTP/1.1 301 Moved Permanently"); header("Vendndodhja: " .$address_site ."/form_auth.php"); //Ndalo daljen e skriptit(); ) //(2) Vendi për përpunimin e adresës së postës //(3) Vendi për përpunimin e fjalëkalimit //(4) Vendi për duke bërë një pyetje në bazën e të dhënave )else ( //Nëse captcha nuk kalohet, dilni ("

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

"); }

Nëse përdoruesi e ka futur saktë kodin e verifikimit, atëherë ne vazhdojmë, në të kundërt e kthejmë atë në faqen e autorizimit.

Verifikimi i adresës së emailit

// Pritini hapësirat nga fillimi dhe fundi i vargut $email = trim($_POST["email"]); if(isset($_POST["email"]))( if(!empty($email))($email = htmlspecialchars($email, ENT_QUOTES); //Kontrollo formatin e adreses se emailit te marre duke perdorur shprehjen e 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 ))( // Ruaje në mesazhin e gabimit të sesionit.$_SESSION["error_messages"] .= "

Ke futur një email të pavlefshëm

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

Fusha për futjen e adresës postare (email) nuk duhet të jetë bosh.

"; //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"] .= "

Nuk ka fushë për të futur Email

"; //Kthejeni përdoruesin në kokën e faqes së autorizimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header ("Vendndodhja: ".$address_site."/form_auth.php"); //Ndalo daljen e skriptit(); ) // (3) Vendi për përpunimin e fjalëkalimit

Nëse përdoruesi ka futur një adresë emaili në format të gabuar ose vlera e fushës së adresës së emailit është bosh, atëherë e kthejmë atë në faqen e autorizimit, ku shfaqim një mesazh për këtë.

Kontrolli i fjalëkalimit

Fusha tjetër për t'u përpunuar është fusha e fjalëkalimit. në vendin e caktuar" //(3) Vendi për përpunimin e fjalëkalimit", ne shkruajmë:

If(isset($_POST["fjalëkalimi"]))( // Pritni 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_auth.php"); //Ndalo daljen e skriptit(); ) )else ( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

Nuk ka asnjë fushë për të futur një fjalëkalim

"; //Kthejeni përdoruesin në kokën e faqes së regjistrimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header("Vendndodhja: ".$address_site."/form_auth.php"); //Ndalo daljen e skriptit(); )

Këtu, duke përdorur funksionin md5 (), kodojmë fjalëkalimin e marrë, pasi në bazën e të dhënave kemi fjalëkalime në formë të koduar. Fjalë sekrete shtesë në enkriptim, në rastin tonë " top_sekret" duhet të jetë ai që është përdorur gjatë regjistrimit të përdoruesit.

Tani ju duhet të bëni një pyetje në bazën e të dhënave në një përzgjedhje përdoruesi, adresa e postës së të cilit është e barabartë me adresën e postës së marrë dhe fjalëkalimi është i barabartë me fjalëkalimin e marrë.

//Pyetje në bazën e të dhënave për zgjedhjen e përdoruesit. $result_query_select = $mysqli->query("SELECT * FROM `users` WHERE email = "".$email."" AND password = "".$fjalëkalim."""); if(!$result_query_select)( // Ruani mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

Gabim në pyetje në zgjedhjen e përdoruesit nga baza 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_auth.php"); //Ndalo daljen e skriptit(); )else( //Kontrollo nëse nuk ka asnjë përdorues me të dhëna të tilla në bazën e të dhënave, pastaj shfaq një mesazh gabimi nëse($result_query_select->num_rows == 1)( // Nëse të dhënat e futura përputhen me të dhënat nga baza e të dhënave, atëherë ruajeni hyrjen dhe fjalëkalimin në grupin e sesionit. $_SESSION["email"] = $email; $_SESSION["password"] = $password; //Kthejeni përdoruesin në kokën e faqes kryesore("HTTP/1.1 301 Moved Permanently" header("Vendndodhja: ".$address_site."/index.php"); )else( // Ruaje mesazhin e gabimit në seancë. $_SESSION["error_messages"] .= "

Emri i përdoruesit dhe/ose fjalëkalimi i gabuar

"; //Kthejeni përdoruesin në kokën e faqes së autorizimit ("HTTP/1.1 301 Lëvizur përgjithmonë"); header ("Vendndodhja: ".$address_site."/form_auth.php"); //Ndalo daljen e skriptit(); ) )

Dalja e faqes

Dhe gjëja e fundit që ne zbatojmë është procedura e daljes. Për momentin, në kokë ne shfaqim lidhje me faqen e autorizimit dhe faqen e regjistrimit.

Në kokën e faqes (skedar header.php), duke përdorur seancën, ne kontrollojmë nëse përdoruesi është tashmë i identifikuar. Nëse jo, atëherë shfaqim lidhjet e regjistrimit dhe autorizimit, përndryshe (nëse është i autorizuar), atëherë në vend të lidhjeve të regjistrimit dhe autorizimit shfaqim lidhjen Dilni.

Një pjesë e modifikuar e kodit nga skedari header.php:

Regjistrimi

Dilni

Kur klikoni në lidhjen e daljes nga faqja, ne futemi në 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 e dini se si zbatojnë dhe përpunojnë formularët e regjistrimit dhe të autorizimit përdorues në faqen tuaj. Këto forma gjenden pothuajse në çdo faqe, 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 gjuhën PHP). Ne gjithashtu mësuam zbatoni procedurën e daljes.

Të gjitha skriptet janë testuar dhe funksionojnë. 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ë jeni të vetëdijshëm për publikimin e artikujve të rinj, mund të regjistroheni në faqen time.

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

Plani i mësimit (Pjesa 5):

  1. Krijimi i një strukture HTML për formularin e autorizimit
  2. Ne përpunojmë të dhënat e marra
  3. Ne shfaqim përshëndetjen e përdoruesit në kokën e faqes

Ju pëlqeu artikulli?

Reg.ru: domenet dhe pritja

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

Mbi 2 milion emra domenesh në shërbim.

Promovim, postë për domain, zgjidhje për biznes.

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

*Mouseover për të ndalur 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 konfirmimi regjistrimi, vërteton pjesën tjetër të fushave të formularit dhe shumë më tepër.

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

Në këtë tutorial, ne do të krijojmë një sistem shumë të thjeshtë hyrjeje 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ë funksiononte 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 një adresë emaili dhe një buton regjistrimi;
- Me rastin e plotësimit të fushës 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 i caktuar unik i rastësishëm i karaktereve (token), i cili dërgohet në postën e specifikuar nga përdoruesi në formën e një lidhjeje që do të jetë e rëndësishme për 10 minuta;
- Duke klikuar në lidhjen, përdoruesi shkon në faqen tonë të internetit. Sistemi përcakton praninë e tokenit dhe autorizon përdoruesin;

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

Nuk ka nevojë të ruani fjalëkalime dhe të vërtetoni fushat;
- Nuk ka nevojë për rikuperim të fjalëkalimit, pyetje sekrete, etj.;
- Që nga momenti kur një përdorues është regjistruar/loguar, 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);
- Për sa kohë që konfiguroni serverin e postës sipas nevojë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.

Pra, propozohet 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ë rastin kur thjesht duhet të përdorni sistemin për të autorizuar përdoruesit në faqen tuaj dhe nuk dëshironi ta ndani këtë mësim, ja çfarë duhet të bëni:

Ju duhet të shkarkoni skedarët burim të bashkangjitur mësimit
- Gjeni skedarin në arkiv tabelat.sql 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 me një redaktues teksti, kopjoni pyetjen SQL dhe ekzekutoni atë;
- Hapur përfshin/kryesore.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 gjithashtu një adresë emaili që do të përdoret si adresa origjinale për mesazhet e dërguara nga sistemi. Disa host do të bllokojnë emailet dalëse derisa formulari të shfaqë një adresë të vërtetë emaili që është krijuar nga paneli i kontrollit të hostit, kështu që futni adresën reale;
- Shkarkoni të gjithë skedarët indeks.php, të mbrojtura.php dhe asetet dhe përfshin dosjet nëpërmjet FTP për hostin tuaj;
- Shtoni kodin më poshtë në secilën faqe PHP ku dëshironi të shfaqni një formular autorizimi;

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ë skedar indeks.php. Ky skedar përmban gjithashtu kodin PHP që trajton të dhënat e formularit dhe veçori të tjera të dobishme të sistemit të autorizimit. Mund të mësoni më shumë rreth kësaj në seksionin e rishikimit të kodit PHP më poshtë.

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ë
lidhjen e hyrjes.

Në pjesën e kokës (midis etiketave dhe) Kam përfshirë stilet kryesore (ata nuk janë analizuar në këtë tutorial, kështu që mund t'i shihni vetë. Dosja assets/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 mban gjurmët e gjendjes së butonit "Regjistrohu/Login" me një funksion e.preventDefault() dhe dërgon kërkesa AJAX. Në varësi të përgjigjes së serverit, shfaq një mesazh të veçantë dhe përcakton veprimet e mëtejshme /

asetet/js/script.js

$(function()( var form = $("#login-register"); form.on("submit", funksion(e)( if(form.is(".loading, .loggedIn"))( return false ;) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (email: email), funksion (m)( if(m.gabim)(form.addClass("gabim"); messageHolder.tekst(m.mesazh); ) else(form.removeClass("gabim").addClass("loggedIn"); mbajtës mesazh. tekst (m.mesazh); ) ));)); $(dokument).ajaxStart(funksion()(form.addClass("duke ngarkuar"); ));$(dokument).ajaxComplete(funksion()(formular. removeClass ("duke ngarkuar"); )); ));

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ë tregon një skedar gif të animuar rrotullues (sikur na lë të kuptohet se kërkesa po përpunohet), dhe gjithashtu vepron si një flamur për të parandaluar ridorëzimin e formularit (kur butoni i regjistrimit është klikuar tashmë një herë). Klasa .loguar- ky është një flamur tjetër - vendoset kur është dërguar emaili. Ky flamur bllokon menjëherë çdo veprim të mëtejshëm në formular.

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ë skedar tabelat.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, të cilat mund të shihen në diagram. Në të mund të shihni kolonën shenjë me shenja ngjitur me kolonën vlefshmëria_token. Shenja vendoset sapo përdoruesi të lidhet me sistemin, vendos emailin e tij për të dërguar një mesazh (pak më shumë për këtë në bllokun tjetër). Folësi vlefshmëria_token cakton 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ë një formë të përpunuar, duke përdorur funksionin ip2long, në një fushë 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 vlefshmërinë. Është një ndërfaqe e 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. Merren parasysh vetëm argumentet e vlefshme. Shenja gjenerohet vetëm për 10 minuta nga momenti kur u krijua * @param string $token Ky është ai që po kërkoni për token * @return User. 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; ) ktheni 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 tel 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)( // Regjistroni një përdorues të ri dhe ktheni rezultatin e funksionit të Përdoruesit nga këto vlera $result = ORM::for_table("reg_users")- >krijoni(); $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))( // id i përdoruesit i kalohet vlera $ ndryshorja param $id = $param; ) else if(isset($_SESSION["loginid"]))( // Ndryshe shiko sesionin $id = $_SESSION["loginid"]; ) $this->orm = ORM:: for_table( "reg_users") ->where ("id", $id) ->find_one(); ) ) /** * Gjeneroni një shenjë të re autorizimi SHA1, shkruan në bazën e të dhënave dhe kthen vlerën e tij * @return string */ 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 si të 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ëso vlerën 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 */ dalja nga funksioni publik () ( $_SESSION = grup (); i pacaktuar ($_SESSION); ) /** * Kontrollo nëse përdoruesi është identifikuar * @return boolean */ funksioni publik logedIn()( kthen isset($ this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Kontrollo nëse përdoruesi është administrator * @return boolean */ funksioni publik ështëAdmin() ( return $this->rank() = = "administrator"; ) /** * Gjeni llojin e përdoruesit, mund të jetë ose administrator ose i rregullt * @return string */ funksion publik rank()( if($this->orm- >rank == 1)( kthe "administrator"; ) kthe "i rregullt"; ) /** * Një metodë që ju lejon të merrni informacione private * si veti të objektit User * @param string $key Emri i vetive që aksesohet * @return i përzier */ funksioni publik __get($key)( if(isset($this->orm->$key)) ( ktheni $this->orm->$key; ) 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 10-minutësh të skadimit të tokenit.

Kur token kalon procedurën e vlefshmërisë, ne i tregojmë drejtpërdrejt mbajtësit se ne 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 e mëposhtëm të kodit, le të marrim një shembull se si të përdorim këto klasa.


Faqe e mbrojtur

Një skedar tjetër që ruan funksione të dobishme dhe të nevojshme është skedari funksionet.php. Këtu ka disa të ashtuquajtur ndihmës - funksione ndihmëse që ju lejojnë të krijoni kod 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()( // Merr 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", sprint f("%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ë hyrje të re në tabelë duke numëruar 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 për periudhën 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 indeks.php dhe trajton paraqitjen e formularit. Ai kthen një përgjigje JSON e cila nga ana tjetër përpunohet nga jQuery në një skedar asetet/js/script.js për të cilat kemi diskutuar 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 tuaj të postës së padëshiruar.")))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage( )))))))

Pas autorizimit/regjistrimit të suksesshëm, kodi i mësipërm do t'i dërgojë përdoruesit një lidhje për autorizim. 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 faqja e mbrojtur $user->login();redirect("protected.php"); ) // Jo, token nuk është i vlefshëm. Ridrejto te faqja me formularin e hyrjes/regjistrimit redirect("indeks. php ");)

$user->login()

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

Në mënyrë të ngjashme, organizohet përpunimi i funksionit për të dalë nga sistemi.

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 ridrejtova te index.php, pra parametri ?logout=1 kaluar nga URL nuk kërkohet.

Dosja jonë indeks.php kërkon shtesë mbrojtje - ne nuk duam që personat që kanë hyrë ndonjëherë 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ë disponueshme vetëm pas autorizimit.

të mbrojtura.php

// Për të siguruar ç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 numrat zakonisht ruhen në bazën e të dhënave (0 për një përdorues normal, 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 të - mbetet në diskrecionin tuaj, ju mund të shkruani dhe kompozoni vetë kodin që përcakton privilegje dhe mundësi të caktuara për administratorët.

Janë bërë!

Me këtë formë tepër super kuazi të thjeshtë, mbaruam! 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 sitin e sitit

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

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


Sot do të shikojmë shfrytëzimin e një cenueshmërie kritike 1 ditore në Joomla CMS popullore, e cila shpërtheu në internet në fund të tetorit. Ne do të flasim për dobësitë me numra CVE-2016-8869, CVE-2016-8870 dhe CVE-2016-9081. Të tre vijnë nga i njëjti kod kodi që lëngoi në zorrët e kornizës për pesë vite të gjata, duke pritur në krahë për t'u çliruar dhe për të sjellë kaos, faqe të hakuara dhe lot të përdoruesve të pafajshëm të kësaj Joomla. Vetëm zhvilluesit më të guximshëm dhe më të guximshëm, sytë e të cilëve janë të kuq nga drita e monitorëve dhe tastierat janë të mbushura me thërrime buke, ishin në gjendje të sfidonin shpirtrat e këqij të tërbuar dhe të vendosnin kokën në altarin e rregullimeve.

PARALAJMËRIM

I gjithë informacioni jepet vetëm për qëllime informative. As redaktorët dhe as autori nuk janë përgjegjës për ndonjë dëm të mundshëm të shkaktuar nga materialet e këtij artikulli.

Si filloi gjithçka

Më 6 tetor 2016, Demis Palma krijoi një temë në Stack Exchange, në të cilën ai pyeti: pse, në fakt, në versionin 3.6 të Joomla, ekzistojnë dy metoda për regjistrimin e përdoruesve me të njëjtin emër register() ? E para është në kontrolluesin UsersControllerRegistration dhe e dyta është në UsersControllerUser. Damis donte të dinte nëse metoda UsersControllerUser::register() po përdoret diku, apo nëse është thjesht një anakronizëm evolucionar i mbetur nga logjika e vjetër. Ai ishte i shqetësuar për faktin se edhe nëse kjo metodë nuk përdoret nga asnjë pamje, ajo përsëri mund të thirret me një kërkesë të gjeneruar. Për të cilën mora një përgjigje nga zhvilluesi me pseudonimin itoctopus, i cili konfirmoi se problemi ekziston vërtet. Dhe dërgoi një raport te zhvilluesit e Joomla.

Ngjarjet e mëtejshme u zhvilluan më shpejt. Më 18 tetor, zhvilluesit e Joomla pranojnë një raport nga Damis, i cili deri në atë kohë kishte hartuar një PoC që lejon regjistrimin e përdoruesve. Ai publikoi një shënim në faqen e tij të internetit, ku fliste në terma të përgjithshëm për problemin që gjeti dhe mendimet e tij për të. Në të njëjtën ditë, lëshohet një version i ri i Joomla 3.6.3, i cili ende përmban kod të cenueshëm.

Pas kësaj, Davide Tampellini e kthen gabimin në gjendjen e regjistrimit jo të një përdoruesi të thjeshtë, por të një administratori. Dhe tashmë më 21 tetor, një rast i ri mbërrin në ekipin e sigurisë Joomla. Tashmë flet për përshkallëzimin e privilegjeve. Në të njëjtën ditë, në faqen e Joomla-s shfaqet një njoftim se të martën, më 25 tetor, do të dalë versioni i radhës me numrin serial 3.6.3, i cili rregullon një cenueshmëri kritike në bërthamën e sistemit.

Më 25 tetor, Joomla Security Strike Team gjen problemin më të fundit të krijuar nga një pjesë e kodit të zbuluar nga Damis. Më pas, një commit nga 21 tetori me emrin që nuk bie në sy Përgatitja 3.6.4 Stabile Release shtyhet në degën kryesore të depove zyrtare të Joomla, i cili rregullon gabimin fatkeq.

Pas kësaj, shumë individë të interesuar i bashkohen kabalit të zhvilluesve - ata fillojnë të rrotullojnë cenueshmërinë dhe të përgatisin sploits.

Më 27 tetor, studiuesi Harry Roberts ngarkon një shfrytëzim të gatshëm në depon e Xiphos Research që mund të ngarkojë një skedar PHP në një server me një CMS të cenueshëm.

Detajet

Epo, parahistoria ka mbaruar, le të kalojmë tek më interesantja - analiza e cenueshmërisë. Si një version eksperimental, unë instalova Joomla 3.6.3, kështu që të gjithë numrat e rreshtave do të jenë të rëndësishëm për këtë version. Dhe të gjitha shtigjet për skedarët që shihni më pas do të tregohen në lidhje me rrënjën e CMS-së së instaluar.

Falë gjetjes së Damis Palma, ne e dimë se ekzistojnë dy metoda që kryejnë regjistrimin e përdoruesit në sistem. I pari përdoret nga CMS dhe ndodhet në skedarin /components/com_users/controllers/registration.php:108. I dyti (ai që duhet të thërrasim) jeton në /components/com_users/controllers/user.php:293. Le t'i hedhim një vështrim më të afërt.

286: /** 287: * Mënyra për të regjistruar një përdorues. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: */ 293: regjistri i funksionit publik() 294: ( 295: JSession::checkToken("post") ose jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Merrni të dhënat e formularit. 301: $data = $this->input->post->get("user", array(), "array"); . .. 315: $return = $model->validate($form, $data); 316: 317: // Kontrollo për gabimet 318: nëse ($return === false) 319: ( ... 345: / / Përfundoni regjistrimin.346: $return = $model->register($data);

Këtu kam lënë vetëm rreshta interesante. Versioni i plotë i metodës vulnerabël mund të shihet në depon e Joomla.

Le të kuptojmë se çfarë ndodh gjatë një regjistrimi normal të përdoruesit: cilat të dhëna dërgohen dhe si përpunohen. Nëse regjistrimi i përdoruesit është i aktivizuar në cilësimet, atëherë formulari mund të gjendet në http://joomla.local/index.php/component/users/?view=registration .


Një kërkesë legjitime për regjistrim të përdoruesit duket si pamja e mëposhtme e ekranit.


Komponenti com_users është përgjegjës për të punuar me përdoruesit. Kushtojini vëmendje parametrit të detyrës në kërkesë. Ka formatin $controller.$method . Le të shohim strukturën e skedarit.

Emrat e skripteve në dosje kontrollorët përputhen me emrat e kontrollorëve të thirrur. Meqenëse kërkesa jonë tani ka $controller = "registrim" , skedari do të thirret regjistrimi.php dhe metodën e saj register().

Vëmendje, pyetja është: si ta transferoni përpunimin e regjistrimit në një vend të cenueshëm në kod? Ju ndoshta tashmë e keni marrë me mend. Emrat e metodave të cenueshme dhe reale janë të njëjta (regjistrim), kështu që ne vetëm duhet të ndryshojmë emrin e kontrolluesit të thirrur. Dhe ku është kontrolluesi i cenueshëm? Ashtu është, në dosje përdorues.php. Rezulton $controller = "user" . Duke i bashkuar të gjitha, marrim detyrë = përdorues.regjistrim . Tani kërkesa për regjistrim përpunohet sipas metodës që na nevojitet.


Gjëja e dytë që duhet të bëjmë është të dërgojmë të dhënat në formatin e duhur. Gjithçka është e thjeshtë këtu. Regjistri legjitim () pret një grup nga ne të quajtur jform, në të cilin ne kalojmë të dhënat për regjistrim - emrin, hyrjen, fjalëkalimin, postën (shih pamjen e ekranit me kërkesën).

  • /components/com_users/controllers/registration.php: 124: // Merrni të dhënat e përdoruesit. 125: $requestData = $this->input->post->get("jform", array(), "array");

Fëmija ynë i merr këto të dhëna nga një grup me emrin përdorues.

  • /components/com_users/controllers/user.php: 301: // Merrni të dhënat e formularit. 302: $data = $this->input->post->get("user", array(), "array");

Prandaj, ne ndryshojmë emrat e të gjithë parametrave në kërkesë nga jfrom në përdorues.

Hapi ynë i tretë është të gjejmë një shenjë të vlefshme CSRF, pasi pa të nuk do të ketë regjistrim.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") ose jexit(JText::_("JINVALID_TOKEN"));

Duket si një hash MD5 dhe mund ta merrni, për shembull, nga formulari i autorizimit në sitin /index.php/component/users/?view=login .


Tani mund të krijoni përdorues përmes metodës së dëshiruar. Nëse gjithçka funksionoi, atëherë urime - thjesht keni shfrytëzuar një dobësi CVE-2016-8870"Kontrolli i mungesës së lejes për regjistrimin e përdoruesve të rinj."

Ja se si duket në metodën "working" register() nga kontrolluesi UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Nëse regjistrimi është i çaktivizuar - Ridrejto te faqja e identifikimit. 114: nëse (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= login", false)); 117: 118: kthe false; 119: )

Dhe kështu në të pambrojturit:

  • /components/com_users/controllers/user.php:

Po, në asnjë mënyrë.

Për të kuptuar problemin e dytë, shumë më serioz, le të dërgojmë kërkesën që kemi formuar dhe të shohim se si ekzekutohet në pjesë të ndryshme të kodit. Këtu është pjesa që është përgjegjëse për vërtetimin e të dhënave të dorëzuara nga përdoruesi në metodën e punëtorit:

Vazhdim i disponueshëm vetëm për anëtarët

Opsioni 1. Bashkohuni me komunitetin "site" për të lexuar të gjitha materialet në sajt

Anëtarësimi në komunitet gjatë periudhës së specifikuar do t'ju japë akses në TË GJITHA materialet e Hakerëve, do të rrisë zbritjen tuaj personale kumulative dhe do t'ju lejojë të grumbulloni një vlerësim profesional të pikëve të Xakep!

Ndryshuar për herë të fundit më 23 korrik 2019 nga Vincy.

Regjistrimi ose regjistrimi i përdoruesve është një pjesë integrale e shumë aplikacioneve në ueb dhe është thelbësore që të bëhet siç duhet për suksesin e aplikacionit. Është pika fillestare e angazhimit të përdoruesit me aplikacionin tuaj.

Duhet të jetë sa më e thjeshtë që të jetë e mundur me UI / UX më të mirë. Zbatimi i funksionalitetit të regjistrimit të përdoruesve duke përdorur PHP është një detyrë e thjeshtë dhe unë do t'ju përshkruaj hapat me shembull në këtë artikull.

Çfarë ka brenda?

Si funksionon ky shembull i regjistrimit të përdoruesit PHP?

Ky kod shembull mund të ndahet në 3 pjesë.

  1. Marrja e informacionit të përdoruesit përmes një formulari HTML.
  2. Vleresimi i informacionit të dorëzuar nga përdoruesi në formularin e dorëzimit.
  3. Trajtimi i bazës së të dhënave për të ruajtur përdoruesin e regjistruar në bazën e të dhënave pas vërtetimit.

Hapi i tretë do të ekzekutohet pasi të sigurohet që përdoruesi nuk është shtuar tashmë. Ky vërtetim i unikitetit të të dhënave do të kryhet bazuar në emailin dhe emrin e përdoruesit të futur prej tyre.

Gjatë regjistrimit ne përgjithësisht mbledhim informacione të përdoruesve, të cilët janë gati të regjistrohen me aplikacionin tonë. Disa prej tyre do të jenë të detyrueshme dhe disa prej tyre do të jenë fakultative.

Pra, ky funksionalitet mund të përfshijë edhe pjesën e vlefshmërisë për t'u siguruar për moszbrazëtinë dhe formatin e të dhënave të përdoruesit. Vlefshmëria mund të bëhet ose në anën e klientit ose në anën e serverit.

Të kesh vërtetim në anën e serverit është gjithmonë më mirë. Mund të zgjidhni ta keni në anën e klientit edhe për lehtësinë e përdorimit të përdoruesve. Por të kesh në anën e serverit nuk është opsionale dhe një kërkesë minimale.

struktura e skedarit

Formulari HTML për të lejuar përdoruesin të regjistrohet

Në këtë shembull, formulari i regjistrimit përmban fushat Emri i përdoruesit, Emri (Emri i ekranit), Fjalëkalimi dhe Email. Ai gjithashtu ka fushën Konfirmo fjalëkalimin për të lejuar përdoruesin të rifusë fjalëkalimin e tij për konfirmim. Këto dy fjalëkalime do të krahasohen më vonë në kohën e një .

Duke dorëzuar këtë formular, përdoruesi pritet të pajtohet me termat dhe kushtet. Pra, një fushë e kutisë së kontrollit shtohet përpara butonit Regjistrohu për ta siguruar atë.

Formulari i Regjistrimit të Përdoruesit PHP

regjistrohu
"; } ?>
">
">
">
Unë pranoj termat dhe kushtet

Dhe stilet janë

Trupi ( font-familja: Arial; ngjyra: #333; madhësia e shkronjave: 0.95em; ) .form-head ( ngjyra: #191919; pesha e shkronjave: normale; pesha e shkronjave: 400; margjina: 0; rreshtimi i tekstit : qendër; madhësia e shkronjave: 1,8em; ) .mesazhi i gabimit ( mbushja: 7px 10px; sfondi: #fff1f2; kufiri: #ffd5da 1px solid; ngjyra: #d6001c; rreze-kufi: 4px; margjina: 30px 10px 0p ; ) .success-message ( mbushje: 7px 10px; sfond: #cae0c4; bordurë: #c3d0b5 1px solid; ngjyra: #027506; kufiri-radius: 4px; margjina: 30px 0px 10px 0px sfond; #ffffff; hapësira kufitare: fillestare; margjina: 15 pikselë automatike; thyerja e fjalëve: fjalë e thyer; paraqitja e tabelës: automatik; lartësia e rreshtit: 1.8em; ngjyra: #333; rreze-kufitare: 4 px; mbushje: 20 px 40 px ;gjerësia: 380 px;kufiri: 1px solid;border-color: #e5e6e9 #dfe0e4 #d0d1d5; ) .demo-table .label ( ngjyra: #888888; ) .demo-tabela .field-column ( padding: 0x5) .demo-input-box ( mbushje: 13px; kufiri: #CCC 1px solid; rreze-kufi: 4px; gjerësia: 100%; ) .btnRegjistrohu ( mbushje: 13px; ngjyra e sfondit: #5d9cec; ngjyra: #f5f7fa; kursori: treguesi; kufiri-rreze: 4px gjerësia: 100% kufiri: #5791da 1px solid; madhësia e shkronjave: 1.1em ) .response-text (gjerësia maksimale: 380 px; madhësia e shkronjave: 1,5em; rreshtimi i tekstit: në qendër; sfondi: #fff3de; mbushja: 42 px; kufiri-radius: 3 px; kufiri: #f5e9d4 1px; font-family : arial; lartësia e rreshtit: 34 px; diferenca: 15 px automatike; ) .terms (diferencë-fund: 5px; )

Si të vërtetoni informacionin e përdoruesit në formularin e dorëzimit

Një skrip i vlefshmërisë së formularit nga ana e serverit i shtohet këtij shembulli për vërtetimin e të dhënave të regjistrimit të përdoruesit. Ky skript i vlefshmërisë PHP do të thirret me dorëzimin e formularit të regjistrimit.

Ky skript vërteton të gjitha fushat e formularit për të kontrolluar mungesën e zbrazëtisë për secilën fushë. Pastaj vërteton formatin e emailit të përdoruesit duke përdorur funksionin filter_var() të PHP.

Meqenëse regjistrimi përfshin një veçori të konfirmimit të fjalëkalimit, krahasimi i fjalëkalimit do të bëhet në këtë pjesë të këtij shembulli.

Së fundi, skripti i vlefshmërisë do të kontrollojë nëse përdoruesi pranon termin dhe kushtin duke kontrolluar kutinë e duhur në formular.

Pasi të përfundojë i gjithë vlefshmëria duke e kthyer boolean true, atëherë procesi aktual i regjistrimit do të zhvillohet.

Funksioni validateMember() ( $valid = true; $errorMessage = array(); foreach ($_POST as $key => $value) (nëse (empty($_POST[$key])) ($valid = false; ) ) if($valid == e vërtetë) (if ($_POST["password"] != $_POST["confirm_password"]) ($errorMessage = "Fjalëkalimet duhet të jenë të njëjta."; $valid = false; ) if (! isset ($error_message)) ( if (! filter_var($_POST["userEmail"], FILTER_VALIDATE_EMAIL)) ( $errorMessage = "Adresa e pavlefshme email."; $valid = false; ) ) if (! isset($ error_message)) ( if (! isset($_POST["terms"])) ( $errorMessage = "Prano termat dhe kushtet."; $valid = false; ) ) else ( $errorMessage = "Të gjitha fushat janë të nevojshme." ;) nëse ($valid == false) (ktheje $errorMessage;) ktheje;)

Kodi PHP MySQL për të hyrë në bazën e të dhënave për të ruajtur përdoruesin e regjistruar

Vlefshmëria e formularit të përdoruesit nga ana e serverit

Kjo është pika e hyrjes PHP për të trajtuar të gjithë skriptin e serverit për të vërtetuar formën dhe për të trajtuar operacionet e bazës së të dhënave bazuar në rezultatin e vlefshmërisë.

validateMember ($username, $displayName, $password, $email); if (bosh($errorMessage)) ( $memberCount = $member->isMemberExists($username, $email); if ($memberCount == 0) ( $insertId = $member->insertMemberRecord($username, $displayName, $ fjalëkalimi, $email); nëse (! bosh ($insertId)) ( header ("Vendndodhja: thankyou.php"); ) ) other ( $errorMessage = "Përdoruesi ekziston tashmë."; ) ) ) ?>

Kontrolloni nëse përdoruesi ekziston tashmë

Funksioni isMemberExists() përdoret për të kontrolluar veçantinë e të dhënave të përdoruesit bazuar në emailin e tyre dhe emrin e përdoruesit. Nëse emri i përdoruesit ose emaili i futur ekziston në bazën e të dhënave të përdoruesve, atëherë procesi i regjistrimit do të ndalet me kthim dhe konfirmim.

Ky njohje do të njoftojë se "përdoruesi ekziston tashmë". kodi eshte,

Funksioni ështëMemberExists($username, $email) ( $query = "select * FROM registered_users WHERE user_name = ? OSE email = ?"; $paramType = "ss"; $paramArray = grup ($username, $email); $memberCount = $this->ds->numRows ($query, $paramType, $paramArray); ktheni $memberCount;)

Futni të dhënat e anëtarëve në bazën e të dhënave

Nëse kthen 0, do të thotë që nuk ekzistojnë përdorues të tillë me emailin ose emrin e përdoruesit të futur. Dhe kështu, të dhënat e regjistrimit do të futen në bazën e të dhënave. Kodi i mëposhtëm tregon metodën e futjes së anëtarëve.

Funksioni insertMemberRecord($username, $displayName, $password, $email) ( $passwordHash = md5($password); $query = "INSERT INTO registered_users (user_name, display_name, password, email) VALUES (?, ?, ?, ? )"; $paramType = "ssss"; $paramArray = grup ($emri i përdoruesit, $displayName, $passwordHash, $email); $insertId = $this->ds->insert($query, $paramType, $paramArray); kthe $insertId;)

Burimi i të Dhënave.php

Kjo është klasa e përgjithshme e burimit të të dhënave në PHP për të kryer operacionet e bazës së të dhënave. Ai përfshin funksione për të lidhur bazën e të dhënave dhe për të ekzekutuar pyetje të ndryshme për të marrë rezultatin e bazës së të dhënave, numërimin e rreshtave, ekzekutimin e futjes dhe më shumë.

Kjo klasë e burimit të të dhënave është e përgjithshme dhe mbahet sa më e thjeshtë që të jetë e mundur. Është efikas dhe e përdor në shumicën e mikroprojekteve dhe tutorialeve të mia. Jeni të lirë ta shkarkoni dhe ta përdorni.

gjë e rëndësishme është mos harroni kurrë të përdorni Deklaratat e Përgatitura. Ju ndihmon të mbroni nga sulmet e injektimit SQL dhe është hapi i parë në drejtim të zbatimit të sigurisë në një aplikacion në internet.

lidhje = $this->getConnection(); ) /** * Nëse nevojitet objekti i lidhjes, përdorni këtë metodë dhe merrni akses në të. * Përndryshe, përdorni metodat e mëposhtme për futjen / përditësimin / etj. * * @return \mysqli */ funksioni publik getConnection() ( $conn = i ri \mysqli(self::HOST, vet::USERNAME, vet::PASSWORD, vet::DATABASENAME); nëse (mysqli_connect_errno()) ( trigger_error ("Problem me lidhjen me bazën e të dhënave."); ) $conn->set_charset("utf8"); kthe $conn;) /** * Për të marrë rezultatet e bazës së të dhënave * @param string $query * @param string $paramType * @ grup param $paramArray * @return grup */ funksioni publik zgjidhni($query, $paramType="", $paramArray=array()) ( $stmt = $this->conn->prepare($query); if(! bosh($paramType) && !empty($paramArray)) ($this->bindQueryParams($sql, $paramType, $paramArray); ) $stmt->ekzekutoj();$rezultat = $stmt->merr_rezultatin(); nëse ($result->num_rows > 0) ( ndërsa ($row = $result->fetch_assoc()) ( $resultset = $row; ) ) nëse (! bosh ($resultset)) ( ktheni $resultset; ) ) / ** * Për të futur * @param string $query * @param string $paramType * @param varg $paramArray * @return int */ futur funksionin publik($query, $paramType, $p aramArray) ( print $query; $stmt = $this->conn->prepare($query); $this->bindQueryParams($stmt, $paramType, $paramArray); $stmt->ekzekutoni(); $insertId = $stmt->insert_id; ktheni $insertId; ) /** * Për të ekzekutuar pyetjen * @param string $query * @param string $paramType * @param array $paramArray */ funksionin publik ekzekutoni($query, $paramType="", $paramArray=array()) ( $ stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) ($this->bindQueryParams($stmt, $paramType="", $paramArray= array()); ) $stmt->execute(); ) /** * 1. Përgatit lidhjen e parametrave * 2. Lidhni prametrat në deklaratën sql * @param string $stmt * @param string $paramType * @param array $ paramArray */ funksion publik bindQueryParams($stmt, $paramType, $paramArray=array()) ( $paramValueReference = & $paramType; për ($i = 0; $i< count($paramArray); $i ++) { $paramValueReference = & $paramArray[$i]; } call_user_func_array(array($stmt, "bind_param"), $paramValueReference); } /** * To get database results * @param string $query * @param string $paramType * @param array $paramArray * @return array */ public function numRows($query, $paramType="", $paramArray=array()) { $stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($stmt, $paramType, $paramArray); ) $stmt->ekzekutoni(); $stmt->store_rezultat(); $recordCount = $stmt->num_rows; ktheni $recordCount; ) )

Skript i bazës së të dhënave

Ky skript i bazës së të dhënave ka deklaratën e krijimit për tabelën e regjistruar_përdoruesit. Importoni këtë skript në mjedisin tuaj të zhvillimit për të ekzekutuar këtë kod.

Struktura e tabelës për "përdoruesit e_regjistruar" -- KRIJO TABELA NËSE NUK EKZISTON `përdoruesit e_regjistruar` (`id` int(8) NUK NULL AUTO_INCREMENT, `emri_përdorues` varchar(255) NUK NULL, `emri i parë` varchar(255) JO NULL, emri i fundit` varchar(255) NOT NULL, `fjalëkalimi` varchar(25) JO NULL, `email` varchar(55) NOT NULL, `gjinia` varchar(20) JO NULL, ÇELËSI PRIMAR (`id`));

Nëse vërtetimi i formularit të regjistrimit dështon, atëherë mesazhi i gabimit do t'i shfaqet përdoruesit si më poshtë.

Komentet për "Formulari i Regjistrimit të Përdoruesit PHP (Regjistrohuni) me bazën e të dhënave MySQL"

    Përshëndetje Vincy, kam gabimet e mëposhtme kur ekzekutoj kodin e regjistrit, ju lutem më ndihmoni.

    INSERT INTO registered_users (user_name, display_name, password, email) VALUES (?, ?, ?, ?)
    Paralajmërim: call_user_func_array() pret që parametri 1 të jetë një kthim i vlefshëm, anëtari i grupit të parë nuk është një emër ose objekt i vlefshëm klase në C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php në linjën 136

    Gabim fatal: Gabim i pakapur: Thirrja e një funksioni anëtari execute() në boolean në C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php:99 Gjurma e grumbullit: #0 C:\xampp\htdocs\PHP\JAMII -CASH\Member.php(83): Phppot\DataSource->insert('INSERT INTO reg…', 'ssss', Array) #1 C:\xampp\htdocs\PHP\JAMII-CASH\index.php(20 ): Phppot\Member->insertMemberRecord('chuki10', 'Ray', '202020', ' [email i mbrojtur]…') #2 (kryesore) e hedhur në C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php në linjën 99