Scrieți înregistrarea în php. Crearea unui sistem simplu de înregistrare a utilizatorilor în PHP și MySQL. Esti deja inregistrat

Multe dintre site-uri web au un formular de înregistrare pentru ca utilizatorii dvs. să se înscrie și, astfel, pot beneficia de un fel de privilegii în cadrul site-ului. În acest articol vom vedea cum să creați un formular de înregistrare în PHP și MySQL.

Vom folosi etichete simple și, de asemenea, vom folosi eticheta table pentru a proiecta pagina web Sign-Up.html. Să începem:

Listarea 1:sign-up.html

Inscrie-te

Formular de înregistrare
Nume
E-mail
nume de utilizator
Parola
Confirmă parola


Figura 1:

Descrierea paginii web sing-in.html:

După cum puteți vedea în Figura 1, există un formular de înregistrare și solicită puține date despre utilizator. Acestea sunt datele comune pe care orice site le solicită utilizatorilor sau vizitatorilor săi să creeze un ID și o parolă. Am folosit eticheta de tabel pentru că pentru a afișa câmpurile formularului de pe pagina web într-un formular de aranjare, așa cum le puteți vedea în Figura 1. Pare atât de simplu, deoarece încă nu am folosit stilul CSS pe el, acum haideți să folosim stiluri CSS și să legăm Fișier în stil CSS cu pagina web sing-up.html.

Lista 2:style.css

/*Fișier CSS pentru pagina web de înscriere*/ #body-color( background-color:#6699CC; ) #Sign-Up( background-image:url("sign-up.png"); background-size:500px 500px ; background-repeat:no-repeat; background-attachment:fix; background-position:center; margin-top:150px; margin-bottom:150px; margin-right:150px; margin-left:450px; padding:9px 35px; ) #button( chenar-rază:10px; lățime:100px; înălțime:40px; fundal:#FF00FF; font-weight:bold; font-size:20px; )

Lista 3: Conectați style.css cu pagina web sign-up.html



Figura 2:

Descrierea fișierului style.css:

În fișierul CSS extern am folosit câteva stiluri care ar putea arăta noi pentru tine. Cum am folosit o imagine în fundal și am pus-o în centrul paginii web. Care a devenit ușor de utilizat cu ajutorul etichetei html div. Deoarece am folosit trei ID-uri de etichete div. #button, #sing-up și #body-color și le-am aplicat toate stilurile CSS și acum puteți vedea Figura 2, cât de frumos și atractiv arată. Puteți utiliza multe alte stiluri CSS, cum ar fi stilurile CSS 2D și 3D pe el. Va arăta mai frumos decât arată acum.

După toate aceste lucrări simple, acum vom crea o bază de date și un tabel pentru a stoca toate datele în baza de date a noilor utilizatori. Înainte de a crea un tabel, ar trebui să știm ce avem nevoie de la utilizator. Pe măsură ce am conceput formularul, vom crea tabelul conform formularului de înregistrare, pe care îl puteți vedea în Figura 1 și 2.

Lista 3: Interogare pentru tabel în MySQL

CREATE TABLE WebsiteUsers (userID int(9) NOT NULL auto_increment, fullname VARCHAR(50) NOT NULL, userName VARCHAR(40) NOT NULL, email VARCHAR(40) NOT NULL, trece VARCHAR(40) NOT NULL, PRIMARY KEY(userID) );

Descrierea listei 3:

Un lucru ar trebui să știți că, dacă nu aveți facilitate MySQL pentru a utiliza această interogare, ar trebui să urmați articolul meu anterior despre . din acest link veți putea înțelege instalarea și cerințele. Și cum îl putem folosi.

În interogarea listare 3 am folosit toate acele lucruri de care avem nevoie pentru formularul de înregistrare. Deoarece există variabile de e-mail, nume complet, parolă și nume de utilizator. Aceste variabile vor stoca date ale utilizatorului, pe care el/ea le va introduce în formularul de înregistrare din Figura 2 pentru înscriere.

După toate aceste lucrări, vom lucra cu programarea PHP, care este un limbaj de programare pe partea de server. De aceea trebuie să creați o conexiune cu baza de date.

Lista 4: Conexiune la baza de date

Descrierea listei 4:

Am creat o conexiune între baza de date și paginile noastre web. Dar dacă nu știi dacă funcționează sau nu, mai folosești un singur lucru în lista de verificare 5 pentru el.

Lista 5: verificarea conexiunii conectivității bazei de date

Lista de descriere 5:

În Lista 5 am încercat doar să vă arăt că puteți verifica și confirma conexiunea dintre baza de date și PHP. Și încă un lucru, nu vom folosi codul Listing 5 în pagina noastră web de inscriere. Pentru că este doar pentru a vă face să înțelegeți cum puteți verifica conexiunea MySQL.

Acum vom scrie o aplicație de programare PHP pentru a verifica mai întâi disponibilitatea utilizatorului și apoi a stoca utilizatorul dacă acesta este un utilizator nou pe pagina web.

Lista 6: connectivity-sign-up.php

Descrierea connectivity-sign-up.php

În această aplicație PHP am folosit cel mai simplu mod de a crea o aplicație de înscriere pentru paginile web. După cum puteți vedea, mai întâi creăm o conexiune ca lista 4. Și apoi am folosit două funcții, prima funcție este SignUP(), care este apelată de instrucțiunea if din ultima aplicație, unde prima confirmă apăsarea butonului de înregistrare. buton. Dacă este apăsat, va apela funcția SingUp și această funcție va folosi o interogare de SELECT pentru a prelua datele și a le compara cu userName și e-mailul introdus în prezent de la utilizator. Dacă numele de utilizator și adresa de e-mail sunt deja prezente în baza de date, se va spune scuze, sunteți deja înregistrat

Dacă utilizatorul este nou, deoarece numele său de utilizator actual și ID-ul de e-mail nu sunt prezente în baza de date, astfel încât instrucțiunea If va apela NewUser() unde va stoca toate informațiile noului utilizator. Și utilizatorul va deveni parte a paginii web.



Figura 3

În figura 3, utilizatorul introduce date pentru a se înscrie dacă utilizatorul este un utilizator vechi al acestei pagini web conform înregistrărilor bazei de date. Astfel, pagina web va afișa un mesaj că utilizatorul este deja înregistrat dacă utilizatorul este nou, astfel încât pagina web va afișa un mesaj că înregistrarea utilizatorului este finalizată.



Figura 4:

Pe măsură ce am introdus date în formularul de înregistrare (Figura 4), conform bazei de date, numele de utilizator și e-mailul pe care l-am introdus în formularul de înregistrare pentru înregistrare, este deja prezent în baza de date. Așa că ar trebui să încercăm un nou nume de utilizator și o adresă de e-mail pentru a vă înscrie cu un nou ID și o nouă parolă.



Figura 5

În figura 5, ne confirmă ce nume de utilizator și ID-ul de e-mail a introdus utilizatorul. Ambele nu sunt prezente în înregistrările bazei de date. Așadar, acum este creat un nou ID și o parolă, iar utilizatorul poate să-și folosească noul ID și parola pentru a se autentifica data viitoare.

Concluzie:

În acest articol am învățat cel mai simplu mod de a crea o pagină web de înscriere. De asemenea, am învățat cum se ocupă cu baza de date dacă folosim PHP și MySQL. Am încercat să vă ofer cunoștințe de bază despre funcționalitatea de înscriere a paginii web. Cum funcționează la partea din spate și cum îi putem schimba aspectul pe partea din față. Pentru orice întrebare nu ezitați și comentați.

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

Funcția de înregistrare și autorizare a utilizatorilor pe site este implementată astfel: atunci când un utilizator se înregistrează pe site, acesta completează un formular de înregistrare în care indică diverse date, inclusiv login și parola. Formularul trimite aceste date către server și este scris în baza de date.

  1. Utilizatorul introduce un login și o parolă în formularul de autorizare și le trimite la server.
  2. Serverul verifică dacă există un utilizator cu același nume de utilizator și parolă în baza de date.
  3. Dacă utilizatorul este găsit, atunci informații despre aceasta sunt înregistrate în sesiune sau cookie-uri.
  4. Pe paginile site-ului se face o verificare - dacă există date în sesiune că utilizatorul este autorizat și, în funcție de aceasta, pagina este afișată într-o formă sau alta.

În sesiune, puteți nu numai să indicați faptul autorizării, ci și să notați câteva date de utilizator pentru a le afișa pe pagină, de exemplu, un nume sau un pseudonim. Decizia cu privire la utilizarea sesiunilor sau cookie-urilor este luată de la site la site. Dacă site-ul conține informații importante, atunci este mai bine să folosiți sesiuni, deoarece este mult mai dificil să aflați datele de înregistrare ale altor persoane.

Formulare de autorizare și înregistrare

Formularul de autorizare se află de obicei pe pagina principală sau poate fi pe toate paginile site-ului. Pentru formularul de înregistrare, practic, se creează o pagină separată. Vom crea o singură pagină, pe care vor fi ambele formulare, iar pe ea vor fi afișate și datele utilizatorului. Deocamdată va conține doar cod HTML, dar imediat vom face un fișier PHP, pentru că în viitor va fi un script. Să-i spunem formreg.php. Codul paginii va fi astfel:

formreg.php:

Înregistrare

Vom scrie datele de înregistrare a utilizatorilor în tabelul utilizatorilor. Dacă nu aveți deja un astfel de tabel, atunci creați-l. Ar trebui să aibă câmpuri ID, login și pas. Nu vom folosi alte câmpuri. Dacă sunt în tabel, vor rămâne goale.

înregistrare.php:

3
4
5
6
7
8
9
10

$login=$_POST["login"]; $pas=$_POST[„parolă”]; $db=mysqli_connect("localhost", "root", "", "mybase"); $query="INSERT INTO users (login, pas) VALUES ("$login", "$pas"); $rezultat=mysqli_query($db, $query); if ($rezultat) header("Locație: formreg.php"); mysqli_close($db);

Pe linia 9, setăm revenirea la pagina de formulare. Deoarece execuția scriptului și reîncărcarea paginii pe serverul local este foarte rapidă, vizual va arăta ca și cum nu se întâmplă nimic atunci când faceți clic pe butonul „Înregistrare”. Pe site-urile reale, de obicei merg la o pagină specială cu informații despre care utilizatorul este înregistrat și date de înregistrare. Încercați să vă conectați și vedeți dacă apar intrări noi în baza de date.

Autorizare

Formularul de autorizare lansează fișierul authorization.php pe server. Acest script ia un nume de utilizator și o parolă și verifică dacă există un astfel de utilizator. Dacă este, atunci autentificarea va fi înregistrată în sesiune. Dacă un astfel de utilizator nu este găsit, atunci informațiile despre acesta vor fi scrise în sesiune. Acest lucru este necesar pentru ca pagina care va fi deschisă după executarea scriptului să primească aceste informații și să afișeze un mesaj că a fost introdus un nume de utilizator sau o parolă incorectă. Codul de script este acesta:

authorization.php:

3
4
5
6
7
8
9
10
11
12
13
14

sesiune_start(); $login=$_POST["login"]; $pas=$_POST[„parolă”]; $db=mysqli_connect("localhost", "root", "", "mybase"); $query="SELECT * FROM utilizatorii WHERE login="$login" AND BINARY pas="$pas""; $rezultat=mysqli_query($db, $query); if (mysqli_num_rows($rezultat)) $_SESSION["login"]=$login; else $_SESSION["login"]="autentificare"; header("Locație: formreg.php"); mysqli_close($db);

În rândul 7, se formează o solicitare pentru a selecta o linie cu un login și o parolă primite din formular. Câmpul pas este precedat de cuvântul cheie BINARY. Este necesar ca la compararea prin acest câmp să se țină cont de cazul caracterelor. Dacă doriți ca cazul să fie luat în considerare la compararea login-ului, atunci trebuie scris BINARY înaintea acestuia. În exemplu, se face o solicitare pentru selectarea tuturor câmpurilor. În practică, puteți selecta doar acele câmpuri ale căror date vor trebui afișate pe pagină.

După primirea rezultatului, se verifică dacă a fost găsită intrarea specificată. Dacă există o înregistrare, atunci autentificarea este scrisă în sesiune. Dacă utilizatorul nu este găsit, atunci se scrie șirul „er login” în locul login-ului. Puteți scrie un text diferit, dar trebuie să vă asigurați că nu se potrivește cu anumite date de conectare. Apoi revine la pagina formularului.

Paginile site-ului ar trebui să aibă un cod care verifică dacă există o autentificare în sesiune. Și în funcție de aceasta, determină cum ar trebui să arate pagina. În exemplul nostru, există o singură pagină. Să verificăm pe el. Numai codul va fi împărțit în două părți. Sesiunea ar trebui să fie deschisă înainte ca orice date să fie scoase, adică înainte de codul HTML. Prin urmare, această parte se află chiar la începutul paginii. Și restul codului se află în interiorul etichetei , deoarece adaugă un conținut paginii. Adăugați această linie în partea de sus a paginii:

Dacă sesiunea are un login, dar conține șirul „er login”, atunci este afișat un mesaj că autentificarea sau parola este incorectă. După ce mesajul este afișat, datele de conectare devin goale. Acest lucru se face astfel încât mesajul să fie afișat o singură dată și să nu apară la trecerea la alte pagini. Dacă autentificarea este diferită, atunci utilizatorul este autorizat și pagina este generată ca pentru utilizatorii înregistrați. Dacă nu există autentificare, atunci nu a existat încă autorizare și pagina este afișată pentru utilizatorii neînregistrați.

Am luat în considerare doar principiul general al creării unei funcții de înregistrare și autorizare. Pe site-urile reale este mai dificil. Formularele ar trebui să fie afișate numai utilizatorilor neautorizați. În plus, trebuie să adăugați un buton „Ieșire”, care anulează autorizarea. Când vă înregistrați, trebuie să faceți validarea formularului, să verificați unicitatea login-ului și să adăugați o confirmare a parolei.

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!

Crearea unui site bazat pe abonament pare o sarcină descurajantă la început. Dacă ați vrut vreodată să faceți acest lucru singur, apoi ați renunțat când ați început să vă gândiți cum o veți pune împreună folosind abilitățile dvs. PHP, atunci acest articol este pentru dvs. Vă vom prezenta fiecare aspect al creării unui site bazat pe abonament, cu o zonă de membri securizată protejată prin parolă.

Întregul proces constă din două părți mari: înregistrarea utilizatorului și autentificarea utilizatorului. În prima parte, vom acoperi crearea formularului de înregistrare și stocarea datelor într-o bază de date MySQL. În a doua parte, vom crea formularul de autentificare și îl vom folosi pentru a permite accesul utilizatorilor în zona securizată.

Descărcați codul

Puteți descărca întregul cod sursă pentru sistemul de înregistrare/login din linkul de mai jos:

Configurare și încărcare
Fișierul ReadMe conține instrucțiuni detaliate.

Deschide sursă\include\membersite_config.php fișier într-un editor de text și actualizați configurația. (Autentificare la baza de date, numele site-ului dvs., adresa dvs. de e-mail etc).

Încărcați întregul conținut al directorului. Testați register.php prin trimiterea formularului.

Formularul de înregistrare

Pentru a crea un cont de utilizator, trebuie să colectăm o cantitate minimă de informații de la utilizator. Avem nevoie de numele lui, adresa de e-mail și numele de utilizator și parola dorite. Desigur, putem cere mai multe informații în acest moment, dar o formă lungă este întotdeauna o oprire. Deci, să ne limităm doar la acele domenii.

Iată formularul de înregistrare:

Inregistreaza-te

Deci, avem câmpuri de text pentru nume, e-mail și parolă. Rețineți că folosim pentru o mai bună utilizare.

Validarea formularului

În acest moment, este o idee bună să punem o formă de cod de validare, așa că ne asigurăm că avem toate datele necesare pentru a crea contul de utilizator. Trebuie să verificăm dacă numele și e-mailul și parola sunt completate și dacă e-mailul este în formatul adecvat.

Gestionarea depunerii formularului

Acum trebuie să ne ocupăm de datele din formular care sunt trimise.

Iată secvența (vezi fișierul fg_membersite.php în sursa descărcată):

funcția RegisterUser() ( if(!isset($_POST["trimis"])) ( returnează fals; ) $formvars = array(); if(!$this->ValidateRegistrationSubmission()) ( returnează false; ) $this- >CollectRegistrationSubmission($formvars); if(!$this->SaveToDatabase($formvars)) ( returnează false; ) if(!$this->SendUserConfirmationEmail($formvars)) ( returnează false; ) $this->SendAdminIntimationEmail($ formvars); returnează adevărat; )

În primul rând, validăm trimiterea formularului. Apoi colectăm și „igienizăm” datele de trimitere a formularelor (faceți întotdeauna acest lucru înainte de a trimite e-mailuri, de a salva în baza de date etc). Trimiterea formularului este apoi salvată în tabelul bazei de date. Trimitem un e-mail utilizatorului prin care solicită confirmarea. Apoi informăm administratorul că un utilizator s-a înregistrat.

Salvarea datelor în baza de date

Acum că am adunat toate datele, trebuie să le stocăm în baza de date.
Iată cum salvăm trimiterea formularului în baza de date.

funcția SaveToDatabase(&$formvars) ( if(!$this->DBLogin()) ( $this->HandleError(„Conectarea la baza de date a eșuat!”); return false; ) if(!$this->Ensuretable()) ( return false; ) if(!$this->IsFieldUnique($formvars,"email")) ( $this->HandleError("Acest e-mail este deja înregistrat"); return false; ) if(!$this->IsFieldUnique( $formvars,"username")) ( $this->HandleError("Acest nume de utilizator este deja folosit. Vă rugăm să încercați un alt nume de utilizator"); return false; ) if(!$this->InsertIntoDB($formvars)) ( $this- >HandleError("Inserarea în baza de date a eșuat!"); return false; ) return true; )

Rețineți că ați configurat detaliile de conectare la baza de date în fișierul memberite_config.php. În cele mai multe cazuri, puteți utiliza „localhost” pentru gazda bazei de date.
După autentificare, ne asigurăm că tabelul există. (Dacă nu, scriptul va crea tabelul necesar).
Apoi ne asigurăm că numele de utilizator și e-mailul sunt unice. Dacă nu este unic, returnăm eroarea înapoi utilizatorului.

Structura tabelului bazei de date

Aceasta este structura tabelului. Funcția CreateTable() din fișierul fg_membersite.php creează tabelul. Iată codul:

funcția CreateTable() ( $qry = "Creați tabelul $this->tablename ("". "id_user INT NOT NULL AUTO_INCREMENT ,". "name VARCHAR(128) NOT NULL ,". "email VARCHAR(64) NOT NULL ,". „număr_telefon VARCHAR(16) NOT NULL ,”. „nume de utilizator VARCHAR(16) NOT NULL ,”. „parolă VARCHAR(32) NOT NULL ,”. „cod de confirmare VARCHAR(32) ,”. „CHEIE PRIMĂRĂ (ID_utilizator)”. ")"; if(!mysql_query($qry,$this->connection)) ( $this->HandleDBError("Eroare la crearea tabelului \nquery a fost\n $qry"); return false; ) return true; )

Câmpul id_user va conține id-ul unic al utilizatorului și este, de asemenea, cheia primară a tabelului. Observați că permitem 32 de caractere pentru câmpul de parolă. Facem acest lucru pentru că, ca măsură suplimentară de securitate, vom stoca parola în baza de date criptată folosind MD5. Vă rugăm să rețineți că, deoarece MD5 este o metodă de criptare unidirecțională, nu vom putea recupera parola în cazul în care utilizatorul o uită.

Inserarea inregistrarii in tabel

Iată codul pe care îl folosim pentru a introduce date în baza de date. Vom avea toate datele noastre disponibile în matricea $formvars.

funcția InsertIntoDB(&$formvars) ( $confirmcode = $this->MakeConfirmationMd5($formvars[„email”]); $insert_query = „inserați în „.$this->tablename.”(nume, e-mail, nume de utilizator, parolă, confirmcode) valori ("" . $this->SanitizeForSQL($formvars["nume"]) . "", "" . $this->SanitizeForSQL($formvars["email"]) . "", "" . $ this->SanitizeForSQL($formvars["nume utilizator"]) . "", "" . md5($formvars["parolă"]) . "", "" . $confirmcode . "")"; if(! mysql_query( $insert_query ,$this->connection)) ( $this->HandleDBError("Eroare la inserarea datelor în tabel\nquery:$insert_query"); return false; ) return true; )

Observați că folosim funcția PHP md5() pentru a cripta parola înainte de a o introduce în baza de date.
De asemenea, facem codul unic de confirmare din adresa de email a utilizatorului.

Trimiterea de e-mailuri

Acum că avem înregistrarea în baza noastră de date, vom trimite un e-mail de confirmare utilizatorului. Utilizatorul trebuie să facă clic pe un link din e-mailul de confirmare pentru a finaliza procesul de înregistrare.

funcția SendUserConfirmationEmail(&$formvars) ( $mailer = new PHPMailer(); $mailer->CharSet = "utf-8"; $mailer->AddAddress($formvars["email"], $formvars["nume"]) ; $mailer->Subject = "Înregistrarea dvs. cu ".$this->sitename; $mailer->From = $this->GetFromAddress(); $confirmcode = urlencode($this->MakeConfirmationMd5($formvars["email" ])); $confirm_url = $this->GetAbsoluteURLFolder()."/confirmreg.php?code=".$confirmcode; $mailer->Body ="Bună ziua ".$formvars["nume"]."\r\ n\r\n". „Vă mulțumim pentru înregistrarea cu „.$this->sitename.”\r\n". „Vă rugăm să faceți clic pe linkul de mai jos pentru a confirma înregistrarea.\r\n". „$confirm_url\r \n". „\r\n". „Cu stimă,\r\n". „Webmaster\r\n". $this->sitename; if(!$mailer->Send()) ( $this-> HandleError(„Trimiterea e-mailului de confirmare a înregistrării nu a reușit.”); return false; ) return true; )

actualizări

9 ianuarie 2012
Sunt adăugate funcțiile Resetare parolă/Modificare parolă
Codul este acum partajat la GitHub.

Bine ai revenitUserFullName(); ?>!

Licență


Codul este partajat sub licența LGPL. Îl puteți folosi liber pe site-uri web comerciale sau necomerciale.

Nu există postări înrudite.

Comentariile la această intrare sunt închise.