Parašyk registraciją į php. Sukurti paprastą vartotojų registravimo sistemą PHP ir MySQL. Jūs jau užsiregistravote

Daugelyje svetainių yra registracijos forma, kurią vartotojai gali užsiregistruoti, todėl gali pasinaudoti tam tikra privilegija svetainėje. Šiame straipsnyje pamatysime, kaip sukurti registracijos formą PHP ir MySQL.

Kurdami Sign-Up.html tinklalapį, naudosime paprastas žymas, taip pat naudosime lentelės žymą. Pradėkime:

Sąrašas 1:registracija.html

Registruotis

Registracijos forma
vardas
El. paštas
Vartotojo vardas
Slaptažodis
Patvirtinti slaptažodį


Figūra 1:

Sing-in.html tinklalapio aprašymas:

Kaip matote 1 paveiksle, yra registracijos forma, kurioje prašoma nedaug duomenų apie vartotoją. Tai yra įprasti duomenys, kuriuos bet kuri svetainė prašo savo vartotojų ar lankytojų sukurti ir ID bei slaptažodį. Lentelės žymą naudojome, nes norėdami tinklalapio formos laukus rodyti sutvarkyta forma, kaip matote 1 paveiksle. Tai atrodo taip paprasta, nes dar nenaudojome joje CSS stiliaus, dabar naudokime CSS stilius ir susiesime CSS stiliaus failas su sing-up.html tinklalapiu.

2 sąrašas:style.css

/*CSS failas, skirtas prisiregistruoti tinklalapiui*/ #body-color( background-color:#6699CC; ) #Sign-Up( background-image:url("sign-up.png"); background-size:500px 500px ; fono kartojimas: nekartoti; fono priedas: fiksuotas; fono padėtis: centre; paraštės viršuje: 150 tšk.; paraštės apačioje: 150 tšk.; paraštės dešinėje: 150 pikselių; paraštės kairėje: 450 pikselių; užpildymas: 9 piks. 35 piks. ) #button( kraštinės spindulys: 10 pikselių; plotis: 100 pikselių; aukštis: 40 pikselių; fonas: #FF00FF; šrifto svoris: paryškintas; šrifto dydis: 20 pikselių; )

3 sąrašas: susiekite style.css su sign-up.html tinklalapiu



2 pav.

Failo style.css aprašymas:

Išoriniame CSS faile naudojome keletą stilių, kurie jums gali atrodyti nauji. Kaip fone naudojome vaizdą ir nustatėme jį tinklalapio centre. Kurį lengva naudoti naudojant html div žymą. Kaip naudojome tris div žymų ID. #button, #sing-up ir #body-color ir mes pritaikėme jiems visus CSS stilius ir dabar galite pamatyti 2 paveikslą, kaip jis atrodo gražiai ir patraukliai. Jame galite naudoti daugybę kitų CSS stilių, pavyzdžiui, 2D ir 3D CSS stilius. Jis atrodys gražiau nei atrodo dabar.

Atlikę visus šiuos paprastus darbus, dabar sukursime duomenų bazę ir lentelę, kurioje visi duomenys būtų saugomi naujų vartotojų duomenų bazėje. Prieš kurdami lentelę turėtume žinoti, ko reikalaujame iš vartotojo. Kurdami formą mes sukursime lentelę pagal registracijos formą, kurią galite pamatyti 1 ir 2 pav.

3 sąrašas: MySQL lentelės užklausa

KURTI LENTELĘ Svetainės vartotojai (naudotojo ID int(9) NOT NULL auto_increment, pilnas vardas VARCHAR(50) NOT NULL, vartotojo vardas VARCHAR(40) NOT NULL, el. paštas VARCHAR(40) NOT NULL, perduoti VARCHAR(40) NOT NULL, KEY(us) PRIMARY );

3 sąrašo aprašymas:

Turėtumėte žinoti vieną dalyką: jei neturite MySQL galimybės naudoti šią užklausą, vadovaukitės mano ankstesniu straipsniu apie . iš šios nuorodos galėsite suprasti diegimą ir reikalavimus. Ir kaip mes galime tai panaudoti.

3 sąrašo užklausoje panaudojome visus tuos dalykus, kurių mums reikia registracijos formai. Kadangi yra el. pašto, viso vardo, slaptažodžio ir vartotojo vardo kintamieji. Šie kintamieji saugos vartotojo duomenis, kuriuos jis įves į registracijos formą 2 pav.

Atlikę visus šiuos darbus, dirbsime su PHP programavimu, kuri yra serverio pusės programavimo kalba. Štai kodėl jums reikia sukurti ryšį su duomenų baze.

Sąrašas 4: Duomenų bazės ryšys

4 sąrašo aprašymas:

Sukūrėme ryšį tarp duomenų bazės ir mūsų tinklalapių. Bet jei nežinote, ar jis veikia, ar ne, tada paskutiniame 5 patikrinimo sąraše naudokite dar vieną dalyką.

Sąrašas 5: tikrinamas duomenų bazės ryšio ryšys

5 aprašo sąrašas:

5 sąraše aš ką tik bandžiau parodyti, kad galite patikrinti ir patvirtinti ryšį tarp duomenų bazės ir PHP. Ir dar vienas dalykas, mes nenaudosime 5 sąrašo kodo savo prisijungimo svetainėje. Nes tai tik tam, kad suprastumėte, kaip galite patikrinti MySQL ryšį.

Dabar parašysime PHP programavimo programą, kad pirmiausia patikrintume, ar vartotojas yra prieinamas, o tada išsaugosime vartotoją, jei jis yra naujas tinklalapio vartotojas.

Sąrašas 6: connectivity-sign-up.php

Connectivity-sign-up.php aprašymas

Šioje PHP programoje naudojau paprasčiausią būdą tinklalapių registracijos programai sukurti. Kaip matote, pirmiausia sukuriame ryšį, pvz., 4 sąrašą. Ir tada panaudojome dvi funkcijas, pirmoji funkcija yra SignUP(), kurią iškviečia if sakinys iš paskutinės programos, kur ji pirmiausia patvirtina registracijos paspaudimą. mygtuką. Jei bus paspaustas, bus iškviesta SingUp funkcija ir ši funkcija naudos SELECT užklausą, kad gautų duomenis ir palygintų juos su vartotojo vardu ir el. pašto adresu, kurį šiuo metu įvedė vartotojas. Jei vartotojo vardas ir el. pašto adresas jau yra duomenų bazėje, tai atsiprašau, kad jau esate užsiregistravę

Jei vartotojas yra naujas, nes jo šiuo metu vartotojo vardo ir el. pašto ID nėra duomenų bazėje, If sakinys iškvies NewUser (), kur bus saugoma visa naujojo vartotojo informacija. Ir vartotojas taps tinklalapio dalimi.



3 pav

3 paveiksle vartotojas įveda duomenis, kad prisiregistruotų, jei pagal duomenų bazės įrašus vartotojas yra senas šio tinklalapio vartotojas. Taigi tinklalapyje bus rodomas pranešimas, kad vartotojas jau užsiregistravęs, jei vartotojas yra naujas, todėl tinklalapyje bus rodomas pranešimas, kad vartotojo registracija baigta.



4 pav.

Kadangi įvedėme duomenis į registracijos formą (4 pav.), pagal duomenų bazę, kurį vartotojo vardą ir el. pašto adresą įvedėme registracijos formoje, jis jau yra duomenų bazėje. Taigi, norėdami prisiregistruoti naudodami naują ID ir slaptažodį, turėtume išbandyti naują vartotojo vardą ir el. pašto adresą.



5 pav

5 paveiksle ji mums patvirtina, kurį vartotojo vardą ir el. pašto ID vartotojas įvedė. Abiejų duomenų bazės įrašuose nėra. Taigi dabar sukuriamas naujas ID ir slaptažodis, o vartotojas gali naudoti savo naują ID ir slaptažodį, kad kitą kartą galėtų prisijungti.

Išvada:

Šiame straipsnyje sužinojome, kaip paprasčiausiai sukurti registracijos tinklalapį. Taip pat sužinojome, kaip ji veikia su duomenų baze, jei naudojame PHP ir MySQL. Bandžiau suteikti jums pagrindinių žinių apie prisiregistravimo tinklalapio funkcijas. Kaip jis veikia galinėje dalyje ir kaip galime pakeisti jo išvaizdą priekinėje dalyje. Jei turite klausimų, nedvejokite ir komentuokite.

Paskutinį kartą 2019 m. liepos 23 d. keitė Vincy.

Vartotojo registracija arba prisiregistravimas yra neatsiejama daugelio žiniatinklio programų dalis, todėl labai svarbu, kad programa būtų sėkminga. Tai yra vartotojo įsitraukimo į jūsų programą pradžios taškas.

Tai turėtų būti kuo paprastesnė naudojant geriausią vartotojo sąsają / UX. Įdiegti vartotojo registracijos funkciją naudojant PHP yra paprasta užduotis, todėl šiame straipsnyje pateiksiu pavyzdį.

Kas yra viduje?

Kaip veikia šis PHP vartotojo registracijos pavyzdys?

Šis pavyzdinis kodas gali būti padalintas į 3 dalis.

  1. Vartotojo informacijos gavimas naudojant HTML formą.
  2. Patvirtinamas vartotojo pateikta informacija formoje.
  3. Duomenų bazės tvarkymas, siekiant išsaugoti registruotą vartotoją duomenų bazėje po patvirtinimo.

Trečiasis veiksmas bus atliktas įsitikinus, kad vartotojas dar nepridėtas. Šis duomenų unikalumo patvirtinimas bus atliktas pagal jų įvestą el. pašto adresą ir vartotojo vardą.

Registracijos metu paprastai renkame informaciją apie naudotojus, kurie yra pasirengę registruotis naudodami mūsų programą. Kai kurie iš jų bus privalomi, o kai kurie – neprivalomi.

Taigi, ši funkcija taip pat gali apimti patvirtinimo dalį, kad būtų užtikrintas vartotojo duomenų netuštumas ir formatas. Patvirtinimas gali būti atliekamas kliento arba serverio pusėje.

Patvirtinimas serverio pusėje visada yra geriau. Taip pat galite pasirinkti, kad jis būtų kliento pusėje, kad vartotojams būtų patogu naudotis. Tačiau buvimas serverio pusėje nėra neprivalomas ir yra minimalus reikalavimas.

failo struktūra

HTML forma, leidžianti vartotojui užsiregistruoti

Šiame pavyzdyje registracijos formoje yra laukai Vartotojo vardas, Vardas (Rodomas vardas), Slaptažodis ir El. paštas. Jame taip pat yra laukas Patvirtinti slaptažodį, kad vartotojas galėtų iš naujo įvesti slaptažodį patvirtinimui. Šie du slaptažodžiai bus lyginami vėliau .

Tikimasi, kad pateikdamas šią formą vartotojas sutiks su taisyklėmis ir sąlygomis. Taigi prieš mygtuką Registruotis pridedamas žymės langelis, kad tai būtų užtikrinta.

PHP vartotojo registracijos forma

Registruotis
"; } ?>
">
">
">
Sutinku su taisyklėmis ir sąlygomis

Ir stiliai yra

Turinys (šriftų šeima: Arial; spalva: #333; šrifto dydis: 0,95 em; ) .form-head ( spalva: #191919; šrifto svoris: normalus; šrifto svoris: 400; paraštė: 0; teksto lygiavimas : centras; šriftas ; ) .success-message ( užpildymas: 7px 10px; fonas: #cae0c4; kraštinė: #c3d0b5 1px vientisas; spalva: #027506; kraštinės spindulys: 4px; paraštė: 30px 0px 10px 0px; :demo-table) (. #ffffff; tarpas tarp kraštinių: pradžia; paraštė: 15 pikselių automatinė; žodžių lūžis: laužomas žodis; lentelės išdėstymas: automatinis; eilutės aukštis: 1,8 em; spalva: #333; kraštinės spindulys: 4 piks.; užpildymas: 20 piks. 40 piks. ;plotis: 380 piks.;kraštinė: 1px vientisa;kraštinės spalva: #e5e6e9 #dfe0e4 #d0d1d5; ) .demo-table .label ( spalva: #888888; ) .demo-table .field-colum (padding: 15px;) 0px .demo-input-box ( padding: 13px; kraštinė: #CCC 1px solid; border-radius: 4px; plotis: 100%; ) .btnRegister ( padding: 13px; fono spalva: #5d9cec; spalva: #f5f7fa; žymeklis: rodyklė; kraštinės spindulys: 4 pikseliai plotis: 100 % kraštinė: #5791da 1px solid; šrifto dydis: 1,1 em ) .response-text (maksimalus plotis: 380 tšk.; šrifto dydis: 1,5 em; teksto lygiavimas: centre; fonas: #fff3de; užpildymas: 42 pikseliai; kraštinės spindulys: 3 pikseliai; kraštinė: #f5e9d4 1px vientisas; šriftų šeima : arial; eilutės aukštis: 34 piks.; paraštė: 15 piks. automatinis; ) .terms ( paraštė-apačia: 5 piks.; )

Kaip patvirtinti vartotojo informaciją pateikiant formą

Prie šio pavyzdžio pridedamas serverio formos patvirtinimo scenarijus, skirtas vartotojo registracijos duomenims patvirtinti. Šis PHP patvirtinimo scenarijus bus iškviestas pateikus registracijos formą.

Šis scenarijus patvirtina visus formos laukus, kad patikrintų kiekvieno lauko netuštumą. Tada jis patvirtina vartotojo el. pašto formatą naudodamas PHP funkciją filter_var().

Kadangi registracija apima slaptažodžio patvirtinimo funkciją, slaptažodžių palyginimas bus atliekamas šioje šio pavyzdžio dalyje.

Galiausiai, patvirtinimo scenarijus patikrins, ar vartotojas sutinka su terminais ir sąlygomis, pažymėdamas atitinkamą formos laukelį.

Kai visas patvirtinimas bus baigtas grąžinant loginį teisingą, bus pradėtas tikrasis registracijos procesas.

Funkcija valideMember() ( $valid = true; $errorMessage = array(); foreach ($_POST kaip $key => $value) ( ​​if (empty($_POST[$key])) ( $valid = false; ) ) if($valid == true) (if ($_POST["slaptažodis"] != $_POST["patvirtinti_slaptažodį"]) ( $errorMessage = "Slaptažodžiai turi būti vienodi."; $valid = false; ) if (! isset ($error_message)) (if (! filtras_var($_POST["vartotojo el. paštas"], FILTER_VALIDATE_EMAIL)) ( $errorMessage = "Neteisingas el. pašto adresas."; $valid = false; ) ) if (! isset($ error_message)) ( if (! isset($_POST["sąlygos"])) ( $errorMessage = "Sutinku su sąlygomis."; $valid = false; ) ) ) else ( $errorMessage = "Visi laukai privalomi." ; ) if ( $valid == false) ( return $errorMessage; ) return; )

PHP MySQL kodas prieigai prie duomenų bazės ir išsaugoti registruotą vartotoją

Serverio vartotojo formos patvirtinimas

Tai yra PHP įvesties taškas, skirtas tvarkyti visą serverio scenarijų, kad patvirtintų formą ir tvarkytų duomenų bazės operacijas pagal patvirtinimo rezultatą.

validateMember($vartotojo vardas, $displayName, $slaptažodis, $el. paštas); if (tuščias($errorMessage)) ( $memberCount = $nary->isMemberExists($naudotojo vardas, $el. paštas); if ($narių skaičius == 0) ( $insertId = $member->insertMemberRecord($naudotojo vardas, $displayName, $ slaptažodis, $el. paštas); if (! empty($insertId)) ( header("Vieta: ačiū.php"); ) ) else ( $errorMessage = "Vartotojas jau egzistuoja."; ) ) ) ?>

Patikrinkite, ar vartotojas jau egzistuoja

Funkcija isMemberExists() naudojama vartotojo duomenų unikalumui patikrinti pagal jų el. pašto adresą ir vartotojo vardą. Jei ten įvestas vartotojo vardas arba el. pašto adresas yra vartotojų duomenų bazėje, registracijos procesas bus sustabdytas grąžinus ir patvirtinus.

Šis patvirtinimas praneš, kad „vartotojas jau yra“. kodas yra,

Funkcija isMemberExists($naudotojo vardas, $el. paštas) ( $query = "select * FROM register_users WHERE vartotojo_vardas =? ARBA el.paštas =?"; $paramType = "ss"; $paramArray = masyvas($naudotojo vardas, $el. paštas); $naryCount = $this->ds->numRows($query, $paramType, $paramArray); grąžinti $memberCount; )

Įveskite nario duomenis į duomenų bazę

Jei jis grąžina 0, tai reiškia, kad tokių vartotojų su įvestu el. pašto adresu arba vartotojo vardu nėra. Taigi, registracijos duomenys bus įterpti į duomenų bazę. Šis kodas rodo nario įterpimo metodą.

Funkcija insertMemberRecord($naudotojo vardas, $displayName, $slaptažodis, $el. paštas) ( $passwordHash = md5($slaptažodis); $query = "INSERT INTO register_users (naudotojo_vardas, rodomas_vardas, slaptažodis, el. paštas) VERTYBĖS (?, ?, ?, ? )"; $paramType = "ssss"; $paramArray = masyvas($naudotojo vardas, $displayName, $passwordHash, $el. paštas); $insertId = $this->ds->insert($query, $paramType, $paramArray); grąžinti $insertId;)

DataSource.php

Tai yra bendroji PHP duomenų šaltinio klasė, skirta duomenų bazės operacijoms atlikti. Tai apima funkcijas, skirtas prijungti duomenų bazę ir vykdyti įvairias užklausas, kad būtų gautas duomenų bazės rezultatas, eilučių skaičius, vykdomas įterpimas ir dar daugiau.

Ši duomenų šaltinio klasė yra bendra ir yra kuo paprastesnė. Tai efektyvu ir naudoju jį daugumoje savo mikroprojektų ir vadovėlių. Galite nemokamai atsisiųsti ir naudoti.

svarbus dalykas niekada nepamirškite naudoti parengtų pareiškimų. Tai padeda apsisaugoti nuo SQL įpurškimo atakų ir yra pirmasis žingsnis siekiant užtikrinti saugumą žiniatinklio programoje.

conn = $this->getConnection(); ) /** * Jei reikia ryšio objekto, naudokite šį metodą ir gaukite prieigą prie jo. * Kitu atveju naudokite toliau nurodytus įterpimo / atnaujinimo ir tt metodus. * * @return \mysqli */ viešoji funkcija getConnection() ( $conn = naujas \mysqli(self::HOST, self::USERNAME, self::PASSWORD, self::DATABASENAME); if (mysqli_connect_errno()) ( trigger_error ("Problema jungiantis prie duomenų bazės."); ) $conn->set_charset("utf8"); grąžinti $conn; ) /** * Norėdami gauti duomenų bazės rezultatus * @param string $query * @param eilutė $paramType * @ param masyvas $paramArray * @return masyvas */ viešoji funkcija select($query, $paramType="", $paramArray=masyvas()) ( $stmt = $this->conn->prepare($query); if(! tuščias($paramType) && !empty($paramArray)) ( $this->bindQueryParams($sql, $paramType, $paramArray); ) $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) ( while ($row = $result->fetch_assoc()) ( $resultset = $row; ) ) if (! empty($resultset)) ( return $resultset; ) ) / ** * Norėdami įterpti * @param string $query * @param string $paramType * @param masyvas $paramArray * @return int */ viešosios funkcijos įterpimas($query, $paramType, $p aramArray) (spausdinti $query; $stmt = $this->conn->prepare($query); $this->bindQueryParams($stmt, $paramType, $paramArray); $stmt->vykdyti(); $insertId = $stmt->įterpimo_id; grąžinti $insertId; ) /** * Norėdami vykdyti užklausą * @param string $query * @param string $paramType * @param masyvas $paramArray */ viešoji funkcija execute($query, $paramType="", $paramArray=masyvas()) ( $ stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($stmt, $paramType="", $paramArray= masyvas()); ) $stmt->execute(); ) /** * 1. Parengia parametrų susiejimą * 2. Suriša prameters su sql sakiniu * @param string $stmt * @param string $paramType * @param masyvas $ paramArray */ viešoji funkcija bindQueryParams($stmt, $paramType, $paramArray=array()) ( $paramValueReference = & $paramType; for ($i = 0; $i< count($paramArray); $i ++) { $paramValueReference = & $paramArray[$i]; } call_user_func_array(array($stmt, "bind_param"), $paramValueReference); } /** * To get database results * @param string $query * @param string $paramType * @param array $paramArray * @return array */ public function numRows($query, $paramType="", $paramArray=array()) { $stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($stmt, $paramType, $paramArray); ) $stmt->execute(); $stmt->parduotuvė_rezultatas(); $įrašų skaičius = $stmt->eilių_skaičius; grąžinti $recordCount; ) )

Duomenų bazės scenarijus

Šiame duomenų bazės scenarijuje yra lentelės register_users kūrimo sakinys. Importuokite šį scenarijų į savo kūrimo aplinką, kad paleistumėte šį kodą.

Lentelės struktūra „registruoti_naudotojai“ – KURTI LENTELĘ, JEI NĖRA „registered_users“ („id“ int(8) NOT NULL AUTO_INCREMENT, „user_name“ varchar(255) NOT NULL, „first_name“ varchar(255) NOT pavardė" varchar(255) NOT NULL, "password" varchar(25) NOT NULL, "email" varchar(55) NOT NULL, "lytis" varchar(20) NOT NULL, PRIMARY KEY ("id"));

Jei registracijos formos patvirtinimas nepavyks, vartotojui bus rodomas klaidos pranešimas, kaip nurodyta toliau.

Komentarai „PHP vartotojo registracijos forma (registracija) naudojant MySQL duomenų bazę“

    Sveiki, Vincy, paleisdamas registro kodą gaunu šias klaidas, prašau padėti.

    INSERT Į registruotus_vartotojus (naudotojo_vardas, rodomas_vardas, slaptažodis, el. pašto adresas) VERTYBĖS (?, ?, ?, ?)
    Įspėjimas: call_user_func_array() tikisi, kad 1 parametras bus galiojantis atgalinis skambutis, pirmasis masyvo narys nėra galiojantis klasės pavadinimas arba objektas C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php 136 eilutėje

    Lemtinga klaida: nepastebėta klaida: iškvietimas į nario funkciją execute() loginiu režimu C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php:99 Stack trace: #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', ' [apsaugotas el. paštas]…“) Nr. 2 (pagrindinis) įmestas į C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php 99 eilutėje

Vartotojų registravimo ir autorizavimo svetainėje funkcija įgyvendinama taip: vartotojas užsiregistruodamas svetainėje užpildo registracijos formą, kurioje nurodo įvairius duomenis, įskaitant prisijungimo vardą ir slaptažodį. Forma siunčia šiuos duomenis į serverį ir jie įrašomi į duomenų bazę.

  1. Vartotojas autorizavimo formoje įveda prisijungimo vardą ir slaptažodį ir siunčia jį į serverį.
  2. Serveris patikrina, ar duomenų bazėje yra vartotojas su tuo pačiu vartotojo vardu ir slaptažodžiu.
  3. Jei vartotojas randamas, informacija apie tai įrašoma į sesiją arba slapukus.
  4. Svetainės puslapiuose atliekamas patikrinimas – ar sesijoje yra duomenų, kad vartotojas yra įgaliotas ir, priklausomai nuo to, puslapis rodomas viena ar kita forma.

Seanso metu galite ne tik nurodyti autorizacijos faktą, bet ir užsirašyti kai kuriuos vartotojo duomenis, kad jie būtų rodomi puslapyje, pavyzdžiui, vardą ar slapyvardį. Sprendimas, ar naudoti seansus ar slapukus, priimamas kiekvienoje svetainėje. Jei svetainėje yra svarbios informacijos, geriau naudoti seansus, nes daug sunkiau sužinoti kitų žmonių registracijos duomenis.

Autorizacijos ir registracijos formos

Įgaliojimo forma paprastai yra pagrindiniame puslapyje arba gali būti visuose svetainės puslapiuose. Registracijos formai iš esmės sukuriamas atskiras puslapis. Sukursime tik vieną puslapį, kuriame bus abi formos, o jame bus rodomi ir vartotojo duomenys. Kol kas jame bus tik HTML kodas, bet iš karto padarysime PHP failą, nes ateityje tai bus scenarijus. Pavadinkime tai formreg.php. Puslapio kodas bus toks:

formreg.php:

Registracija

Vartotojų registracijos duomenis įrašysime į vartotojų lentelę. Jei dar neturite tokios lentelės, sukurkite ją. Jame turėtų būti ID, prisijungimo ir paso laukai. Kitų laukų nenaudosime. Jei jie yra lentelėje, jie liks tušti.

registracija.php:

3
4
5
6
7
8
9
10

$login=$_POST["prisijungti"]; $pas=$_POST["slaptažodis"]; $db=mysqli_connect("localhost", "root", "", "mybase"); $query="INSERT INTO user (prisijungimas, pas) VERTYBĖS ("$login", "$pas")"; $rezultatas=mysqli_query($db, $klausa); if ($result) header("Vieta: formreg.php"); mysqli_close($db);

9 eilutėje nustatome grįžimą į formų puslapį. Kadangi scenarijaus vykdymas ir puslapio įkėlimas vietiniame serveryje vyksta labai greitai, vizualiai atrodys taip, lyg nieko neįvyktų paspaudus mygtuką „Registruotis“. Realiose svetainėse jie paprastai patenka į specialų puslapį, kuriame pateikiama informacija, kad vartotojas yra užsiregistravęs, ir registracijos duomenys. Pabandykite prisijungti ir pažiūrėkite, ar duomenų bazėje neatsiranda naujų įrašų.

Autorizacija

Įgaliojimo forma serveryje paleidžia failą authorization.php. Šis scenarijus paima vartotojo vardą ir slaptažodį ir patikrina, ar toks vartotojas yra. Jei taip, prisijungimas bus įrašytas seanso metu. Jei toks vartotojas nerastas, informacija apie tai bus įrašyta į sesiją. Tai būtina, kad puslapis, kuris bus atidarytas po scenarijaus vykdymo, gautų šią informaciją ir parodytų pranešimą, kad buvo įvestas neteisingas vartotojo vardas arba slaptažodis. Scenarijaus kodas yra toks:

Authorization.php:

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

session_start(); $login=$_POST["prisijungti"]; $pas=$_POST["slaptažodis"]; $db=mysqli_connect("localhost", "root", "", "mybase"); $query="SELECT * FROM user WHERE login="$login" AND BINARY pas="$pas""; $rezultatas=mysqli_query($db, $klausa); if (mysqli_num_rows($result)) $_SESSION["prisijungimas"]=$prisijungimas; else $_SESSION["prisijungti"]="ar prisijungti"; header("Vieta: formreg.php"); mysqli_close($db);

7 eilutėje formuojamas prašymas pasirinkti eilutę su prisijungimo vardu ir slaptažodžiu, gautu iš formos. Prieš lauką „pas“ rašomas raktinis žodis BINARY. Jis reikalingas, kad lyginant pagal šį lauką būtų atsižvelgta į simbolių raides. Jei norite, kad lyginant prisijungimą būtų atsižvelgta į atvejį, tai prieš jį turi būti parašytas DVEJNELIS. Pavyzdyje pateikiama užklausa pasirinkti visus laukus. Praktiškai galima pasirinkti tik tuos laukus, kurių duomenis reikės rodyti puslapyje.

Gavus rezultatą, patikrinama, ar nurodytas įrašas rastas. Jei yra įrašas, tada prisijungimas įrašomas į sesiją. Jei vartotojas nerastas, vietoj prisijungimo įrašoma eilutė "er login". Galite parašyti kitokį tekstą, bet turite būti tikri, kad jis nesutampa su tam tikru prisijungimu. Tada jis grįžta į formos puslapį.

Svetainės puslapiuose turi būti kodas, kuris patikrintų, ar sesijoje yra prisijungimas. Ir priklausomai nuo to, jis nustato, kaip turėtų atrodyti puslapis. Mūsų pavyzdyje yra tik vienas puslapis. Pažiūrėkime tai. Tik kodas bus padalintas į dvi dalis. Sesija turi būti atidaryta prieš išvedant bet kokius duomenis, ty prieš HTML kodą. Todėl ši dalis yra pačioje puslapio pradžioje. O likusi kodo dalis yra žymos viduje , nes jis prideda puslapio turinį. Pridėkite šią eilutę puslapio viršuje:

Jei sesija turi prisijungimo vardą, bet joje yra eilutė „er login“, tada rodomas pranešimas, kad prisijungimo vardas arba slaptažodis yra neteisingi. Parodžius pranešimą, prisijungimas tampa tuščias. Tai daroma taip, kad pranešimas būtų rodomas tik vieną kartą ir nepasirodytų perjungiant į kitus puslapius. Jei prisijungimas skiriasi, tada vartotojas yra autorizuojamas ir puslapis sugeneruojamas kaip registruotiems vartotojams. Jei prisijungimo nėra, vadinasi, leidimo dar nebuvo ir puslapis rodomas neregistruotiems vartotojams.

Atsižvelgėme tik į bendrą registracijos ir autorizacijos funkcijos sukūrimo principą. Realiose svetainėse tai sunkiau. Formos turėtų būti rodomos tik neįgaliotiems naudotojams. Be to, turite pridėti mygtuką „Išeiti“, kuris atšaukia autorizaciją. Registruojantis reikia atlikti formos patvirtinimą, patikrinti prisijungimo unikalumą ir pridėti slaptažodžio patvirtinimą.

Šiandien apžvelgsime kritinio 1 dienos pažeidžiamumo išnaudojimą populiarioje Joomla TVS, kuri internete sprogo spalio pabaigoje. Apie pažeidžiamumą kalbėsime su skaičiais CVE-2016-8869, CVE-2016-8870 Ir CVE-2016-9081. Visi trys yra iš to paties kodo, kuris penkerius ilgus metus gulėjo sistemos viduje ir laukė, kol išsilaisvins ir atneš chaosą, įsilaužtas svetaines ir nekaltų šios Joomla vartotojų ašaras. Tik patys narsiausi ir drąsiausi kūrėjai, kurių akys raudonuoja nuo monitorių šviesos, o klaviatūros nusėtas duonos trupiniais, sugebėjo mesti iššūkį siautėjančioms piktosioms dvasioms ir padėti galvą ant pataisymų altoriaus.

ĮSPĖJIMAS

Visa informacija pateikiama tik informaciniais tikslais. Nei redaktoriai, nei autorius neatsako už bet kokią galimą žalą, padarytą dėl šio straipsnio medžiagos.

Kaip viskas prasidėjo

2016 m. spalio 6 d. Demis Palma sukūrė temą Stack Exchange, kurioje paklausė: kodėl iš tikrųjų Joomla 3.6 versijoje yra du būdai registruoti vartotojus su tuo pačiu vardu register() ? Pirmasis yra UsersControllerRegistration valdiklyje, o antrasis yra UsersControllerUser. Damis norėjo sužinoti, ar kažkur naudojamas UsersControllerUser::register() metodas, ar tai tik evoliucinis anachronizmas, likęs iš senosios logikos. Jis buvo susirūpinęs dėl to, kad net jei šio metodo nenaudoja joks vaizdas, jį vis tiek galima iškviesti su sugeneruota užklausa. Į kurį gavau atsakymą iš kūrėjo slapyvardžiu itoctopus, kuris patvirtino, kad problema tikrai egzistuoja. Ir išsiuntė ataskaitą Joomla kūrėjams.

Kiti įvykiai vystėsi greičiausiai. Spalio 18 d. Joomla kūrėjai priima ataskaitą iš Damis, kuris iki to laiko buvo parengęs PoC, leidžiantį registruotis vartotoją. Savo svetainėje jis paskelbė pastabą, kurioje bendrai papasakojo apie rastą problemą ir savo mintis apie ją. Tą pačią dieną išleidžiama nauja Joomla 3.6.3 versija, kurioje vis dar yra pažeidžiamas kodas.

Po to Davide'as Tampellini klaidą įveda į būseną, kurioje registruojamas ne paprastas vartotojas, o administratorius. O jau spalio 21 dieną Joomla apsaugos komandą pasiekia naujas atvejis. Jau kalbama apie privilegijų eskalavimą. Tą pačią dieną Joomla svetainėje pasirodo pranešimas, kad antradienį, spalio 25 d., bus išleista kita versija su serijos numeriu 3.6.3, kuri pašalina kritinį sistemos branduolio pažeidžiamumą.

Spalio 25 d. Joomla Security Strike Team nustato naujausią problemą, kurią sukūrė Damiso aptikta kodo dalis. Tada spalio 21 d. įsipareigojimas nepastebimu pavadinimu Prepare 3.6.4 Stable Release perkeliamas į pagrindinę oficialios Joomla saugyklos šaką, kuri ištaiso apgailėtiną klaidą.

Po šio pasirodymo daugybė suinteresuotų asmenų prisijungia prie kūrėjų sumaišties - jie pradeda sukti pažeidžiamumą ir ruošti šlaitus.

Spalio 27 d. mokslininkas Harry Robertsas įkelia paruoštą išnaudojimą į „Xiphos Research“ saugyklą, galinčią įkelti PHP failą į serverį su pažeidžiama TVS.

Detalės

Ką gi, priešistorė baigėsi, pereikime prie įdomiausio – pažeidžiamumo analizės. Kaip eksperimentinę versiją įdiegiau Joomla 3.6.3, todėl visi eilučių numeriai bus svarbūs šiai versijai. Ir visi keliai į failus, kuriuos pamatysite toliau, bus nurodyti, palyginti su įdiegtos TVS šaknimis.

Damis Palmos atradimo dėka žinome, kad yra du būdai, kurie atlieka vartotojo registraciją sistemoje. Pirmąjį naudoja TVS ir jis yra /components/com_users/controllers/registration.php:108 faile. Antrasis (kurį turime vadinti) yra /components/com_users/controllers/user.php:293. Pažvelkime į tai atidžiau.

286: /** 287: * Vartotojo registravimo būdas. 288: * 289: * @return loginis 290: * 291: * @nuo 1.6 292: */ 293: viešosios funkcijos registras() 294: ( 295: JSession::checkToken("post") arba jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Gaukite formos duomenis. 301: $duomenys = $this->input->post->get("vartotojas", masyvas(), "masyvas"); . .. 315: $return = $modelis->patvirtinti($forma, $duomenys); 316: 317: // Patikrinkite, ar nėra klaidų 318: if ($return === false) 319: ( ... 345: / / Užbaikite registraciją.346: $return = $modelis->registras($duomenys);

Čia palikau tik įdomias eilutes. Visą pažeidžiamo metodo versiją galima peržiūrėti Joomla saugykloje.

Išsiaiškinkime, kas vyksta įprasto vartotojo registracijos metu: kokie duomenys siunčiami ir kaip jie apdorojami. Jei nustatymuose įjungta vartotojo registracija, formą galite rasti adresu http://joomla.local/index.php/component/users/?view=registration .


Teisėta vartotojo registracijos užklausa atrodo taip, kaip šioje ekrano kopijoje.


Komponentas com_users yra atsakingas už darbą su vartotojais. Atkreipkite dėmesį į užduoties parametrą užklausoje. Jis turi formatą $controller.$method . Pažiūrėkime į failo struktūrą.

Scenarijų pavadinimai aplanke valdikliai sutampa su iškviestų valdiklių pavadinimais. Kadangi mūsų užklausoje dabar yra $controller = "registration" , failas bus iškviestas registracija.php ir jo registras() metodas.

Dėmesio, kyla klausimas: kaip perkelti registracijos apdorojimą į pažeidžiamą kodo vietą? Tikriausiai jau atspėjote. Pažeidžiamų ir realių metodų pavadinimai yra vienodi (registras), todėl tereikia pakeisti iškviesto valdiklio pavadinimą. O kur pažeidžiamas kontrolierius? Teisingai, byloje user.php. Pasirodo $controller = "vartotojas" . Viską sudėjus, gauname task = user.register . Dabar registracijos užklausa apdorojama tokiu būdu, kurio mums reikia.


Antras dalykas, kurį turime padaryti, yra siųsti duomenis tinkamu formatu. Čia viskas paprasta. Legitimate register() tikisi iš mūsų masyvo, vadinamo jform , kuriame perduodame duomenis registracijai – vardą, prisijungimo vardą, slaptažodį, paštą (žr. ekrano kopiją su užklausa).

  • /components/com_users/controllers/registration.php: 124: // Gaukite vartotojo duomenis. 125: $requestData = $this->input->post->get("jform", array(), "masyvas");

Mūsų vaikas šiuos duomenis gauna iš masyvo, pavadinto vartotojas .

  • /components/com_users/controllers/user.php: 301: // Gaukite formos duomenis. 302: $duomenys = $this->input->post->get("vartotojas", masyvas(), "masyvas");

Todėl visų užklausoje esančių parametrų pavadinimus keičiame iš jfrom į user .

Trečias žingsnis yra rasti tinkamą CSRF prieigos raktą, nes be jo nebus registracija.

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

Tai atrodo kaip MD5 maiša, kurią galite paimti, pavyzdžiui, iš autorizacijos formos svetainėje /index.php/component/users/?view=login .


Dabar galite sukurti vartotojus norimu būdu. Jei viskas pavyko, sveikiname – jūs tiesiog išnaudojote pažeidžiamumą CVE-2016-8870„Trūksta naujų vartotojų registravimo leidimo patikros“.

Štai kaip atrodo „Working“ register() metodas iš UsersControllerRegistration valdiklio:

  • /components/com_users/controllers/registration.php: 113: // Jei registracija išjungta - Peradresuoti į prisijungimo puslapį. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= prisijungimas", klaidinga)); 117: 118: grąžinti klaidingą; 119: )

Ir taip pažeidžiamuose:

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

Taip, jokiu būdu.

Kad suprastume antrąją, daug rimtesnę problemą, išsiųsime mūsų suformuotą užklausą ir pažiūrėkime, kaip ji vykdoma įvairiose kodo dalyse. Štai dalis, atsakinga už vartotojo pateiktų duomenų patvirtinimą darbuotojo metodu:

Ir toliau prieinama tik nariams

1 variantas. Prisijunkite prie „svetainės“ bendruomenės ir perskaitykite visą svetainėje esančią medžiagą

Narystė bendruomenėje nurodytu laikotarpiu suteiks prieigą prie VISOS „Hacker“ medžiagos, padidins asmeninę kaupiamąją nuolaidą ir leis kaupti profesionalų „Xakep Score“ įvertinimą!

Sukurti narystę pagrįstą svetainę iš pradžių atrodo nelengva užduotis. Jei kada nors norėjote tai padaryti patys, tada tiesiog atsisakėte, kai pradėjote galvoti, kaip tai padaryti naudodami savo PHP įgūdžius, šis straipsnis skirtas jums. Mes paaiškinsime visus narystės pagrindu sukurtos svetainės su saugia narių zona, apsaugota slaptažodžiu, kūrimo aspektus.

Visas procesas susideda iš dviejų didelių dalių: vartotojo registracijos ir vartotojo autentifikavimo. Pirmoje dalyje aptarsime registracijos formos kūrimą ir duomenų saugojimą MySQL duomenų bazėje. Antroje dalyje sukursime prisijungimo formą ir naudosime ją, kad leistume vartotojams patekti į saugią sritį.

Atsisiųskite kodą

Visą registracijos/prisijungimo sistemos šaltinio kodą galite atsisiųsti iš toliau pateiktos nuorodos:

Konfigūracija ir įkėlimas
„ReadMe“ faile yra išsamios instrukcijos.

Atidaryk šaltinis\include\membersite_config.php failą teksto rengyklėje ir atnaujinkite konfigūraciją. (Prisijungimas prie duomenų bazės, svetainės pavadinimas, el. pašto adresas ir kt.).

Įkelkite visą katalogo turinį. Išbandykite register.php pateikdami formą.

Registracijos forma

Norėdami sukurti vartotojo paskyrą, turime surinkti minimalų kiekį informacijos iš vartotojo. Mums reikia jo vardo, el. pašto adreso ir norimo vartotojo vardo bei slaptažodžio. Žinoma, šiuo metu galime paprašyti daugiau informacijos, tačiau ilga forma visada yra išjungimas. Taigi apsiribokime tik tomis sritimis.

Čia yra registracijos forma:

Registruotis

Taigi, turime vardo, el. pašto ir slaptažodžio teksto laukus. Atminkite, kad naudojame geresniam naudojimui.

Formos patvirtinimas

Šiuo metu yra gera idėja įdėti tam tikrą patvirtinimo kodą, todėl įsitikiname, kad turime visus duomenis, reikalingus vartotojo paskyrai sukurti. Turime patikrinti, ar įvesti vardas, el. pašto adresas ir slaptažodis ir ar el. laiškas yra tinkamo formato.

Formos pateikimo tvarkymas

Dabar turime tvarkyti pateiktus formos duomenis.

Štai seka (žr. failą fg_membersite.php atsisiųstame šaltinyje):

function RegisterUser() ( if(!isset($_POST["pateikta"])) ( return false; ) $formvars = array(); if(!$this->ValidateRegistrationSubmission()) ( return false; ) $this- >CollectRegistrationSubmission($formvars); if(!$this->SaveToDatabase($formvars)) ( return false; ) if(!$this->SendUserConfirmationEmail($formvars)) ( return false; ) $this->SendAdminIntimationEmail($ formvars); grąžinti true;)

Pirmiausia patvirtiname formos pateikimą. Tada renkame ir „išvalome“ formos pateikimo duomenis (visada darykite tai prieš siųsdami el. laišką, išsaugodami duomenų bazėje ir pan.). Tada formos pateikimas išsaugomas duomenų bazės lentelėje. Mes siunčiame vartotojui el. laišką su prašymu patvirtinti. Tada informuojame administratorių, kad vartotojas užsiregistravo.

Duomenų išsaugojimas duomenų bazėje

Dabar, kai surinkome visus duomenis, turime juos saugoti duomenų bazėje.
Štai kaip išsaugome formos pateikimą duomenų bazėje.

function SaveToDatabase(&$formvars) ( if(!$this->DBLogin()) ( $this->HandleError("Prisijungti prie duomenų bazės nepavyko!"); return false; ) if(!$this->Užtikrinamas()) ( return false; ) if(!$this->IsFieldUnique($formvars,"el. paštas")) ( $this->HandleError("Šis el. laiškas jau užregistruotas"); return false; ) if(!$this->IsFieldUnique( $formvars,"naudotojo vardas")) ( $this->HandleError("Šis vartotojo vardas jau naudojamas. Pabandykite kitą vartotojo vardą"); return false; ) if(!$this->InsertIntoDB($formvars)) ( $this- >HandleError("Įterpimas į duomenų bazę nepavyko!"); return false; ) return true; )

Atminkite, kad sukonfigūravote prisijungimo prie duomenų bazės informaciją faile memberite_config.php. Daugeliu atvejų duomenų bazės prieglobai galite naudoti „localhost“.
Prisijungę įsitikiname, kad lentelė yra.(Jei ne, scenarijus sukurs reikiamą lentelę).
Tada įsitikiname, kad vartotojo vardas ir el. pašto adresas yra unikalūs. Jei ji nėra unikali, vartotojui grąžiname klaidą.

Duomenų bazės lentelės struktūra

Tai yra lentelės struktūra. Fg_membersite.php failo funkcija CreateTable() sukuria lentelę. Štai kodas:

function CreateTable() ( $qry = "Sukurti lentelę $this->lentelės pavadinimas (". "id_user INT NOT NULL AUTO_INCREMENT ,". "vardas VARCHAR(128) NOT NULL ,". "El. paštas VARCHAR(64) NOT NULL ,". "telefono_numeris VARCHAR(16) NOT NULL ,". "vartotojo vardas VARCHAR(16) NOT NULL ,". "slaptažodis VARCHAR(32) NOT NULL ". "patvirtinti kodą VARCHAR(32) ,". "PAGRINDINIS RAKTAS (id_user)". ")"; if(!mysql_query($qry,$this->connection)) ( $this->HandleDBERror("Klaida kuriant lentelę \nužklausa buvo\n $qry"); return false; ) return true; )

Lauke id_user bus nurodytas unikalus vartotojo ID, jis taip pat yra pagrindinis lentelės raktas. Atkreipkite dėmesį, kad slaptažodžio lauke leidžiame 32 simbolius. Tai darome, nes kaip papildomą saugumo priemonę saugosime slaptažodį duomenų bazėje, užšifruotoje naudojant MD5. Atminkite, kad kadangi MD5 yra vienpusis šifravimo metodas, negalėsime atkurti slaptažodžio, jei vartotojas jį pamirš.

Registracijos įterpimas į lentelę

Čia yra kodas, kurį naudojame duomenims į duomenų bazę įterpti. Visus duomenis turėsime $formvars masyve.

function InsertIntoDB(&$formvars) ( $confirmcode = $this->MakeConfirmationMd5($formvars["el. paštas"]); $insert_query = "įterpti į ".$this->lentelės pavadinimas."(vardas, el. pašto adresas, vartotojo vardas, slaptažodis, patvirtinimo kodas) reikšmės ​​("" . $this->SanitizeForSQL($formvars["pavadinimas"]) . "", "" . $this->SanitizeForSQL($formvars["el. paštas"]) . "", "" . $ this->SanitizeForSQL($formvars["naudotojo vardas"]) . "", "" . md5($formvars["slaptažodis"]) . "", "" . $confirmcode . "")"; if(! mysql_query( $insert_query ,$this->connection)) ( $this->HandleDBError("Klaida įterpiant duomenis į lentelę\nquery:$insert_query"); return false; ) return true; )

Atkreipkite dėmesį, kad mes naudojame PHP funkciją md5() slaptažodžiui užšifruoti prieš įterpdami jį į duomenų bazę.
Be to, iš vartotojo el. pašto adreso sukuriame unikalų patvirtinimo kodą.

Laiškų siuntimas

Dabar, kai turime registraciją savo duomenų bazėje, vartotojui išsiųsime patvirtinimo el. laišką. Vartotojas turi spustelėti nuorodą patvirtinimo el. laiške, kad užbaigtų registracijos procesą.

function SendUserConfirmationEmail(&$formvars) ( $mailer = new PHPMailer(); $mailer->CharSet = "utf-8"; $mailer->AddAddress($formvars["el. paštas"],$formvars["vardas"]) ; $mailer->Subject = "Jūsų registracija su ".$this->sitename; $mailer->From = $this->GetFromAddress(); $confirmcode = urlencode($this->MakeConfirmationMd5($formvars["el. paštas") ])); $confirm_url = $this->GetAbsoluteURLFolder()."/confirmreg.php?code=".$confirmcode; $mailer->Body ="Sveiki ".$formvars["vardas"]."\r\ n\r\n". "Dėkojame, kad užsiregistravote su ".$this->sitename."\r\n". "Spustelėkite žemiau esančią nuorodą, kad patvirtintumėte savo registraciją.\r\n". "$confirm_url\r \n". "\r\n". "Pagarbiai,\r\n". "Žiniatinklio valdytojas\r\n". $this->sitename; if(!$mailer->Send()) ( $this-> HandleError("Nepavyko išsiųsti registracijos patvirtinimo el. laiško."); return false; ) return true; )

atnaujinimus

2012 m. sausio 9 d
Pridedamos slaptažodžio nustatymo iš naujo / slaptažodžio keitimo funkcijos
Kodas dabar bendrinamas GitHub .

Sveikas sugrįžęsUserFullName(); ?>!

Licencija


Kodas bendrinamas pagal LGPL licenciją. Jį galite laisvai naudoti komercinėse arba nekomercinėse svetainėse.

Nėra susijusių įrašų.

Šio įrašo komentarai uždaryti.