Ultima modificare pe 20 august 2019 de Vincy.

Autentificarea și înregistrarea utilizatorului este o cerință de bază pentru orice aplicație CMS. Aceasta este munca inițială în timpul pornirii unui proiect. Aplicația cu autentificare de conectare a utilizatorului oferă securitate prin împiedicarea accesului anonim. Există diferite modalități de a activa autentificarea în aplicația noastră, cum ar fi activarea autentificarii OAuth sau implementarea Single Sign-on (SSO) și alte moduri similare. Într-un tutorial anterior, am văzut cum să implementăm și, de asemenea, despre .

Acest exemplu include atât funcționalitățile de conectare, cât și de înregistrare. Am folosit baza de date MySQL pentru a stoca membrii înregistrați. Înregistrarea utilizatorului va conține informații pentru a obține detalii de la utilizator. La trimiterea acestui formular, datele formularului sunt postate în PHP și stocate în baza de date. Parola utilizatorului va fi criptată înainte de a fi stocată în baza de date. înainte de a posta în codul PHP. Când utilizatorul este autentificat cu acreditările valide, atunci utilizatorul și el vor avea voie să continue.

Formular de înregistrare a utilizatorului

Acest cod este pentru a arăta utilizatorului formularul de înscriere. Când utilizatorul trimite formularul cu detaliile sale, funcția JavaScript va fi apelată pentru a valida introducerea utilizatorului. După validarea cu succes, codul PHP va citi datele formularului postat pentru a executa inserarea bazei de date.

">

Validarea JavaScript se va ocupa de verificarea negoală a câmpurilor obligatorii și, de asemenea, de validarea formatului de e-mail cu model regex.

Acest cod PHP pentru a crea inserați folosind datele din formularul de înregistrare. După executarea inserării bazei de date, răspunsul de succes/eroare va fi trimis pentru a confirma utilizatorul.

openConnection(); $sql1 = "selectați numele, e-mailul de la tbl_registered_users unde email="$email""; $utilizator = $db->interogare($sql1); $rezultat = $utilizator->fetchAll(); $_SESSION["emailname"] = $result["email"]; if (gol ($rezultat)) ( $sql = "inserați în tbl_registered_users (nume, e-mail, parolă) valori ("$nume","$email","$parolă")"; $db->exec($sql ); $database->closeConnection(); $response = array("type" => "succes", "message" => "V-ați înregistrat cu succes.
Acum Conectați-vă."); ) else ( $response = array("type" => "eroare", "message" => "E-mail deja utilizat."); ) ) ?>

Autentificare de conectare folosind PHP

Utilizatorul înregistrat se poate autentifica la aplicație prin intermediul acestui formular de conectare. Autentificarea de conectare se face prin potrivirea e-mailului de conectare și a parolei cu baza de date a utilizatorilor înregistrați. Dacă se găsește o potrivire, aplicația va permite utilizatorului să continue. În caz contrar, panoul de autentificare va confirma utilizatorul despre încercarea nevalidă.

Codul PHP pentru validarea autentificarii utilizatorului cu baza de date este prezentat mai jos. După conectarea cu succes, redirecționez utilizatorul către dashboard.php. Tabloul de bord va afișa mesajul de bun venit adresându-se membrului conectat. De asemenea, va exista o opțiune de deconectare din sesiunea curentă.

openConnection(); $sql = "selectați * din tbl_registered_users unde e-mail = "$email" și parola= "$parolă""; $utilizator = $db->interogare($sql); $rezultat = $user->fetchAll(PDO::FETCH_ASSOC); $id = $rezultat["id"]; $nume = $rezultat["nume"]; $email = $rezultat["email"]; $_SESSION["nume"] = $nume; $_SESSION["id"] = $id; $baza de date->closeConnection(); header("locație: dashboard.php"); ) ?>

În acest articol, vei învăța cum se creează un formular de înregistrare și autorizare folosind HTML, JavaScript, PHP și MySql. Astfel de formulare sunt folosite pe aproape fiecare site, indiferent de tipul acestuia. Sunt create pentru forum, și pentru magazinul online și pentru rețelele sociale (cum ar fi Facebook, Twiter, Odnoklassniki) și pentru multe alte tipuri de site-uri.

Dacă aveți un site pe computerul local, atunci sper că aveți deja . Nimic nu va funcționa fără el.

Crearea unui tabel în baza de date

Pentru a implementa înregistrarea utilizatorilor, avem nevoie mai întâi de o bază de date. Dacă îl aveți deja, atunci grozav, în caz contrar, trebuie să îl creați. În articol, explic în detaliu cum să faci asta.

Și așa, avem o bază de date (abreviat DB), acum trebuie să creăm un tabel utilizatoriiîn care vom adăuga utilizatorii noștri înregistrați.

Cum se creează un tabel în baza de date, am explicat și în articol. Înainte de a crea un tabel, trebuie să definim ce câmpuri va conține. Aceste câmpuri se vor potrivi cu câmpurile din formularul de înregistrare.

Deci, ne-am gândit, ne-am imaginat ce câmpuri va avea formularul nostru și creăm un tabel utilizatorii cu aceste câmpuri:

  • id- Identificator. Camp id ar trebui să fie în fiecare tabel din baza de date.
  • Nume- Pentru a salva numele.
  • numele de familie- Pentru a salva numele de familie.
  • e-mail- Pentru a salva adresa poștală. Vom folosi e-mailul ca logare, deci acest câmp trebuie să fie unic, adică să aibă un index UNIC.
  • email_status- Un câmp pentru a indica dacă e-mailul este confirmat sau nu. Dacă e-mailul este confirmat, atunci acesta va avea valoarea 1, în caz contrar valoarea 0.
  • parola- Pentru a salva parola.


Dacă doriți ca formularul de înregistrare să aibă mai multe câmpuri, le puteți adăuga și aici.

Asta e, masa noastră utilizatorii gata. Să trecem la pasul următor.

Conexiune la baza de date

Am creat baza de date, acum trebuie să ne conectăm la ea. Ne vom conecta folosind extensia PHP MySQLi.

În folderul site-ului nostru, creați un fișier cu numele dbconnect.php, iar în el scriem următorul script:

Eroare de conectare la baza de date. Descrierea erorii: „.mysqli_connect_error().”

"; exit(); ) // Setați codificarea conexiunii $mysqli->set_charset("utf8"); //Pentru comoditate, adăugați aici o variabilă care va conține numele site-ului nostru $address_site = "http://testsite .local" ; ?>

Acest fișier dbconnect.php va trebui conectat la manevrele de formulare.

Acordați atenție variabilei $address_site, aici am indicat numele site-ului meu de testare, la care voi lucra. În consecință, indicați numele site-ului dvs.

Structura site-ului

Acum să aruncăm o privire asupra structurii HTML a site-ului nostru.

Mutați antetul și subsolul site-ului în fișiere separate, header.phpși footer.php. Le vom conecta pe toate paginile. Și anume, pe principal (fișier index.php), la pagina cu formularul de înregistrare (file form_register.php) și pe pagina cu formularul de autorizare (dosar form_auth.php).

Blocați cu link-urile noastre, înregistrareși autorizare, adăugați la antetul site-ului astfel încât acestea să fie afișate pe toate paginile. Un link va intra pe pagina formular de înregistrare(fişier form_register.php) iar celălalt la pagina cu formular de autorizare(fişier form_auth.php).

Conținutul fișierului header.php:

Numele site-ului nostru

Ca rezultat, pagina noastră principală arată astfel:


Desigur, site-ul dvs. poate avea o structură complet diferită, dar acest lucru nu este important pentru noi acum. Principalul lucru este că există link-uri (butoane) pentru înregistrare și autorizare.

Acum să trecem la formularul de înregistrare. După cum ați înțeles deja, îl avem în dosar form_register.php.

Mergem la baza de date (în phpMyAdmin), deschidem structura tabelului utilizatoriiși vedem de ce câmpuri avem nevoie. Deci, avem nevoie de câmpuri pentru introducerea unui prenume și prenume, un câmp pentru introducerea unei adrese poștale (E-mail) și un câmp pentru introducerea unei parole. Și din motive de securitate, vom adăuga un câmp de intrare captcha.

Pe server, ca urmare a procesării formularului de înregistrare, pot apărea diverse erori din cauza cărora utilizatorul nu se va putea înregistra. Prin urmare, pentru ca utilizatorul să înțeleagă de ce înregistrarea eșuează, este necesar să îi afișeze mesaje despre aceste erori.

Înainte de afișarea formularului, adăugăm un bloc pentru afișarea mesajelor de eroare din sesiune.

Și încă un moment, dacă utilizatorul este deja autorizat, și de dragul interesului, intră direct pe pagina de înregistrare scriind în bara de adrese a browserului website_url/form_register.php, atunci în acest caz, în locul formularului de înregistrare, vom afișa un titlu pentru acesta că este deja înregistrat.

În general, codul fișierului form_register.php am prins asa:

Esti deja inregistrat

În browser, pagina de înregistrare arată astfel:


Prin intermediul atribut necesar, am făcut toate câmpurile obligatorii.

Atenție la codul formularului de înregistrare unde este afișat captcha:


Noi, în valoarea atributului src pentru imagine, am specificat calea către fișier captcha.php, care generează acest captcha.

Să ne uităm la codul fișierului captcha.php:

Codul este bine comentat, așa că mă voi concentra doar pe un punct.

În interiorul unei funcții imagineTtfText(), este specificată calea către font verdana.ttf. Deci, pentru ca captcha să funcționeze corect, trebuie să creăm un folder fonturi, și puneți fișierul font acolo verdana.ttf. Îl puteți găsi și descărca de pe Internet, sau îl puteți lua din arhiva cu materialele acestui articol.

Am terminat cu structura HTML, este timpul să trecem mai departe.

Validarea e-mailului cu jQuery

Orice formular necesită validarea datelor introduse, atât pe partea client (folosind JavaScript, jQuery), cât și pe partea serverului.

Trebuie să acordăm o atenție deosebită câmpului E-mail. Este foarte important ca adresa de e-mail introdusă să fie validă.

Pentru acest câmp de introducere, am setat tipul de e-mail (type="email"), acesta ne avertizează puțin împotriva formatelor incorecte. Dar, acest lucru nu este suficient, deoarece prin inspectorul de cod pe care ni-l pune la dispoziție browser-ul, puteți modifica cu ușurință valoarea atributului tip cu e-mail pe text, și atât, cecul nostru nu va mai fi valabil.


Și în acest caz, trebuie să facem o verificare mai fiabilă. Pentru a face acest lucru, vom folosi biblioteca jQuery din JavaScript.

Pentru a conecta biblioteca jQuery, în fișier header.phpîntre etichete , înainte de eticheta de închidere , adăugați această linie:

Imediat după această linie, adăugați codul de verificare de validare a e-mailului. Aici adăugăm codul pentru verificarea lungimii parolei introduse. Trebuie să aibă cel puțin 6 caractere.

Cu ajutorul acestui script, verificăm valabilitatea adresei de e-mail introduse. Dacă utilizatorul a introdus un e-mail greșit, atunci afișăm o eroare despre acesta și dezactivăm butonul de trimitere al formularului. Dacă totul este în regulă, atunci eliminăm eroarea și activăm butonul de trimitere al formularului.

Și așa, cu validarea formularului din partea clientului, am terminat. Acum îl putem trimite la server, unde vom face și câteva verificări și vom adăuga date în baza de date.

Înregistrare utilizator

Trimitem formularul pentru procesare la dosar înregistrare.php, prin metoda POST. Numele acestui fișier de gestionare, specificat în valoarea atributului acțiune. Și metoda de trimitere este specificată în valoarea atributului metodă.

Deschideți acest fișier înregistrare.phpși primul lucru pe care trebuie să-l facem este să scriem o funcție de lansare a sesiunii și să includem fișierul pe care l-am creat mai devreme dbconnect.php(În acest fișier, am făcut o conexiune la baza de date). Și totuși, declară imediat celulele mesaje de eroareși mesaje_succesîn matricea globală a sesiunii. LA mesaje_eroare vom înregistra toate mesajele de eroare care apar în timpul procesării formularelor și în mesaje_succes Să scriem mesaje fericite.

Înainte de a continua, trebuie să verificăm dacă formularul a fost depus. Un atacator poate privi valoarea unui atribut acțiune din formular și aflați ce fișier procesează acest formular. Și poate veni cu ideea de a merge direct la acest fișier introducând următoarea adresă în bara de adrese a browserului: http://site_site/register.php

Deci trebuie să verificăm dacă există o celulă în matricea globală POST al cărei nume se potrivește cu numele butonului nostru „Înregistrare” din formular. Astfel, verificăm dacă butonul „Înregistrare” a fost apăsat sau nu.

Dacă un atacator încearcă să meargă direct la acest fișier, va primi un mesaj de eroare. Vă reamintesc că variabila $address_site conține numele site-ului și a fost declarată în fișier dbconnect.php.

Greşeală! Pagina principală .

"); } ?>

Valoarea captcha din sesiune a fost adăugată în timpul generării acesteia, în fișier captcha.php. Ca o reamintire, voi arăta încă o dată această bucată de cod din fișier captcha.php, unde valoarea captcha este adăugată la sesiune:

Acum să trecem la testul în sine. În dosar înregistrare.php, în interiorul blocului if, unde verificăm dacă butonul „Înregistrare” a fost apăsat, sau mai degrabă, unde comentariul „ // (1) Loc pentru următoarea bucată de cod"noi scriem:

//Verificați captcha primită //Tăiați spațiile de la început și de la sfârșitul șirului $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Compară valoarea primită cu valoarea din sesiune. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Dacă captcha-ul nu este corect, întoarceți utilizatorul la pagina de înregistrare și acolo vom afișa un mesaj de eroare că a introdus captcha greșit. $error_message. = "

Greşeală! Ai introdus captcha greșit

"; // Salvați mesajul de eroare în sesiune. $_SESSION["error_messages"] = $error_message; // Reveniți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: " .$address_site ."/form_register.php"); //Opriți ieșirea din script(); ) // (2) Loc pentru următoarea bucată de cod )else( //Dacă captcha nu este trecut sau este ieșire gol ("

Greşeală! Nu există cod de verificare, adică codul captcha. Puteți merge la pagina principală.

"); }

În continuare, trebuie să procesăm datele primite din matricea POST. În primul rând, trebuie să verificăm conținutul matricei globale POST, adică dacă există celule acolo ale căror nume se potrivesc cu numele câmpurilor de intrare din formularul nostru.

Dacă celula există, atunci tăiem spațiile de la început și de la sfârșitul șirului din această celulă, în caz contrar, redirecționăm utilizatorul înapoi la pagina cu formularul de înregistrare.

Mai departe, după ce spațiile au fost tăiate, adăugăm un șir la variabilă și verificăm această variabilă pentru golire, dacă nu este goală, apoi trecem mai departe, altfel redirecționăm utilizatorul înapoi la pagina cu formularul de înregistrare.

Lipiți acest cod în locația specificată // (2) Loc pentru următoarea bucată de cod".

/* Verificați dacă matricea globală $_POST conține date trimise din formular și includeți datele trimise în variabile obișnuite.*/ if(isset($_POST["first_name"]))( // Decupați spațiile de la începutul și sfârșitul lui șirul $first_name = trim($_POST["first_name"]); //Verificați dacă variabila este goală if(!empty($first_name))( // Pentru siguranță, convertiți caracterele speciale în entități HTML $first_name = htmlspecialchars( $first_name, ENT_QUOTES) ; )else( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Introdu numele tau

Câmp de nume lipsește

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) if( isset($_POST["last_name"]))( // Tăiați spațiile de la începutul și sfârșitul șirului $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // Pentru siguranță, convertiți caracterele speciale în entități HTML $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Salvați mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Introduceți numele dvs. de familie

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) )else ( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Câmp de nume lipsește

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) if( isset($_POST["email"]))( // Tăiați spațiile de la începutul și sfârșitul șirului $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Locul codului pentru a verifica formatul adresei de e-mail și unicitatea acesteia )else( // Salvați mesajul de eroare în sesiune. $_SESSION["error_messages" ] .= "

Introduceți adresa dvs. de email

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) )else ( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) if( isset($_POST["parolă"]))( // Tăiați spațiile de la începutul și sfârșitul șirului $parolă = trim($_POST["parolă"]); if(!empty($parolă)) ( $parolă = htmlcaractere speciale ($parolă, ENT_QUOTES); //Criptați parola $parolă = md5($parolă."top_secret"); )else( // Salvați mesajul de eroare în sesiune. $_SESSION["messaje_de_eroare"] .= "

Introduceți parola

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) )else ( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) // (4) Locul pentru codul pentru adăugarea unui utilizator la baza de date

Domeniul are o importanță deosebită. e-mail. Trebuie să verificăm formatul adresei poștale primite și unicitatea acesteia în baza de date. Adică dacă un utilizator cu aceeași adresă de e-mail este deja înregistrat.

La locatia specificata" // (3) Locul codului pentru verificarea formatului adresei poștale și unicitatea acesteia" adăugați următorul cod:

//Verificați formatul adresei de e-mail primite folosind expresia regulată $reg_email = "/^**@(+(*+)*\.)++/i"; //Dacă formatul adresei de e-mail primite nu se potrivește cu expresia regulată if(!preg_match($reg_email, $email))( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Ați introdus un e-mail nevalid

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) // Verificați dacă există deja o astfel de adresă în baza de date $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); Dacă există sunt exact un rând, atunci utilizatorul cu această adresă de e-mail este deja înregistrat if($result_query->num_rows == 1)( //Dacă rezultatul nu este fals if(($row = $result_query->fetch_assoc())! = fals) ( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Utilizatorul cu această adresă de e-mail este deja înregistrat

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); )else( //Salvați mesajul de eroare la sesiune .$_SESSION["error_messages"] .= "

Eroare la interogarea bazei de date

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); ) /* închideți selecția */ $ result_query-> close(); //Oprește scriptul exit(); ) /* închide selecția */ $result_query->close();

Și așa, am terminat cu toate verificările, este timpul să adăugăm utilizatorul în baza de date. La locatia specificata" // (4) Locul pentru codul pentru adăugarea unui utilizator la baza de date" adăugați următorul cod:

//Interogare pentru a adăuga un utilizator la baza de date $result_query_insert = $mysqli->query("INSERT INTO `users` (prenume, prenume, e-mail, parolă) VALUES ("".$prenume."", "".$nume ." ", "".$email."", "".$parola."")"); if(!$result_query_insert)( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Eroare solicitarea de a adăuga un utilizator la baza de date

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); )else( $_SESSION["success_messages"] = "

Înregistrarea s-a încheiat cu succes!!!
Acum vă puteți autentifica folosind numele de utilizator și parola.

"; //Trimiteți utilizatorul la antetul paginii de autentificare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_auth.php"); ) /* Finalizați solicitarea */ $ result_query_insert-> close(); //Închide conexiunea la baza de date $mysqli->close();

Dacă apare o eroare în cererea de adăugare a unui utilizator la baza de date, adăugăm în sesiune un mesaj despre această eroare și returnăm utilizatorul la pagina de înregistrare.

În rest, dacă totul a mers bine, adăugăm și un mesaj la sesiune, dar deja este mai plăcut și anume îi spunem utilizatorului că înregistrarea a avut succes. Și îl redirecționăm către pagina cu formularul de autorizare.

Scriptul pentru verificarea formatului adresei de e-mail și a lungimii parolei se află în fișier header.php, deci va afecta și câmpurile din formularul respectiv.

Sesiunea este începută și în fișier header.php, deci în dosar form_auth.php sesiunea nu trebuie pornită, deoarece primim o eroare.


După cum am spus, aici funcționează și scriptul pentru verificarea formatului adresei de e-mail și a lungimii parolei. Prin urmare, dacă utilizatorul introduce o adresă de e-mail greșită sau o parolă scurtă, va primi imediat un mesaj de eroare. Un buton a intra va deveni inactiv.

După remedierea erorilor, butonul a intra devine activ și utilizatorul poate trimite formularul la serverul unde va fi procesat.

Autorizarea utilizatorului

Pentru a atribui valoare acțiune formularul de autorizare are un dosar auth.php, ceea ce înseamnă că formularul va fi procesat în acest fișier.

Deci haideți să deschidem fișierul auth.phpși scrieți codul pentru a procesa formularul de autorizare. Primul lucru de făcut este să porniți sesiunea și să includeți fișierul dbconnect.php pentru a se conecta la baza de date.

//Declară o celulă pentru a adăuga erori care pot apărea în timpul procesării formularelor. $_SESSION["error_messages"] = ""; //Declară o celulă pentru a adăuga mesaje de succes $_SESSION["success_messages"] = "";

/* Verificați dacă formularul a fost trimis, adică dacă s-a făcut clic pe butonul Autentificare. Daca da, atunci mergem mai departe, daca nu, atunci vom afisa utilizatorului un mesaj de eroare, in care sa se precizeze ca a mers direct pe aceasta pagina. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) Loc pentru următoarea bucată de cod )else( exit("

Greşeală! Ați accesat direct această pagină, deci nu există date de prelucrat. Puteți merge la pagina principală.

"); }

//Verificați captcha primit if(isset($_POST["captcha"]))( //Tăiați spațiile de la începutul și sfârșitul șirului $captcha = trim($_POST["captcha"]); if(!empty ($captcha ))( //Comparați valoarea primită cu valoarea din sesiune. if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != ""))( // Dacă captcha-ul este invalid, atunci returnăm utilizatorul la pagina de autorizare și acolo vom afișa un mesaj de eroare că a introdus captcha greșit. $error_message = "

Greşeală! Ai introdus captcha greșit

"; // Salvați mesajul de eroare în sesiune. $_SESSION["error_messages"] = $error_message; // Readuceți utilizatorul la antetul paginii de autorizare ("HTTP/1.1 301 Mutat permanent"); header("Locație: " .$address_site ."/form_auth.php"); //Opriți scriptul exit(); ) )else( $error_message = "

Greşeală! Câmpul de introducere captcha nu trebuie să fie gol.

"; // Salvați mesajul de eroare în sesiune. $_SESSION["error_messages"] = $error_message; // Readuceți utilizatorul la antetul paginii de autorizare ("HTTP/1.1 301 Mutat permanent"); header("Locație: " .$address_site ."/form_auth.php"); //Opriți ieșirea din script(); ) //(2) Loc pentru procesarea adresei de e-mail //(3) Loc pentru procesarea parolei //(4) Loc pentru efectuarea unei interogări la baza de date )else ( //Dacă captcha nu este trecut exit("

Greşeală! Nu există cod de verificare, adică codul captcha. Puteți merge la pagina principală.

"); }

Dacă utilizatorul a introdus corect codul de verificare, atunci mergem mai departe, altfel îl întoarcem pe pagina de autorizare.

Verificarea adresei de e-mail

// Tăiați spațiile de la începutul și sfârșitul șirului $email = trim($_POST["email"]); if(isset($_POST["email"]))( if(!empty($email))( $email = htmlspecialchars($email, ENT_QUOTES); //Verificați formatul adresei de e-mail primite folosind expresia obișnuită $ reg_email = " /^**@(+(*+)*\.)++/i"; //Dacă formatul adresei de e-mail primite nu se potrivește cu expresia regulată if(!preg_match($reg_email, $email ))( // Salvați mesajul de eroare în sesiune.$_SESSION["error_messages"] .= "

Ați introdus un e-mail nevalid

"; //Readuceți utilizatorul la antetul paginii de autorizare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_auth.php"); //Opriți ieșirea din script(); ) )else ( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Câmpul pentru introducerea adresei poștale (e-mail) nu trebuie să fie gol.

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_register.php"); //Opriți ieșirea din script(); ) )else ( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Nu există câmp pentru introducerea e-mailului

"; //Readuceți utilizatorul la antetul paginii de autorizare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_auth.php"); //Opriți ieșirea din script(); ) // (3) Loc pentru procesarea parolei

Dacă utilizatorul a introdus o adresă de e-mail în format greșit sau valoarea câmpului adresei de e-mail este goală, atunci îl întoarcem la pagina de autorizare, unde afișăm un mesaj despre aceasta.

Verificarea parolei

Următorul câmp de procesat este câmpul pentru parolă. la locul desemnat" //(3) Loc pentru procesarea parolei", noi scriem:

If(isset($_POST["parolă"]))( // Decupați spațiile de la începutul și sfârșitul șirului $parolă = trim($_POST["parolă"]); if(!empty($parolă))( $parolă = htmlspecialchars($parolă, ENT_QUOTES); // Criptați parola $parolă = md5($parolă."top_secret"); )else( // Salvați mesajul de eroare în sesiune. $_SESSION["messaje_de_eroare"] . = "

Introduceți parola

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_auth.php"); //Opriți ieșirea din script(); ) )else ( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Nu există câmp pentru introducerea unei parole

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_auth.php"); //Opriți ieșirea din script(); )

Aici, folosind funcția md5 (), criptăm parola primită, deoarece în baza de date avem parole în formă criptată. Cuvânt secret suplimentar în criptare, în cazul nostru " top_secret" trebuie să fie cea care a fost folosită la înregistrarea utilizatorului.

Acum trebuie să faceți o interogare la baza de date pe o selecție de utilizator a cărei adresă de e-mail este egală cu adresa de e-mail primită și parola este egală cu parola primită.

//Interogare la baza de date la selecția utilizatorului. $result_query_select = $mysqli->query("SELECT * FROM `users` WHERE email = "".$email."" AND parola = "".$parola."""); if(!$result_query_select)( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Eroare de interogare la selectarea utilizatorului din baza de date

"; //Readuceți utilizatorul la antetul paginii de înregistrare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_auth.php"); //Opriți ieșirea din script(); )else( //Verificați dacă nu există niciun utilizator cu astfel de date în baza de date, apoi afișați un mesaj de eroare if($result_query_select->num_rows == 1)( // Dacă datele introduse se potrivesc cu datele din baza de date, apoi salvați login și parola la matricea sesiunii. $_SESSION["email"] = $email; $_SESSION["parola"] = $parolă; //Readuce utilizatorul la antetul paginii principale ("HTTP/1.1 301 Mutat permanent" ); header("Locație: ".$address_site ."/index.php"); )else( // Salvează mesajul de eroare în sesiune. $_SESSION["error_messages"] .= "

Nume de utilizator și/sau parolă greșite

"; //Readuceți utilizatorul la antetul paginii de autorizare ("HTTP/1.1 301 Mutat permanent"); header("Locație: ".$address_site."/form_auth.php"); //Opriți ieșirea din script(); ) )

Ieșirea din site

Și ultimul lucru pe care îl punem în aplicare este procedura de iesire. Momentan, în antet afișăm link-uri către pagina de autorizare și pagina de înregistrare.

În antetul site-ului (fișier header.php), folosind sesiunea, verificăm dacă utilizatorul este deja autentificat. Dacă nu, atunci afișăm link-urile de înregistrare și autorizare, în caz contrar (dacă este autorizat), atunci în loc de link-urile de înregistrare și autorizare afișăm linkul Ieșire.

O bucată de cod modificată din fișier header.php:

Înregistrare

Ieșire

Când faceți clic pe linkul de ieșire de pe site, intrăm în fișier logout.php, unde pur și simplu distrugem celulele cu adresa de e-mail și parola din sesiune. După aceea, returnăm utilizatorul înapoi la pagina pe care a fost făcut clic pe link Ieșire.

Cod fișier logout.php:

Asta e tot. Acum știi cum implementează și procesează formulare de înregistrare și autorizare utilizator pe site-ul dvs. Aceste formulare se găsesc pe aproape fiecare site, așa că fiecare programator ar trebui să știe cum să le creeze.

De asemenea, am învățat cum să validăm datele de intrare, atât pe partea client (în browser, folosind JavaScript, jQuery), cât și pe partea server (folosind limbajul PHP). Am învățat și noi implementați procedura de deconectare.

Toate scripturile sunt testate și funcționează. Puteți descărca arhiva cu fișierele acestui mic site de pe acest link.

Pe viitor voi scrie un articol unde voi descrie. Și mai am de gând să scriu un articol în care să explic (fără a reîncărca pagina). Deci, pentru a fi la curent cu lansarea de noi articole, vă puteți abona la site-ul meu.

Dacă aveți întrebări, vă rugăm să contactați, de asemenea, dacă observați vreo greșeală în articol, vă rog să-mi spuneți.

Planul de lecție (Partea 5):

  1. Crearea unei structuri HTML pentru formularul de autorizare
  2. Prelucrăm datele primite
  3. Afișăm salutul utilizatorului în antetul site-ului

Ți-a plăcut articolul?

Reg.ru: domenii și găzduire

Cel mai mare registrator și furnizor de găzduire din Rusia.

Peste 2 milioane de nume de domenii în serviciu.

Promovare, mail pentru domeniu, solutii pentru afaceri.

Peste 700 de mii de clienți din întreaga lume și-au făcut deja alegerea.

* Treceți cu mouse-ul pentru a întrerupe derularea.

Inapoi inainte

Crearea unui sistem simplu de înregistrare a utilizatorilor în PHP și MySQL

Crearea unui sistem de înregistrare este multă muncă. Trebuie să scrieți un cod care validează adresele de e-mail, trimite un e-mail de confirmare a înregistrării, validează restul câmpurilor din formular și multe altele.

Și chiar și după ce vei scrie toate acestea, utilizatorii vor fi reticenți să se înregistreze, pentru că. necesită ceva efort din partea lor.

În acest tutorial, vom crea un sistem de conectare foarte simplu, care nu necesită și nu stochează parole! Rezultatul va fi ușor de modificat și adăugat la un site PHP deja existent. Vrei să afli cum funcționează? Cititi mai jos.



Iată cum ar funcționa sistemul nostru super simplu:

Vom combina formularul de autorizare și înregistrarea. Acest formular va avea un câmp pentru introducerea unei adrese de e-mail și un buton de înregistrare;
- La completarea câmpului cu o adresă de email, prin apăsarea butonului de înregistrare, se va crea o înregistrare despre un utilizator nou, dar numai dacă adresa de email introdusă nu a fost găsită în baza de date.

După aceea, se creează un anumit set unic aleatoriu de caractere (token), care este trimis către e-mailul specificat de utilizator sub forma unui link care va fi relevant timp de 10 minute;
- Făcând clic pe link, utilizatorul merge pe site-ul nostru. Sistemul determină prezența jetonului și autorizează utilizatorul;

Avantajele acestei abordări:

Nu este nevoie să stocați parole și să validați câmpurile;
- Nu este nevoie de recuperarea parolei, întrebări secrete etc.;
- Din momentul in care un utilizator s-a inregistrat/autentificat, poti intotdeauna sa fii sigur ca acest utilizator se va afla in zona ta de acces (ca adresa de email este adevarata);
- Proces de înregistrare incredibil de simplu;

Defecte:

Securitatea contului de utilizator. Dacă cineva are acces la e-mailul utilizatorului, acesta se poate autentifica.
- E-mailul nu este sigur și poate fi interceptat. Rețineți că această întrebare este relevantă și în cazul în care parola a fost uitată și trebuie restaurată, sau în orice sistem de autorizare care nu utilizează HTTPS pentru transferul de date (login/parolă);
- Atâta timp cât configurați serverul de e-mail după cum este necesar, există șansa ca mesajele cu link-uri de autorizare să ajungă în spam;

Comparând avantajele și dezavantajele sistemului nostru, putem spune că sistemul are o utilizare ridicată (confort maxim pentru utilizatorul final) și, în același timp, are un indicator de securitate scăzut.

Așa că se propune folosirea lui pentru înregistrări pe forumuri și servicii care nu funcționează cu informații importante.

Cum se utilizează acest sistem

În cazul în care trebuie doar să utilizați sistemul pentru a autoriza utilizatorii de pe site-ul dvs. și nu doriți să desfaceți această lecție, iată ce trebuie să faceți:

Trebuie să descărcați fișierele sursă atașate lecției
- Găsiți fișierul în arhivă tabele.sql Importați-l în baza de date folosind opțiunea de import din phpMyAdmin. Mod alternativ: deschideți acest fișier cu un editor de text, copiați interogarea SQL și rulați-l;
- Deschis include/main.phpși completați setările pentru conectarea la baza de date (specificați utilizatorul și parola pentru conectarea la baza de date, precum și gazda și numele bazei de date). În același fișier, trebuie să specificați și o adresă de e-mail care va fi folosită ca adresă inițială pentru mesajele trimise de sistem. Unele gazde vor bloca e-mailurile trimise până când formularul arată o adresă de e-mail reală care a fost generată din panoul de control al gazdei, așa că introduceți adresa reală;
- Descărcați toate fișierele index.php, protejat.phpși activele și include foldere prin FTP către gazda dvs.;
- Adăugați codul de mai jos la fiecare pagină PHP unde doriți să afișați un formular de autorizare;

Require_once „includes/main.php”; $utilizator = utilizator nou(); if(!$user->loggedIn())( redirect("index.php"); )
- Gata!

Pentru cei care sunt interesați de cum funcționează totul, citiți mai jos!

Primul pas este scrierea codului HTM pentru formularul de autorizare. Acest cod se află în fișier index.php. Acest fișier conține, de asemenea, codul PHP care gestionează datele formularului și alte caracteristici utile ale sistemului de autorizare. Puteți afla mai multe despre acest lucru în secțiunea de revizuire a codului PHP de mai jos.

index.php

Tutorial: Sistem de înregistrare super simplu cu PHP și MySQL

Conectați-vă sau Înregistrați-vă

Introdu adresa ta de e-mail mai sus și vom trimite
link-ul de autentificare.

În secțiunea cap (între etichete și) Am inclus stilurile principale (nu sunt analizate în acest tutorial, așa că le puteți vedea singur. Folderul assets/css/style.css). Înainte de eticheta de închidere Am inclus biblioteca jQuery și fișierul script.js, pe care le vom scrie și analiza mai jos.


JavaScript

jQuery ține evidența stării butonului „Înscriere/Login” cu o funcție e.preventDefault()și trimite cereri AJAX. În funcție de răspunsul serverului, afișează un anumit mesaj și determină acțiuni ulterioare /

assets/js/script.js

$(function()( var form = $("#login-register"); form.on("trimite", function(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), function (m)( if(m.error)( form.addClass(„eroare”); messageHolder.text(m.message); ) else( form.removeClass(„eroare”).addClass(„loggedIn”); messageHolder. text(m.message); ) )); )); $(document).ajaxStart(function()( form.addClass(„încărcare”); )); $(document).ajaxComplete(function()( form. removeClass(„încărcare”); )); ));

a fost adăugat în formular pentru a afișa starea curentă a cererii AJAX (acest lucru a fost posibil datorită metodelor ajaxStart()) și ajaxComplete(), pe care îl puteți găsi spre sfârșitul fișierului).

Această clasă arată un fișier gif animat care se învârte (ca și cum ne-ar sugera că cererea este în curs de procesare) și, de asemenea, acționează ca un semnalizare pentru a preveni retrimiterea formularului (atunci când butonul de înregistrare a fost deja apăsat o dată). Clasă .conectat- acesta este un semnal diferit - setat când a fost trimis e-mailul. Acest flag blochează instantaneu orice acțiune ulterioară în formular.

Schema bazei de date

Sistemul nostru de logare incredibil de simplu folosește 2 tabele MySQL (codul SQL este în fișier tabele.sql). Primul stochează date despre conturile de utilizator. Al doilea stochează informații despre numărul de încercări de conectare.


Schema tabelului utilizator.

Sistemul nu folosește parole, care pot fi văzute în diagramă. Pe ea se vede coloana jeton cu jetoane adiacente coloanei token_validity. Tokenul este setat de îndată ce utilizatorul se conectează la sistem, își setează e-mailul să trimită un mesaj (mai multe despre asta în blocul următor). Difuzor token_validity setează timpul 10 minute mai târziu, după care jetonul nu mai este valabil.


Schemă de tabel care numără numărul de încercări de autorizare.

În ambele tabele, adresa IP este stocată într-o formă procesată, folosind funcția ip2long, într-un câmp întreg.

Acum putem scrie niște cod PHP. Principala funcționalitate a sistemului este atribuită clasei user.class.php pe care o puteți vedea mai jos.

Această clasă utilizează în mod activ idorm (docs), aceste biblioteci sunt instrumentele minime necesare pentru lucrul cu bazele de date. Se ocupă de accesul la baza de date, generarea de token și validarea. Este o interfață simplă care facilitează conectarea unui sistem de înregistrare la site-ul dvs. dacă folosește PHP.

user.class.php

Class User( // Private ORM case private $orm; /** * Găsiți un utilizator după indicativ. Sunt luate în considerare doar simbolurile valide. Jetonul este generat doar timp de 10 minute din momentul în care a fost creat * @param șir $token Acesta este cel pe care îl căutați jetonul * @return User. Întoarceți valoarea funcției User */ public static function findByToken($token)( // găsiți jetonul în baza de date și asigurați-vă că este setat marcajul de timp corect $ rezultat = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) return new User($result); ) /** * Autorizați sau înregistrați un utilizator * @param șir $email.Adresa de e-mail a utilizatorului * @return User */ public static function loginOrRegister($email)( // Dacă un astfel de utilizator există deja, returnează valoarea funcției User de la adresa de e-mail specificată stocată în baza de date if(User::exists($email))( return new User($email); ) // În caz contrar, creați un nou utilizator tel în baza de date și returnează valoarea funcției User::create din emailul specificat return User::create($email); ) /** * Creați un utilizator nou și salvați în baza de date * @param șir $email. Adresa de e-mail a utilizatorului * @return User */ private static function create($email)( // Înregistrați un nou utilizator și returnați rezultatul funcției User din aceste valori $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Verificați dacă un astfel de utilizator există în baza de date și returnați valoarea booleană a lui variabilă * @param șir $email. Adresa de e-mail a utilizatorului * @return boolean */ funcția publică statică există($email)( // Există utilizatorul în baza de date? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Creați un nou obiect utilizator * @param instanță $param ORM , id, email sau 0 * @return User */ public function __construct($param = null) ( if($param instanceof ORM)( // verificarea ORM a trecut $this->orm = $param; ) else if(is_string($param))( // Verificarea e-mailului a trecut $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // id-ul utilizatorului i se transmite valoarea $ variabila param $id = $param; ) else if(isset($_SESSION["loginid"]))( // În caz contrar vezi sesiune $id = $_SESSION["loginid"]; ) $this->orm = ORM:: for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Generați un nou simbol de autorizare SHA1, scrie la baza de date și returnează valoarea acesteia * @return șir */ public function generateToken()( // Generați un token pentru un utilizator autorizat și îl salvați în baza de date $token = sha1($this->email.time().rand (0, 1000000)); // Stocați tokenul în baza de date // Și marcați-l ca fiind valabil doar pentru următoarele 10 minute $this->orm->set("token", $token); $this->orm->set_expr("validitate_token", "ADDTIME(ACUM(),"0:10")"); $this->orm->save(); returnează $token; ) /** * Autorizează utilizatorul * @return void */ public function login()( // Marcați utilizatorul ca autentificat $_SESSION["loginid"] = $this->orm->id; // Actualizați valoarea din câmpul bazei de date last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Distrugeți sesiunea și deconectați utilizatorul * @return void */ deconectare funcție publică ()( $_SESSION = matrice (); unset($_SESSION); ) /** * Verificați dacă utilizatorul s-a autentificat * @return boolean */ funcția publică loggedIn()( return isset($ this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Verificați dacă utilizatorul este administrator * @return boolean */ public function isAdmin() ( return $this->rank() = = "administrator"; ) /** * Găsiți tipul de utilizator, poate fi fie administrator, fie obișnuit * @return șir */ public function rank()( if($this->orm- >rank == 1)( return "administrator"; ) return "regular"; ) /** * O metodă care vă permite să obțineți informații private * ca proprietăți ale obiectului User * @param șir $key Numele proprietății care este accesată * @return mixed */ public function __get($key)( if(isset($this->orm->$key)) ( returnează $this->orm->$key; ) returnează nul; ) )

Tokenurile sunt generate folosind algoritmul SHA1 și stocate în baza de date. Folosesc funcțiile de timp ale MySQL pentru a seta o limită de expirare a simbolului de 10 minute.

Când token-ul trece de procedura de validare, îi spunem direct managerului că luăm în considerare doar token-urile care nu au expirat încă, stocate în coloana token_validity.

Vă rugăm să rețineți că folosesc metoda magică __obține docs la sfârșitul fișierului pentru a intercepta accesul la proprietățile obiectului User.

Datorită acestui fapt, devine posibilă accesarea informațiilor stocate în baza de date, datorită proprietăților $user->email, $user->token etc. În următorul fragment de cod, să luăm un exemplu despre cum să folosiți aceste clase.


Pagina protejată

Un alt fișier care stochează funcționalități utile și necesare este fișierul funcții.php. Există mai mulți așa-numiți helper aici - funcții de ajutor care vă permit să creați cod mai curat și mai lizibil în alte fișiere.

funcții.php

Funcția send_email($from, $to, $subject, $message)( // Ajutor care trimite email $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Tip conținut: text /plain; charset=utf-8" . "\r\n"; $headers .= "De la: ".$from . "\r\n"; returnează e-mail($to, $subject, $message, $headers ); ) function get_page_url()( // Obține adresa URL a fișierului PHP $url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://".$_SERVER [ „NUME_SERVER”]; if(isset($_SERVER[„CERERE_URI”]) && $_SERVER[„CERERE_URI”] != „”)( $url.= $_SERVER[„CERERE_URI”]; ) else( $url. = $_SERVER["PATH_INFO"]; ) returnează $url; ) funcția rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Numărul de încercări de conectare în ultima oră la această adresă IP $count_hour = ORM: :for_table("reg_login_tempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(ACUM(),"1:00")") ->count(); // Numărul de încercări de conectare în ultimele 10 minute la această adresă IP $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprint f("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(ACUM(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new Exception("Prea multe încercări de conectare!"); ) ) function rate_limit_tick($ip, $email)( // Creați o nouă intrare în tabel numărarea numărului de încercări de conectare $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_tempt->email = $email; $login_tempt->ip = sprintf("%u", ip2long($ip) ); $login_tempt->save(); ) funcția de redirecționare($url)( header("Locație: $url"); ieșire; )

Funcții rate_limitși rate_limit_tick monitorizează numărul de încercări de autorizare pentru perioada de timp scursă de la prima încercare. Încercarea de conectare este înregistrată în baza de date în coloana reg_login_attempt. Aceste funcții sunt apelate atunci când datele din formular sunt procesate și trimise, după cum puteți vedea din următorul fragment de cod.

Codul de mai jos este preluat din fișier index.phpși se ocupă de trimiterea formularului. Returnează un răspuns JSON care este, la rândul său, procesat de jQuery într-un fișier assets/js/script.js despre care am discutat deja mai devreme.

index.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Afișează un antet de antet JSON ("Content-type: application/json"); // Este această adresă de e-mail validă dacă (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Vă rugăm să introduceți un e-mail valid."); ) // Verificați. Este utilizatorul a permis să se autentifice, a depășit numărul de conexiuni permise? (fișierul functions.php pentru mai multe informații) rate_limit($_SERVER["REMOTE_ADDR"]); // Înregistrați această încercare de conectare rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["e-mail"]); // Trimiteți un e-mail utilizatorului $message = ""; $email = $_POST["e-mail"]; $subject = "Link-ul dvs. de conectare"; if(!User:: exists($email) )( $subject = „Vă mulțumim pentru înregistrare!”; $message = „Vă mulțumim pentru înregistrarea pe site-ul nostru!\n\n”; ) // Încercarea de a autoriza sau înregistra un utilizator $user = Utilizator ::loginOrRegister($_POST[ „email”]); $message.= „Puteți să vă conectați de la această adresă URL:\n” ; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Legătura va expira automat după 10 minute."; $rezultat = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( throw new Exception("A apărut o eroare la trimiterea e-mailului. Vă rugăm să încercați din nou."); ) die(json_encode(array("message" => "Vă mulțumim! Am trimis un link) în căsuța dvs. de e-mail. Verificați și folderul de spam.")))); ) ) catch(Excepție $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage( ) ))); )

După autorizarea/înregistrarea cu succes, codul de mai sus va trimite utilizatorului un link pentru autorizare. Jetonul devine disponibil deoarece este transmisă ca o variabilă în legătura generată prin metodă $_GET cu marker tkn

index.php

If(isset($_GET["tkn"]))( // Este acest token valid pentru autorizare? $user = User::findByToken($_GET["tkn"]); if($user)( // Da , este. Redirecționează către pagina protejată $user->login(); redirect("protected.php"); ) // Nu, simbolul nu este valid. Redirecționează către pagina cu formularul de autentificare/înregistrare redirect("index. php ");)

$user->login()

va crea variabilele necesare sesiunii, astfel incat utilizatorul, vizualizand paginile ulterioare ale site-ului, sa ramana autorizat tot timpul.

În mod similar, este aranjată procesarea funcției de ieșire din sistem.

index.php

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

La sfârșitul codului, am redirecționat din nou către index.php, deci parametrul ?logout=1 transmis prin URL nu este necesar.

Dosarul nostru index.php necesită suplimentar protecție - nu dorim ca persoanele care s-au autentificat vreodată în sistem să vadă din nou formularul de înregistrare. În aceste scopuri, folosim metoda $user->loggedIn().

index.php

$utilizator = utilizator nou(); if($user->loggedIn())( redirect("protected.php"); )

În cele din urmă, iată o bucată de cod care vă permite să protejați paginile site-ului dvs. și să îl faceți disponibil numai după autorizare.

protejat.php

// Pentru a securiza fiecare pagină de pe site-ul dvs., includeți un fișier // main.php și creați un nou obiect User. Asa este de usor! require_once "includes/main.php"; $utilizator = utilizator nou(); if(!$user->loggedIn())( redirect("index.php"); )

După această verificare, puteți fi sigur că utilizatorul a fost autorizat cu succes. De asemenea, puteți accesa informațiile stocate în baza de date folosind proprietățile obiectului $utilizator. Pentru a afișa adresa de e-mail și starea utilizatorului, utilizați acest cod:

echo „E-mailul tău: „.$user->email; echo "Rangul dvs.: ".$user->rank();

Metodă rang() este folosit aici deoarece numerele sunt de obicei stocate în baza de date (0 pentru un utilizator normal, 1 pentru un administrator) și trebuie să convertim aceste date în stările cărora le aparțin, ceea ce ne ajută această metodă.

Pentru a face un utilizator obișnuit administrator, pur și simplu editați intrarea utilizatorului prin phpMyAdmin (sau orice alt program care vă permite să gestionați baze de date). Starea de administrator nu oferă niciun privilegiu, în acest exemplu, pagina va afișa că sunteți administrator - și atât.

Dar ce să faci cu el - rămâne la discreția ta, poți scrie și compune singur cod care stabilește anumite privilegii și oportunități pentru administratori.

Au fost efectuate!

Cu această formă incredibil de super cvasi simplă, am terminat! Îl poți folosi în site-urile tale PHP, este destul de simplu. De asemenea, îl puteți modifica pentru dvs. și îl puteți face așa cum doriți.

Materialul a fost pregătit de Denis Malyshok special pentru site-ul

P.S. Vrei să mergi mai departe în stăpânirea PHP și OOP? Aruncă o privire la tutorialele premium despre diverse aspecte ale construirii site-ului web, inclusiv programarea PHP, precum și un curs gratuit despre construirea sistemului CMS PHP de la zero folosind OOP:

Ți-a plăcut materialul și vrei să mulțumești?
Distribuie doar prietenilor și colegilor tăi!


Astăzi ne vom uita la exploatarea unei vulnerabilități critice de 1 zi în popularul CMS Joomla, care a explodat pe Internet la sfârșitul lunii octombrie. Vom vorbi despre vulnerabilități cu cifre CVE-2016-8869, CVE-2016-8870și CVE-2016-9081. Toți trei provin din aceeași bucată de cod care a languit în măruntaiele cadrului timp de cinci ani lungi, așteptând în aripi să se elibereze și să aducă haos, site-uri piratate și lacrimi utilizatorilor nevinovați ai acestui Joomla. Doar cei mai curajoși și curajoși dezvoltatori, ai căror ochi sunt roșii de la lumina monitoarelor, iar tastaturile sunt pline de firimituri de pâine, au reușit să provoace spiritele rele furioase și să-și pună capetele pe altarul reparațiilor.

AVERTIZARE

Toate informațiile sunt furnizate doar în scop informativ. Nici editorii, nici autorul nu sunt responsabili pentru eventualele daune cauzate de materialele acestui articol.

Cum a început totul

Pe 6 octombrie 2016, Demis Palma a creat un subiect pe Stack Exchange, în care a întrebat: de ce, de fapt, în Joomla versiunea 3.6, există două metode de înregistrare a utilizatorilor cu același nume register()? Primul se află în controlerul UsersControllerRegistration, iar al doilea este în UsersControllerUser. Damis a vrut să știe dacă metoda UsersControllerUser::register() este folosită undeva sau dacă este doar un anacronism evolutiv rămas din vechea logică. El a fost îngrijorat de faptul că, chiar dacă această metodă nu este folosită de nicio vizualizare, ea poate fi apelată cu o solicitare generată. La care am primit un răspuns de la dezvoltator sub porecla itoctopus, care a confirmat că problema chiar există. Și a trimis un raport dezvoltatorilor Joomla.

Alte evenimente s-au dezvoltat cel mai rapid. Pe 18 octombrie, dezvoltatorii Joomla acceptă un raport de la Damis, care până atunci a elaborat un PoC care permite înregistrarea utilizatorilor. A publicat o notă pe site-ul său, unde a vorbit în termeni generali despre problema pe care a găsit-o și gândurile sale despre aceasta. În aceeași zi, este lansată o nouă versiune de Joomla 3.6.3, care conține încă cod vulnerabil.

După aceea, Davide Tampellini întoarce bug-ul la starea de înregistrare nu a unui simplu utilizator, ci a unui administrator. Și deja pe 21 octombrie, un nou caz ajunge la echipa de securitate Joomla. Se vorbește deja despre escaladarea privilegiilor. În aceeași zi, pe site-ul Joomla apare un anunț că marți, 25 octombrie, va fi lansată următoarea versiune cu numărul de serie 3.6.3, care remediază o vulnerabilitate critică în nucleul sistemului.

Pe 25 octombrie, echipa Joomla Security Strike găsește cea mai recentă problemă creată de o bucată de cod descoperită de Damis. Apoi, un commit din 21 octombrie cu numele discret Prepare 3.6.4 Stable Release este împins în ramura principală a depozitului oficial Joomla, care remediază eroarea nefericită.

După această ieșire, numeroși indivizi interesați se alătură cabalei dezvoltatorilor - încep să învârtească vulnerabilitatea și să pregătească sploit-uri.

Pe 27 octombrie, cercetătorul Harry Roberts încarcă un exploit gata făcut în depozitul Xiphos Research, care poate încărca un fișier PHP pe un server cu un CMS vulnerabil.

Detalii

Ei bine, preistoria s-a terminat, să trecem la cel mai interesant - analiza vulnerabilității. Ca versiune experimentală, am instalat Joomla 3.6.3, astfel încât toate numerele de linii vor fi relevante pentru această versiune. Și toate căile către fișierele pe care le vedeți în continuare vor fi indicate în raport cu rădăcina CMS-ului instalat.

Datorită descoperirii lui Damis Palma, știm că există două metode care realizează înregistrarea utilizatorilor în sistem. Primul este folosit de CMS și se află în fișierul /components/com_users/controllers/registration.php:108. Al doilea (cel pe care trebuie să-l apelăm) locuiește în /components/com_users/controllers/user.php:293 . Să aruncăm o privire mai atentă.

286: /** 287: * Metodă de înregistrare a unui utilizator. 288: * 289: * @return boolean 290: * 291: * @din 1.6 292: */ 293: public function register() 294: ( 295: JSession::checkToken("post") sau jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Obține datele formularului. 301: $date = $this->input->post->get ("utilizator", array(), "array"); . .. 315: $retur = $model->validate($form, $data); 316: 317: // Verificați erorile 318: if ($return === false) 319: ( ... 345: / / Finalizați înregistrarea.346: $retur = $model->register($date);

Aici am lăsat doar rânduri interesante. Versiunea completă a metodei vulnerabile poate fi vizualizată în depozitul Joomla.

Să ne dăm seama ce se întâmplă în timpul înregistrării normale a unui utilizator: ce date sunt trimise și cum sunt procesate. Dacă înregistrarea utilizatorului este activată în setări, atunci formularul poate fi găsit la http://joomla.local/index.php/component/users/?view=registration .


O solicitare legitimă de înregistrare a unui utilizator arată ca următoarea captură de ecran.


Componenta com_users este responsabilă pentru lucrul cu utilizatorii. Acordați atenție parametrului sarcinii din cerere. Are formatul $controller.$method . Să ne uităm la structura fișierului.

Nume de script în folder controlorii potrivesc cu numele controlorilor apelați. Deoarece cererea noastră are acum $controller = "registration" , fișierul va fi apelat înregistrare.phpși metoda sa register().

Atenție, întrebarea este: cum se transferă procesarea înregistrării într-un loc vulnerabil din cod? Probabil ai ghicit deja. Numele metodelor vulnerabile și reale sunt aceleași (înregistrare), așa că trebuie doar să schimbăm numele controlerului apelat. Și unde este controlorul vulnerabil? Așa este, în dosar utilizator.php. Se dovedește $controller = "utilizator" . Punând totul împreună, obținem task = user.register . Acum cererea de înregistrare este procesată prin metoda de care avem nevoie.


Al doilea lucru pe care trebuie să-l facem este să trimitem datele în formatul corect. Totul este simplu aici. Legitimate register() așteaptă de la noi o matrice numită jform , în care trecem date pentru înregistrare - nume, autentificare, parolă, e-mail (vezi captura de ecran cu cererea).

  • /components/com_users/controllers/registration.php: 124: // Obțineți datele utilizatorului. 125: $requestData = $this->input->post->get("jform", array(), "array");

Copilul nostru primește aceste date de la o matrice numită user .

  • /components/com_users/controllers/user.php: 301: // Obține datele formularului. 302: $date = $this->input->post->get("utilizator", array(), "array");

Prin urmare, schimbăm numele tuturor parametrilor din cerere de la jfrom la user .

Al treilea pas este să găsim un token CSRF valid, deoarece fără el nu va exista nicio înregistrare.

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

Arată ca un hash MD5, și îl poți lua, de exemplu, din formularul de autorizare de pe site-ul /index.php/component/users/?view=login .


Acum puteți crea utilizatori prin metoda dorită. Dacă totul a funcționat, atunci felicitări - tocmai ai exploatat o vulnerabilitate CVE-2016-8870„Lipsește verificarea permisiunii pentru înregistrarea de noi utilizatori.”

Iată cum arată în metoda register() „de lucru” din controlerul UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Dacă înregistrarea este dezactivată - Redirecționează către pagina de conectare. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=) login", false)); 117: 118: return false; 119: )

Și așa în cei vulnerabili:

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

Da, în niciun caz.

Pentru a înțelege a doua problemă, mult mai serioasă, să trimitem cererea pe care am format-o și să vedem cum se execută în diferite părți ale codului. Iată piesa care este responsabilă pentru validarea datelor trimise de utilizator în metoda lucrătorului:

Este disponibil în continuare numai pentru membri

Opțiunea 1. Alăturați-vă comunității „site” pentru a citi toate materialele de pe site

Calitatea de membru al comunității în perioada specificată vă va oferi acces la TOATE materialele Hacker, vă va crește reducerea cumulativă personală și vă va permite să acumulați un rating profesional Xakep Score!

Ultima modificare pe 23 iulie 2019 de Vincy.

Înregistrarea sau înscrierea utilizatorului este o parte integrantă a multor aplicații web și este esențial să o faceți corect pentru succesul aplicației. Este punctul de plecare al interacțiunii utilizatorilor cu aplicația dvs.

Ar trebui să fie cât se poate de simplu, cu cea mai bună UI / UX. Implementarea funcționalității de înregistrare a utilizatorilor folosind PHP este o sarcină simplă și vă voi ghida prin pașii cu exemple din acest articol.

Ce e inauntru?

Cum funcționează acest exemplu de înregistrare a utilizatorului PHP?

Acest exemplu de cod poate fi separat în 3 părți.

  1. Obținerea informațiilor despre utilizator printr-un formular HTML.
  2. Validarea informațiilor trimise de utilizator pe formularul de trimitere.
  3. Gestionarea bazei de date pentru a salva utilizatorul înregistrat în baza de date după validare.

Al treilea pas va fi executat după ce vă asigurați că utilizatorul nu este deja adăugat. Această validare a unicității datelor va fi efectuată pe baza e-mailului și a numelui de utilizator introdus de ei.

În timpul înregistrării, colectăm în general informații despre utilizatori, care sunt gata să se înregistreze cu aplicația noastră. Unele dintre ele vor fi obligatorii, iar altele vor fi opționale.

Deci, această funcționalitate poate include și o parte de validare pentru a asigura lipsa golului și formatul datelor utilizatorului. Validarea se poate face fie pe partea client, fie pe partea serverului.

A avea validare la nivelul serverului este întotdeauna mai bine. Puteți alege să îl aveți în partea clientului și pentru ușurința în utilizare de către utilizatori. Dar a avea pe partea serverului nu este opțional și o cerință minimă.

structura fișierului

Formular HTML pentru a permite utilizatorului să se înregistreze

În acest exemplu, formularul de înregistrare conține câmpurile Nume utilizator, Nume (Nume afișat), Parolă și E-mail. Are, de asemenea, câmpul Confirm Password pentru a permite utilizatorului să reintroducă parola pentru confirmare. Aceste două parole vor fi comparate mai târziu la momentul unui .

Prin trimiterea acestui formular, utilizatorul este de așteptat să fie de acord cu termenii și condițiile. Deci un câmp de casetă de selectare este adăugat înainte de butonul Înregistrare pentru a-l asigura.

Formular de înregistrare a utilizatorului PHP

Inscrie-te
"; } ?>
">
">
">
Accept termenii și condițiile

Și stilurile sunt

Body ( font-family: Arial; culoare: #333; font-size: 0.95em; ) .form-head (culoare: #191919; font-weight: normal; font-weight: 400; margine: 0; text-align : centru; dimensiunea fontului: 1.8em; ) mesaj de eroare ( umplutură: 7px 10px; fundal: #fff1f2; chenar: #ffd5da 1px solid; culoare: #d6001c; chenar-rază: 4px; margine: 30px 0px 10px 0px ; ) .success-message ( umplutură: 7px 10px; fundal: #cae0c4; chenar: #c3d0b5 1px solid; culoare: #027506; border-radius: 4px; margine: 30px 0px 10px 0px; ) .demo-table (fundal: #ffffff; chenar-spațiere: inițială; margine: 15px automat; cuvânt-break: break-word; table-layout: automat; line-height: 1,8em; culoare: #333; chenar-radius: 4px; padding: 20px 40px ;lățime: 380px;chenar: 1px solid;border-color: #e5e6e9 #dfe0e4 #d0d1d5; ) .demo-table .label (culoare: #888888; ) .demo-table .field-coloană (padding: 15px 0px; ) .demo-input-box ( padding: 13px; chenar: #CCC 1px solid; border-radius: 4px; lățime: 100%; ) .btnRegister ( padding: 13px; culoare de fundal: #5d9cec; culoare: #f5f7fa; cursor: pointer; chenar-rază: 4px latime: 100% chenar: #5791da 1px solid; dimensiunea fontului: 1.1em ) .response-text (lățime maximă: 380px; dimensiunea fontului: 1.5em; text-align: center; fundal: #fff3de; padding: 42px; border-radius: 3px; chenar: #f5e9d4 1px solid; font-family : arial; line-height: 34px; margin: 15px automat; ) .terms ( margin-bottom: 5px; )

Cum se validează informațiile despre utilizator la trimiterea formularului

La acest exemplu este adăugat un script de validare a formularului pe partea de server pentru validarea datelor de înregistrare a utilizatorului. Acest script de validare PHP va fi apelat la trimiterea formularului de înregistrare.

Acest script validează toate câmpurile formularului pentru a verifica lipsa golului pentru fiecare câmp. Apoi validează formatul de e-mail al utilizatorului folosind funcția filter_var() a PHP.

Deoarece înregistrarea include o funcție de confirmare a parolei, compararea parolei va avea loc în această parte a acestui exemplu.

În cele din urmă, scriptul de validare va verifica dacă utilizatorul acceptă termenii și condițiile bifând caseta corespunzătoare din formular.

Odată ce toată validarea este finalizată prin returnarea booleanului true, atunci procesul real de înregistrare va avea loc.

Funcția validateMember() ( $valid = adevărat; $errorMessage = array(); foreach ($_POST ca $key => $value) ( ​​​​dacă (gol ($_POST[$key])) ( $valid = fals; ) ) if($valid == true) ( ​​​​dacă ($_POST["parolă"] != $_POST["confirm_parola"]) ( $errorMessage = "Parolele ar trebui să fie aceleași."; $valid = false; ) if (! isset ($error_message)) ( if (! filter_var($_POST["userEmail"], FILTER_VALIDATE_EMAIL)) ( $errorMessage = "Adresă de e-mail nevalidă."; $valid = fals; ) ) dacă (! isset($ mesaj_de_error)) ( if (! isset($_POST["termeni"])) ( $errorMessage = "Acceptați termenii și condițiile."; $valid = fals; ) ) ) else ( $errorMessage = "Toate câmpurile sunt obligatorii." ; ) dacă ( $valid == fals) ( return $errorMessage; ) return; )

Cod PHP MySQL pentru a accesa baza de date pentru a salva utilizatorul înregistrat

Validarea formularului utilizatorului pe partea serverului

Acesta este punctul de intrare PHP pentru a gestiona toate scripturile de pe partea serverului pentru a valida formularul și pentru a gestiona operațiunile bazei de date pe baza rezultatului validării.

validateMember($nume utilizator, $nume afișat, $parolă, $e-mail); if (gol ($errorMessage)) ( $memberCount = $member->isMemberExists($nume utilizator, $e-mail); dacă ($memberCount == 0) ( $insertId = $member->insertMemberRecord($nume utilizator, $nume afișat, $ parola, $email); if (! empty($insertId)) ( header("Locație: thankyou.php"); ) ) else ( $errorMessage = "Utilizatorul există deja."; ) ) ) ?>

Verificați dacă utilizatorul există deja

Funcția isMemberExists() este utilizată pentru a verifica unicitatea datelor utilizatorului pe baza e-mailului și a numelui de utilizator. Dacă numele de utilizator sau e-mailul introdus există în baza de date a utilizatorilor, atunci procesul de înregistrare va fi oprit prin revenire și confirmare.

Această confirmare va anunța că „utilizatorul există deja”. codul este,

Funcția esteMemberExists($nume utilizator, $e-mail) ( $interogare = "selectați * FROM registered_users WHERE nume_utilizator = ? SAU email = ?"; $paramType = "ss"; $paramArray = matrice ($nume utilizator, $e-mail); $memberCount = $this->ds->numRows($query, $paramType, $paramArray); return $memberCount; )

Introduceți datele membrilor în baza de date

Dacă returnează 0, înseamnă că nu există astfel de utilizatori cu e-mailul sau numele de utilizator introdus. Și astfel, datele de înregistrare vor fi inserate în baza de date. Următorul cod arată metoda de inserare a membrilor.

Funcția insertMemberRecord($nume utilizator, $nume afișat, $parolă, $e-mail) ( $parolăHash = md5($parolă); $interogare = "INSERT ÎN utilizatori_înregistrați (nume_utilizator, nume_afișat, parolă, e-mail) VALORI (?, ?, ?, ? )"; $paramType = "ssss"; $paramArray = array($nume utilizator, $displayName, $parolaHash, $email); $insertId = $this->ds->insert($query, $paramType, $paramArray); returnează $insertId; )

DataSource.php

Aceasta este clasa de sursă de date generică în PHP pentru a efectua operațiuni de bază de date. Include funcții pentru a conecta baza de date și a executa diverse interogări pentru a obține rezultatul bazei de date, numărul rândurilor, executarea inserării și multe altele.

Această clasă de surse de date este generică și păstrată cât mai simplă posibil. Este eficient și îl folosesc în majoritatea microproiectelor și tutorialelor mele. Sunteți liber să îl descărcați și să îl utilizați.

lucru important este nu uitați niciodată să utilizați Declarațiile pregătite. Vă ajută să vă protejați de atacurile de injecție SQL și este primul pas în ceea ce privește implementarea securității într-o aplicație web.

conn = $this->getConnection(); ) /** * Dacă este necesar un obiect de conexiune, utilizați această metodă și obțineți acces la el. * În caz contrar, utilizați metodele de mai jos pentru inserare / actualizare / etc. * * @return \mysqli */ funcția publică getConnection() ( $conn = new \mysqli(self::HOST, self::USERNAME, self::PASSWORD, self::DATABASENAME); if (mysqli_connect_errno()) ( trigger_error ("Problemă cu conectarea la baza de date."); ) $conn->set_charset("utf8"); return $conn; ) /** * Pentru a obține rezultatele bazei de date * @param șir $query * @param șir $paramType * @ param array $paramArray * @return array */ public function select($query, $paramType="", $paramArray=array()) ( $stmt = $this->conn->prepare($query); if(! empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($sql, $paramType, $paramArray); ) $stmt->execute(); $result = $stmt->get_result(); if ($rezult->num_rows > 0) ( while ($row = $result->fetch_assoc()) ( $resultset = $row; ) ) if (! empty($resultset)) ( return $resultset; ) ) / ** * Pentru a introduce * @param șir $interogare * @param șir $paramType * @param array $paramArray * @return int */ public function insert($query, $paramType, $p aramArray) ( print $interogare; $stmt = $this->conn->prepare($query); $this->bindQueryParams($stmt, $paramType, $paramArray); $stmt->execute(); $insertId = $stmt->insert_id; returnează $insertId; ) /** * Pentru a executa interogarea * @param string $query * @param string $paramType * @param array $paramArray */ public function execute($query, $paramType="", $paramArray=array()) ( $ stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($stmt, $paramType="", $paramArray= array()); ) $stmt->execute(); ) /** * 1. Pregătește legarea parametrilor * 2. Leagă prameters la instrucțiunea sql * @param șir $stmt * @param șir $paramType * @param matrice $ paramArray */ funcție publică bindQueryParams($stmt, $paramType, $paramArray=array()) ( $paramValueReference = & $paramType; pentru ($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($interogare); if(!empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($stmt, $paramType, $paramArray); ) $stmt->execute(); $stmt->store_result(); $recordCount = $stmt->num_rows; returnează $recordCount; ) )

Scriptul bazei de date

Acest script de bază de date are instrucțiunea create pentru tabelul registered_users. Importați acest script în mediul dvs. de dezvoltare pentru a rula acest cod.

Structura tabelului pentru tabelul „users_înregistrați” -- CREATE TABLE IF NOT EXISTS „registered_users” (`id` int(8) NOT NULL AUTO_INCREMENT, `user_name` varchar(255) NOT NULL, `first_name` varchar(255) NOT NULL, ` last_name` varchar(255) NOT NULL, `parolă` varchar(25) NOT NULL, `email` varchar(55) NOT NULL, `gen` varchar(20) NOT NULL, CHEIE PRIMARĂ (`id`));

Dacă validarea formularului de înregistrare nu reușește, atunci mesajul de eroare va fi afișat utilizatorului ca mai jos.

Comentarii la „Formular de înregistrare a utilizatorului PHP (înregistrare) cu baza de date MySQL”

    Bună Vincy, primesc următoarele erori când rulez codul de înregistrare, vă rugăm să ajutați.

    INSERT INTO utilizatori_înregistrați (nume_utilizator, nume_afișat, parolă, e-mail) VALORI (?, ?, ?, ?)
    Avertisment: call_user_func_array() se așteaptă ca parametrul 1 să fie un callback valid, primul membru al matricei nu este un nume de clasă sau obiect valid în C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php pe linia 136

    Eroare fatală: Eroare neprinsă: Apel la o funcție membru execute() pe boolean în C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php:99 Urmărirea stivei: #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 protected]…’) #2 (principal) aruncat în C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php pe linia 99