Mājas Bērnu zobārstniecība Vadītāja reģistrācija php. Vienkārša lietotāju reģistrācijas sistēma

Vadītāja reģistrācija php. Vienkārša lietotāju reģistrācijas sistēma

Uz dalību balstītas vietnes izveide sākotnēji šķiet biedējošs uzdevums. Ja kādreiz vēlējāties to izdarīt pats, tad vienkārši padevāties, kad sākāt domāt, kā to izveidot kopā, izmantojot savas PHP prasmes, tad šis raksts ir paredzēts jums. Mēs iepazīstināsim jūs ar katru dalības vietnes izveides aspektu ar drošu dalībnieku apgabalu, kas aizsargāts ar paroli.

Viss process sastāv no divām lielām daļām: lietotāja reģistrācijas un lietotāja autentifikācijas. Pirmajā daļā mēs apskatīsim reģistrācijas veidlapas izveidi un datu glabāšanu MySQL datu bāzē. Otrajā daļā mēs izveidosim pieteikšanās veidlapu un izmantosim to, lai ļautu lietotājiem piekļūt drošajā zonā.

Lejupielādējiet kodu

Visu reģistrācijas/pieteikšanās sistēmas avota kodu varat lejupielādēt no tālāk esošās saites:

Konfigurācija un augšupielāde
ReadMe failā ir ietverti detalizēti norādījumi.

Atveriet avots\include\membersite_config.php failu teksta redaktorā un atjauniniet konfigurāciju. (Pieteikšanās datu bāzē, jūsu vietnes nosaukums, jūsu e-pasta adrese utt.).

Augšupielādējiet visu direktorijas saturu. Pārbaudi register.php, iesniedzot veidlapu.

Reģistrācijas veidlapa

Lai izveidotu lietotāja kontu, mums ir jāievāc minimāls informācijas apjoms no lietotāja. Mums ir nepieciešams viņa vārds, e-pasta adrese un vēlamais lietotājvārds un parole. Protams, šajā brīdī mēs varam lūgt vairāk informācijas, taču garā forma vienmēr ir izslēgšana. Tāpēc aprobežosimies tikai ar šīm jomām.

Šeit ir reģistrācijas forma:

Reģistrēties

Tātad, mums ir teksta lauki vārdam, e-pastam un parolei. Ņemiet vērā, ka mēs izmantojam labākai lietojamībai.

Veidlapas apstiprināšana

Šajā brīdī ir ieteicams ievietot veidlapas validācijas kodu, tāpēc mēs pārliecināmies, ka mums ir visi lietotāja konta izveidei nepieciešamie dati. Mums ir jāpārbauda, ​​vai vārds, e-pasts un parole ir ievadīti un vai e-pasts ir pareizā formātā.

Veidlapas iesniegšanas apstrāde

Tagad mums ir jāapstrādā iesniegtie veidlapas dati.

Šeit ir norādīta secība (skatiet failu fg_membersite.php lejupielādētajā avotā):

function RegisterUser() ( if(!isset($_POST["iesniegts"])) (atgriež false; ) $formvars = array(); if(!$this->ValidateRegistrationSubmission()) (atgriež false; ) $this- >CollectRegistrationSubmission($formvars); if(!$this->SaveToDatabase($formvars)) ( return false; ) if(!$this->SendUserConfirmationEmail($formvars)) ( return false; ) $this->SendAdminIntimationEmail($) formvars);

Pirmkārt, mēs apstiprinām veidlapas iesniegšanu. Pēc tam mēs apkopojam un “dezinficējam” veidlapas iesniegšanas datus (vienmēr dariet to pirms e-pasta sūtīšanas, saglabāšanas datu bāzē utt.). Pēc tam veidlapas iesniegšana tiek saglabāta datu bāzes tabulā. Mēs nosūtām lietotājam e-pastu ar pieprasījumu apstiprinājumu. Pēc tam mēs paziņojam administratoram, ka lietotājs ir reģistrējies.

Datu saglabāšana datu bāzē

Tagad, kad esam apkopojuši visus datus, mums tie ir jāsaglabā datu bāzē.
Lūk, kā mēs saglabājam veidlapas iesniegšanu datu bāzē.

function SaveToDatabase(&$formvars) ( if(!$this->DBLogin()) ( $this->HandleError("Pieteikšanās datu bāzē neizdevās!"); return false; ) if(!$this->Nodrošināms()) ( return false $formvars,"lietotājvārds")) ( $this->HandleError("Šis lietotājvārds jau ir izmantots. Lūdzu, mēģiniet citu lietotājvārdu"); return false; ) if(!$this->InsertIntoDB($formvars)) ( $this- >HandleError("Ievietošana datu bāzē neizdevās!" return false;

Ņemiet vērā, ka esat konfigurējis datu bāzes pieteikšanās informāciju failā membersite_config.php. Vairumā gadījumu datu bāzes resursdatoram varat izmantot “localhost”.
Pēc pieteikšanās pārliecināmies, ka tabula eksistē.(Ja nē, skripts izveidos nepieciešamo tabulu).
Pēc tam mēs pārliecināmies, ka lietotājvārds un e-pasts ir unikāli. Ja tā nav unikāla, mēs atgriežam kļūdu lietotājam.

Datu bāzes tabulas struktūra

Šī ir tabulas struktūra. Funkcija CreateTable() failā fg_membersite.php izveido tabulu. Šeit ir kods:

function CreateTable() ( $qry = "Izveidot tabulu $this->tablename (". "id_user INT NOT NULL AUTO_INCREMENT", "nosaukums VARCHAR(128) NOT NULL", "e-pasts VARCHAR(64) NOT NULL", " "tālruņa_numurs VARCHAR(16) NOT NULL," "lietotājvārds VARCHAR(16) NOT NULL", "parole VARCHAR(32) NOT NULL", "apstiprināt kodu VARCHAR(32)", " ")" if(!mysql_query($qry,$). this->connection)) ( $this->HandleDBError("Kļūda veidojot tabulu \nvaicājums bija\n $qry"); return false; ) return true )

Laukā id_user būs unikāls lietotāja ID, un tas ir arī tabulas primārā atslēga. Ņemiet vērā, ka paroles laukā ir atļauts izmantot 32 rakstzīmes. Mēs to darām, jo ​​kā papildu drošības pasākums mēs saglabāsim paroli datubāzē, kas šifrēta, izmantojot MD5. Lūdzu, ņemiet vērā: tā kā MD5 ir vienvirziena šifrēšanas metode, mēs nevarēsim atgūt paroli, ja lietotājs to aizmirsīs.

Reģistrācijas ievietošana tabulā

Šeit ir kods, ko izmantojam datu ievietošanai datu bāzē. Visi mūsu dati būs pieejami masīvā $formvars.

function InsertIntoDB(&$formvars) ( $confirmcode = $this->MakeConfirmationMd5($formvars["email"]); $insert_query = "ievietojiet ".$this->tablename."(vārds, e-pasts, lietotājvārds, parole, apstiprinājuma kods) vērtības ​​("" . $this->SanitizeForSQL($formvars["nosaukums"]) . "", "" . $this->SanitizeForSQL($formvars["e-pasts"]) . "", "" $ this-> SanitizeForSQL($formvars["lietotājvārds"]) $insert_query ,$this->connection)) ( $this->HandleDBError("Kļūda, ievietojot datus tabulā\nquery:$insert_query"); return false; ) return true )

Ņemiet vērā, ka mēs izmantojam PHP funkciju md5(), lai šifrētu paroli pirms tās ievietošanas datu bāzē.
Mēs arī izveidojam unikālo apstiprinājuma kodu no lietotāja e-pasta adreses.

E-pastu sūtīšana

Tagad, kad esam reģistrējušies mūsu datubāzē, mēs lietotājam nosūtīsim apstiprinājuma e-pastu. Lai pabeigtu reģistrācijas procesu, lietotājam ir jānoklikšķina uz saites apstiprinājuma e-pastā.

function SendUserConfirmationEmail(&$formvars) ( $mailer = new PHPMailer(); $mailer->CharSet = "utf-8"; $mailer->AddAddress($formvars["email"],$formvars["nosaukums"]) ; $mailer->Subject = "Jūsu reģistrācija ar ".$this->sitename"; ])); $confirm_url = $this->GetAbsoluteURLFolder()."/confirmreg.php?code=".$confirmcode" n\r\n". "Paldies, ka reģistrējāties vietnē ".$this->sitename."\r\n". "Lūdzu, noklikšķiniet uz tālāk esošās saites, lai apstiprinātu reģistrāciju.\r\n." "$confirm_url\r \n". "\r\n". "Ar cieņu\r\n". "Tīmekļa pārzinis\r\n". $this->sitename; if(!$mailer->Send()) ( $this-> HandleError ("Neizdevās nosūtīt reģistrācijas apstiprinājuma e-pastu." return false);

Atjauninājumi

2012. gada 9. janvāris
Ir pievienotas paroles atiestatīšanas/paroles maiņas funkcijas
Kods tagad tiek kopīgots vietnē GitHub.

Laipni lūdzam atpakaļUserFullName(); ?>!

Licence


Kods tiek koplietots saskaņā ar LGPL licenci. Varat to brīvi izmantot komerciālās vai nekomerciālās vietnēs.

Nav saistītu ziņu.

Komentāri par šo ierakstu ir slēgti.

Lai sadalītu vietnes apmeklētājus noteiktās grupās, vietnē ir jāuzstāda neliela sistēma reģistrācija php. Tādā veidā jūs nosacīti sadalāt apmeklētājus divās vienkārši nejaušu apmeklētāju grupās un priviliģētākā lietotāju grupā, kuriem sniedzat vērtīgāku informāciju.

Vairumā gadījumu tiek izmantota vienkāršotāka reģistrācijas sistēma, kas tiek ierakstīta php vienā failā register.php.

Tātad, mēs esam nedaudz novirzījušies, un tagad mēs sīkāk apskatīsim reģistrācijas failu.

Register.php fails

Lai tas neaizņemtu daudz jūsu laika, mēs izveidosim sistēmu, kas apkopos lietotājus, pieņemot no tiem minimālu kontaktinformāciju. IN šajā gadījumā Mēs visu ievadīsim mysql datu bāzē. Vislielākajam datu bāzes ātrumam mēs izveidosim lietotāju tabulu MyISAM formātā un utf-8 kodējumā.

Piezīme! Visiem skriptiem vienmēr jābūt rakstītiem vienā un tajā pašā kodējumā. Visiem vietnes failiem un MySql datu bāzei jābūt vienā kodējumā. Visizplatītākie kodējumi ir UTF-8 un Windows-1251.

Kāpēc jums viss jāraksta vienā kodējumā, par to mēs runāsim vēlāk. Pagaidām ņemiet šo informāciju par stingru skriptu izveides noteikumu, pretējā gadījumā jums būs problēmas ar skriptiem nākotnē. Protams, tas ir labi, taču jūs vienkārši zaudēsit daudz laika, meklējot kļūdas skriptā.

Kā darbosies pats skripts?

Mēs vēlamies visu vienkāršot un iegūt ātrus rezultātus. Tādēļ no lietotājiem saņemsim tikai pieteikumvārdu, e-pastu un paroli. Un, lai aizsargātu pret surogātpasta robotiem, mēs uzstādīsim nelielu captcha. Pretējā gadījumā kāds zēns no Londonas uzrakstīs mazu robotu parsētāju, kas dažu minūšu laikā piepildīs visu datubāzi ar viltus lietotājiem, un priecāsies par savu ģenialitāti un nesodāmību.

Šeit ir pats skripts. Viss ir ierakstīts vienā failā register.php:

! `; // sarkana jautājuma zīme $sha=$sh."scripts/pro/"; //ceļš uz galveno mapi $bg=` bgcolor="#E1FFEB"`; // rindu fona krāsa?> Reģistrācijas skripta piemērs register.php style.css" />

Šajā gadījumā skripts attiecas uz sevi. Un tā ir forma un veidlapā ievadīto datu apstrādātājs. Lūdzu, ņemiet vērā, ka fails ir saspiests kā zip arhīvs un satur konfigurācijas failu config.php, lietotāju datu bāzes izdruku, failu, kas satur palīgfunkcijas functions.php, stila failu style.css un pašu failu register.php. Ir arī vairāki faili, kas ir atbildīgi par captcha simbolu darbību un ģenerēšanu.

Sveiki! Tagad mēs mēģināsim ieviest vienkāršāko reģistrāciju vietnē ar izmantojot PHP+ MySQL. Lai to izdarītu, datorā ir jāinstalē Apache. Mūsu skripta darbības princips ir parādīts zemāk.

1. Sāksim ar lietotāju tabulas izveidi datu bāzē. Tajā būs lietotāja dati (pieteikšanās vārds un parole). Dodieties uz phpmyadmin (ja veidojat datu bāzi savā datorā http://localhost/phpmyadmin/). Izveidojiet tabulu lietotājiem, tajā būs 3 lauki.

Es veidoju to mysql datu bāzē, jūs varat izveidot citā datu bāzē. Pēc tam iestatiet vērtības, kā parādīts attēlā:

2. Nepieciešams savienojums ar šo tabulu. Izveidosim failu bd.php. Tās saturs:

$db = mysql_connect("jūsu MySQL serveris","pieteikšanās šim serverim","šī servera parole");
mysql_select_db ("tās datu bāzes nosaukums, ar kuru mēs izveidojam savienojumu", $ db);
?>

Manā gadījumā tas izskatās šādi:

$db = mysql_connect("localhost","lietotājs","1234");
mysql_select_db("mysql",$db);
?>

Saglabāt bd.php.
Lieliski! Mums datu bāzē ir tabula un savienojums ar to. Tagad varat sākt veidot lapu, kurā lietotāji atstās savus datus.

3. Izveidojiet reg.php failu ar saturu (visi komentāri iekšā):



Reģistrācija


Reģistrācija


















4. Izveidojiet failu, kas ievadīs datus datu bāzē un saglabās lietotāju. save_user.php(iekšpusē komentāri):



{
}
//ja ir ievadīts pieteikumvārds un parole, mēs tos apstrādājam, lai tagi un skripti nedarbotos, jūs nekad nezināt, ko cilvēki var ievadīt


//noņemiet papildu atstarpes
$pieteikšanās = trim($login);
$parole = trim($parole);
// izveidot savienojumu ar datu bāzi
// pārbaudiet, vai nav lietotāja ar tādu pašu pieteikumvārdu
$result = mysql_query("SELECT id FROM users WHERE login="$login"",$db);
if (!empty($myrow["id"])) (
exit("Atvainojiet, ievadītais pieteikšanās vārds jau ir reģistrēts. Lūdzu, ievadiet citu pieteikumvārdu.");
}
// ja tas tā nav, tad saglabājiet datus
$result2 = mysql_query("INSERT INTO lietotājiem (pieteikšanās, parole) VALUES("$pieteikšanās","$parole")");
// Pārbaudiet, vai nav kļūdu
ja ($rezultāts2=="TRUE")
{
echo "Jūs esat veiksmīgi reģistrējies! Tagad varat iekļūt vietnē. Mājas lapa";
}
cits(
echo "Kļūda! Jūs neesat reģistrējies.";
}
?>

5. Tagad mūsu lietotāji var reģistrēties! Tālāk jums ir jāizveido “durvis”, lai jau reģistrētie lietotāji varētu iekļūt vietnē. indekss.php(iekšpusē komentāri):

// visa procedūra darbojas sesijās. Tajā tiek glabāti lietotāja dati, kamēr viņš atrodas vietnē. Ir ļoti svarīgi tos palaist pašā lapas sākumā!!!
session_start();
?>


Mājas lapa


Mājas lapa











Reģistrēties



// Pārbaudiet, vai pieteikšanās un lietotāja ID mainīgie ir tukši
ja (tukšs($_SESSION["pieteikšanās"]) vai tukšs($_SESSION["id"]))
{
// Ja tukšs, tad saiti nerādījam
atbalss "Jūs esat pieteicies kā viesis
Šī saite ir pieejama tikai reģistrētiem lietotājiem”;
}
cits
{

Failā indekss.php Mēs parādīsim saiti, kas būs atvērta tikai reģistrētiem lietotājiem. Šī ir visa skripta būtība - ierobežot piekļuvi jebkuriem datiem.

6. Paliek fails ar ievadītā pieteikumvārda un paroles pārbaudi. testreg.php (iekšpusē komentāri):

session_start();// visa procedūra darbojas uz sesijām. Tajā tiek glabāti lietotāja dati, kamēr viņš atrodas vietnē. Ir ļoti svarīgi tos palaist pašā lapas sākumā!!!
if (isset($_POST["pieteikšanās"])) ( $login = $_POST["pieteikšanās"]; if ($login == "") ( unset($login);) ) //ievadiet ievadīto pieteikumvārdu lietotājam $login mainīgajā, ja tas ir tukšs, tad iznīciniet mainīgo
if (isset($_POST["parole"])) ( $password=$_POST["parole"]; if ($password =="") ( unset($password);) )
//ievietojiet lietotāja ievadīto paroli mainīgajā $password, ja tas ir tukšs, tad iznīciniet mainīgo
if (empty($login) or empty($password)) //ja lietotājs nav ievadījis pieteikumvārdu vai paroli, tad izdodam kļūdu un apturam skriptu
{
exit("Jūs neesat ievadījis visu informāciju, dodieties atpakaļ un aizpildiet visus laukus!");
}
//ja ir ievadīts pieteikumvārds un parole, mēs tos apstrādājam, lai tagi un skripti nedarbotos, jūs nekad nezināt, ko cilvēki var ievadīt
$login = stripslashes($login);
$login = htmlspecialchars($login);
$parole = strīpas($parole);
$parole = htmlspecialchars($parole);
//noņemiet papildu atstarpes
$pieteikšanās = trim($login);
$parole = trim($parole);
// izveidot savienojumu ar datu bāzi
include("bd.php");// failam bd.php ir jāatrodas tajā pašā mapē kā visiem pārējiem, ja tā nav, vienkārši mainiet ceļu

$result = mysql_query("SELECT * FROM users WHERE login="$login"",$db); //izgūt no datu bāzes visus datus par lietotāju ar ievadīto pieteikšanos
$myrow = mysql_fetch_array($rezultāts);
if (tukšs($myrow["parole"]))
{
//ja lietotājs ar ievadīto pieteikumvārdu neeksistē
}
cits(
//ja pastāv, pārbaudiet paroles
if ($myrow["parole"]==$parole) (
//ja paroles sakrīt, tad palaižam lietotājam sesiju! Jūs varat viņu apsveikt, viņš iekļuva!
$_SESSION["pieteikšanās"]=$myrow["pieteikšanās"];
$_SESSION["id"]=$myrow["id"];//šie dati tiek izmantoti ļoti bieži, tāpēc pieteicies lietotājs tos “nesīs sev līdzi”
echo "Jūs esat veiksmīgi ienācis vietnē! Mājas lapa";
}
cits(
//ja paroles nesakrīt

Iziet ("Atvainojiet, ievadītais pieteikumvārds vai parole nav pareizs.");
}
}
?>

Labi, tagad viss ir beidzies! Nodarbība var būt garlaicīga, bet ļoti noderīga. Šeit tiek parādīta tikai reģistrācijas ideja, pēc tam varat to uzlabot: pievienot aizsardzību, dizainu, datu laukus, ielādēt iemiesojumus, izrakstīties no konta (lai to izdarītu, vienkārši iznīciniet sesijas mainīgos ar funkciju atiestatīts) un tā tālāk. Veiksmi!

Es visu pārbaudīju, darbojas pareizi!

Šodien mēs apskatīsim populārās CMS Joomla kritiskās 1 dienas ievainojamības izmantošanu, kas oktobra beigās eksplodēja internetā. Tas ir par par ievainojamībām ar skaitļiem CVE-2016-8869, CVE-2016-8870 Un CVE-2016-9081. Visi trīs nāk no viena koda fragmenta, kas piecus ilgus gadus nīkuļoja sistēmas dziļumos, gaidot spārnos, lai pēc tam atbrīvotos un nestu sev līdzi haosu, uzlauztas vietnes un šīs Joomla nevainīgo lietotāju asaras. Tikai drosmīgākie un drosmīgākie izstrādātāji, kuriem acis ir sarkanas no monitoru gaismas un kuru klaviatūras ir nosētas ar maizes drupačām, spēja izaicināt trakojošos ļaunos garus un nolikt galvu uz labojumu altāra.

BRĪDINĀJUMS

Visa informācija tiek sniegta tikai informatīviem nolūkiem. Ne redaktori, ne autors nav atbildīgi par iespējamo kaitējumu, ko nodara šī raksta materiāli.

Kur tas viss sākās

2016. gada 6. oktobrī Demis Palma izveidoja tēmu Stack Exchange, kurā jautāja: kāpēc patiesībā Joomla versijā 3.6 ir divas metodes lietotāju reģistrēšanai ar vienādu vārdu register()? Pirmais atrodas UsersControllerRegistration kontrollerī, bet otrais ir UsersControllerUser kontrollerī. Damis vēlējās uzzināt, vai kaut kur tika izmantota metode UsersControllerUser::register(), vai tas ir tikai evolūcijas anahronisms, kas palicis pāri no vecās loģikas. Viņa bažas bija par to, ka pat tad, ja šo metodi neizmanto neviens skats, to var izsaukt ar izstrādātu vaicājumu. Uz ko es saņēmu atbildi no izstrādātāja ar segvārdu itoctopus, kurš apstiprināja: problēma patiešām pastāv. Un nosūtīja ziņojumu Joomla izstrādātājiem.

Tad notikumi attīstījās visstraujāk. 18. oktobrī Joomla izstrādātāji pieņēma ziņojumu no Damis, kurš līdz tam laikam bija izstrādājis PoC, kas ļautu reģistrēties. Viņš savā tīmekļa vietnē publicēja piezīmi, kur vispārīgs izklāsts runāja par atrasto problēmu un savām domām par šo jautājumu. Iznāks tajā pašā dienā jauna versija Joomla 3.6.3, kurā joprojām ir ievainojams kods.

Pēc tam Davide Tampellini griež kļūdu, līdz tā netiek reģistrēta vienkāršs lietotājs un administrators. Un 21. oktobrī Joomla drošības komandai nonāk jauna lieta. Tas jau runā par privilēģiju palielināšanu. Tajā pašā dienā Joomla vietnē parādās paziņojums, ka otrdien, 25. oktobrī, tiks izlaista nākamā versija ar sērijas numuru 3.6.3, kas izlabo kritisko ievainojamību sistēmas kodolā.

25. oktobris Joomla Security Strike Team atrod jaunāko problēmu, ko radījis Damis atklātais koda fragments. Pēc tam 21. oktobrī datēta apņemšanās ar neuzkrītošo nosaukumu Prepare 3.6.4 Stable Release tiek ievietota oficiālās Joomla repozitorija galvenajā atzarā, kas novērš nelaimīgo kļūdu.

Pēc šī iznākšanas izstrādātāju kopienai pievienojas daudzas ieinteresētas personas - viņi sāk popularizēt ievainojamību un sagatavot izlietojumus.

27. oktobrī pētnieks Harijs Robertss augšupielādē Xiphos Research repozitorijā gatavu izlietojumu, kas var augšupielādēt PHP failu serverī ar ievainojamu CMS.

Sīkāka informācija

Nu, fons ir beidzies, pāriesim pie interesantākās daļas - ievainojamības analīzes. Joomla 3.6.3 instalēju kā testa versiju, tāpēc šai versijai būs aktuāli visi rindiņu numuri. Un visi ceļi uz failiem, kurus redzēsit tālāk, tiks norādīti attiecībā pret instalētās CMS sakni.

Pateicoties Damis Palma atklājumam, mēs zinām, ka ir divas metodes, kas veic lietotāja reģistrāciju sistēmā. Pirmo izmanto SPS, un tas atrodas failā /components/com_users/controllers/registration.php:108. Otrais (tā, kas mums būs jāizsauc) atrodas mapē /components/com_users/controllers/user.php:293. Apskatīsim to tuvāk.

286: /** 287: * Lietotāja reģistrēšanas metode. 288: * 289: * @return Būla 290: * 291: * @no 1.6 292: */ 293: publisks funkciju reģistrs() 294: ( 295: JSession::checkToken("post") vai jexit(JText::_ ("JINVALID_TOKEN")) ... 300: // Iegūt veidlapas datus 301: $data = $this->input->post->get("user", array(), "masīvs" . 315: $return = $modelis->apstiprināt($forma, $data) 318: if ($return === false). Pabeidziet reģistrāciju 346: $return = $model->register($data);

Šeit es atstāju tikai interesantas rindas. Ievainojamās metodes pilno versiju var apskatīt Joomla repozitorijā.

Izdomāsim, kas notiek parastas lietotāja reģistrācijas laikā: kādi dati tiek nosūtīti un kā tie tiek apstrādāti. Ja iestatījumos ir iespējota lietotāja reģistrācija, veidlapu var atrast vietnē http://joomla.local/index.php/component/users/?view=registration.


Leģitīms lietotāja reģistrācijas pieprasījums izskatās kā šāds ekrānuzņēmums.


Komponents com_users ir atbildīgs par darbu ar lietotājiem. Pievērsiet uzmanību uzdevuma parametram pieprasījumā. Tam ir formāts $controller.$method . Apskatīsim failu struktūru.

Mapē esošo skriptu nosaukumi kontrolieri atbilst izsaukto kontrolieru nosaukumiem. Tā kā mūsu pieprasījumā tagad ir ietverts $controller = "registration" , fails tiks izsaukts reģistrācija.php un tā reģistra() metode.

Uzmanību, jautājums: kā pārcelt reģistrācijas apstrādi uz neaizsargātu vietu kodā? Jūs droši vien jau to uzminējāt. Neaizsargāto un reālo metožu nosaukumi ir vienādi (reģistrs), tāpēc mums vienkārši jāmaina izsauktā kontroliera nosaukums. Kur atrodas mūsu neaizsargātais kontrolieris? Tieši tā, failā lietotājs.php. Izrādās $controller = "lietotājs" . Saliekot visu kopā, iegūstam uzdevumu = user.register . Tagad reģistrācijas pieprasījums tiek apstrādāts ar mums nepieciešamo metodi.


Otra lieta, kas mums jādara, ir nosūtīt datus pareizajā formātā. Šeit viss ir vienkārši. Legitimate register() sagaida no mums masīvu ar nosaukumu jform , kurā mēs nododam reģistrācijas datus - vārdu, pieteikumvārdu, paroli, e-pastu (skatiet ekrānuzņēmumu ar pieprasījumu).

  • /components/com_users/controllers/registration.php: 124: // Iegūstiet lietotāja datus. 125: $requestData = $this->input->post->get("jform", array(), "masīvs");

Mūsu klients iegūst šos datus no masīva, ko sauc par lietotāju.

  • /components/com_users/controllers/user.php: 301: // Iegūstiet veidlapas datus. 302: $dati = $this->input->post->get("lietotājs", masīvs(), "masīvs");

Tāpēc mēs mainām visu pieprasījuma parametru nosaukumus no jfrom uz user .

Mūsu trešais solis ir atrast derīgu CSRF marķieri, jo bez tā reģistrācijas nebūs.

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

Tas izskatās pēc MD5 jaucējkoda, un jūs varat to iegūt, piemēram, no vietnes /index.php/component/users/?view=login autorizācijas veidlapas.


Tagad jūs varat izveidot lietotājus, izmantojot vēlamo metodi. Ja viss izdevās, tad apsveicam - jūs tikko izmantojāt ievainojamību CVE-2016-8870"Trūkst atļauju pārbaudes jaunu lietotāju reģistrēšanai."

Lūk, kā tas izskatās UsersControllerRegistration kontrollera “darba” reģistra() metodē:

  • /components/com_users/controllers/registration.php: 113: // Ja reģistrācija ir atspējota — novirzīt uz pieteikšanās lapu. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= pieteikšanās", false)); 117: 118: atgriezties false; 119: )

Un tātad neaizsargātos:

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

Jā, nekādā gadījumā.

Lai saprastu otru, daudz nopietnāku problēmu, nosūtīsim mūsu izveidoto pieprasījumu un paskatīsimies, kā tas tiek izpildīts dažādās koda daļās. Šeit ir daļa, kas ir atbildīga par lietotāja iesniegto datu validāciju darbinieka metodē:

Turpinājums pieejams tikai biedriem

1. iespēja. Pievienojieties “vietnes” kopienai, lai lasītu visus vietnes materiālus

Dalība kopienā noteiktajā laika posmā nodrošinās piekļuvi VISIEM Hacker materiāliem, palielinās jūsu personīgo kumulatīvo atlaidi un ļaus jums uzkrāt profesionālu Xakep Score vērtējumu!

Šajā rakstā jūs uzzināsit kā izveidot reģistrācijas un autorizācijas veidlapu izmantojot HTML, JavaScript, PHP un MySql. Šādas veidlapas tiek izmantotas gandrīz katrā vietnē neatkarīgi no tās veida. Tie ir izveidoti forumam, tiešsaistes veikalam, sociālajiem tīkliem (piemēram, Facebook, Twitter, Odnoklassniki) un daudzu citu veidu vietnēm.

Ja jūsu lokālajā datorā ir vietne, tad ceru, ka jums jau ir instalēts un darbojas vietējais serveris. Bez tā nekas nedarbosies.

Tabulas izveide datu bāzē

Lai ieviestu lietotāju reģistrāciju, vispirms mums ir nepieciešama datu bāze. Ja jums tas jau ir, tad lieliski, pretējā gadījumā jums tas ir jāizveido. Rakstā es sīki paskaidrošu, kā to izdarīt.

Un tā, mums ir datu bāze (saīsināti kā DB), tagad mums ir jāizveido tabula lietotājiem kurā pievienosim savus reģistrētos lietotājus.

Kā izveidot tabulu datu bāzē, es arī paskaidroju rakstā. Pirms tabulas izveides mums ir jānosaka, kādi lauki tajā būs. Šie lauki atbildīs reģistrācijas veidlapas laukiem.

Tātad, mēs domājām, iedomājāmies, kādi lauki būs mūsu formā, un izveidojām tabulu lietotājiem ar šiem laukiem:

  • id- Identifikators. Lauks id Katrai datubāzes tabulai tai jābūt.
  • vārds- Lai saglabātu vārdu.
  • uzvārds- Lai saglabātu uzvārdu.
  • e-pasts- Lai saglabātu pasta adresi. Mēs izmantosim e-pastu kā pieteikšanos, tāpēc šim laukam ir jābūt unikālam, tas ir, ar UNIKĀLU indeksu.
  • e-pasta_statuss- Lauks, lai norādītu, vai pasts ir apstiprināts vai nē. Ja pasts tiek apstiprināts, tā vērtība būs 1, pretējā gadījumā vērtība ir 0.
  • parole- Lai saglabātu paroli.


Ja vēlaties, lai reģistrācijas veidlapā būtu daži citi lauki, varat tos pievienot arī šeit.

Tas ir viss, mūsu galds lietotājiem gatavs. Pāriesim uz nākamo posmu.

Datu bāzes savienojums

Mēs esam izveidojuši datu bāzi, tagad mums ir jāpieslēdzas tai. Mēs izveidosim savienojumu, izmantojot PHP paplašinājumu MySQLi.

Mūsu vietnes mapē izveidojiet failu ar nosaukumu dbconnect.php un ierakstiet tajā šādu skriptu:

DB savienojuma kļūda. Kļūdas apraksts: ".mysqli_connect_error()."

"; exit(); ) // Iestatiet savienojuma kodējumu $mysqli->set_charset("utf8"); // Ērtības labad pievienojiet šeit mainīgo, kurā būs mūsu vietnes nosaukums $address_site = "http://testsite .local" ; ?>

Šis fails dbconnect.php būs jāsavieno ar veidlapu apstrādātājiem.

Ievērojiet mainīgo $adrese_vietne, šeit es norādīju savas pārbaudes vietnes nosaukumu, pie kuras strādāšu. Lūdzu, attiecīgi norādiet savas vietnes nosaukumu.

Vietnes struktūra

Tagad apskatīsim mūsu vietnes HTML struktūru.

Mēs pārvietosim vietnes galveni un kājeni atsevišķos failos, header.php Un kājene.php. Mēs tos iekļausim visās lapās. Proti, galvenajā lapā (fails indekss.php), uz lapu ar reģistrācijas veidlapu (failu form_register.php) un uz lapu ar autorizācijas veidlapu (fails form_auth.php).

Bloķēt ar mūsu saitēm, reģistrācija Un autorizācija, pievienojiet tos vietnes galvenē, lai tie tiktu parādīti visās lapās. Viena saite tiks ievadīta plkst reģistrācijas veidlapas lapa(fails form_register.php) un otru uz lapu ar pilnvarojuma veidlapa(fails form_auth.php).

Header.php faila saturs:

Mūsu vietnes nosaukums

Rezultātā mūsu galvenā lapa izskatās šādi:


Protams, jūsu vietnei var būt pavisam cita struktūra, taču tas mums šobrīd nav svarīgi. Galvenais, ka ir saites (pogas) reģistrācijai un autorizācijai.

Tagad pāriesim uz reģistrācijas veidlapu. Kā jūs jau saprotat, mums tas ir reģistrēts form_register.php.

Dodieties uz datu bāzi (phpMyAdmin), atveriet tabulas struktūru lietotājiem un paskaties, kādi lauki mums ir vajadzīgi. Tas nozīmē, ka mums ir nepieciešami lauki vārda un uzvārda ievadīšanai, lauks pasta adreses ievadīšanai (Email) un lauks paroles ievadīšanai. Un drošības nolūkos mēs pievienosim lauku captcha ievadīšanai.

Serverī reģistrācijas veidlapas apstrādes rezultātā var rasties dažādas kļūdas, kuru dēļ lietotājs nevarēs reģistrēties. Tāpēc, lai lietotājs saprastu, kāpēc reģistrācija neizdodas, ir jāparāda ziņojumi par šīm kļūdām.

Pirms veidlapas parādīšanas pievienojiet bloku, lai parādītu sesijas kļūdu ziņojumus.

Un vēl viena lieta, ja lietotājs jau ir autorizēts un ziņkārības dēļ dodas uz reģistrācijas lapu tieši, ierakstot pārlūkprogrammas adreses joslā vietnes_adrese/form_register.php, tad šajā gadījumā reģistrācijas veidlapas vietā mēs parādīsim galveni, kurā norādīts, ka viņš jau ir reģistrēts.

Kopumā faila kods form_register.php mēs saņēmām šo:

Jūs jau esat reģistrējies

Pārlūkprogrammā lapa ar reģistrācijas veidlapu izskatās šādi:


Izmantojot nepieciešamais atribūts, mēs esam padarījuši visus laukus obligātus.

Pievērsiet uzmanību reģistrācijas formas kodam, kur tiek parādīts captcha:


Mēs norādījām ceļu uz failu attēla atribūta src vērtībā captcha.php, kas ģenerē šo captcha.

Apskatīsim faila kodu captcha.php:

Kods ir labi komentēts, tāpēc es koncentrēšos tikai uz vienu punktu.

Funkcijas iekšpusē imageTtfText(), ir norādīts ceļš uz fontu verdana.ttf. Tātad, lai captcha darbotos pareizi, mums ir jāizveido mape fonti un ievietojiet tur fonta failu verdana.ttf. To var atrast un lejupielādēt no interneta vai paņemt no arhīva kopā ar šī raksta materiāliem.

Esam pabeiguši ar HTML struktūru, ir pienācis laiks doties tālāk.

E-pasta derīguma pārbaude, izmantojot jQuery

Jebkurai formai ir jāpārbauda ievadīto datu derīgums gan klienta pusē (izmantojot JavaScript, jQuery), gan servera pusē.

Īpaša uzmanība jāpievērš laukam E-pasts. Ir ļoti svarīgi, lai ievadītā pasta adrese būtu derīga.

Šim ievades laukam mēs iestatām e-pasta veidu (type = "email"), kas mūs nedaudz brīdina par nepareiziem formātiem. Bet ar to nepietiek, jo, izmantojot koda inspektoru, ko mums nodrošina pārlūkprogramma, mēs varam viegli mainīt atribūta vērtību veids Ar e-pasts ieslēgts tekstu, un viss, mūsu čeks vairs nebūs derīgs.


Un šajā gadījumā mums ir jāveic uzticamāka pārbaude. Lai to izdarītu, mēs izmantosim jQuery bibliotēku no JavaScript.

Lai savienotu jQuery bibliotēku, failā header.php starp tagiem , pirms beigu atzīmes , pievienojiet šo rindu:

Tūlīt pēc šīs rindas mēs pievienosim e-pasta apstiprināšanas kodu. Šeit mēs pievienosim kodu, lai pārbaudītu ievadītās paroles garumu. Tā garumam jābūt vismaz 6 rakstzīmēm.

Izmantojot šo skriptu, mēs pārbaudām ievadītās e-pasta adreses derīgumu. Ja lietotājs ievadījis nepareizu e-pasta adresi, mēs par to parādām kļūdas ziņojumu un atspējojam veidlapas iesniegšanas pogu. Ja viss ir kārtībā, mēs noņemam kļūdu un aktivizējam veidlapas iesniegšanas pogu.

Un tā, mēs esam pabeiguši veidlapas validāciju klienta pusē. Tagad varam nosūtīt uz serveri, kur arī veiksim pāris pārbaudes un pievienosim datus datu bāzei.

Lietotāja reģistrācija

Veidlapu nosūtām uz failu apstrādei register.php, izmantojot POST metodi. Vārds šo failu apdarinātājs, kas norādīts atribūta vērtībā darbība. Un nosūtīšanas metode ir norādīta atribūta vērtībā metodi.

Atveriet šo failu register.php un pirmā lieta, kas mums jādara, ir ierakstīt sesijas palaišanas funkciju un savienot iepriekš izveidoto failu dbconnect.php(Šajā failā mēs izveidojām savienojumu ar datu bāzi). Un arī nekavējoties deklarēsim šūnas error_messages Un veiksmes_ziņojumi globālajā sesiju masīvā. IN kļūdu_ziņojumi mēs reģistrēsim visus kļūdu ziņojumus, kas rodas veidlapas apstrādes laikā un iekšā Succes_Messages, mēs ierakstīsim priecīgas ziņas.

Pirms turpinām, mums ir jāpārbauda vai veidlapa vispār tika iesniegta?. Uzbrucējs var apskatīt atribūta vērtību darbība no veidlapas un uzziniet, kurš fails apstrādā šo veidlapu. Un viņam var rasties doma doties tieši uz šo failu, pārlūkprogrammas adreses joslā ierakstot šādu adresi: http://site_address/register.php

Tāpēc mums ir jāpārbauda, ​​vai globālajā POST masīvā nav šūnas, kuras nosaukums atbilst mūsu pogas "Reģistrēties" nosaukumam no veidlapas. Tādā veidā mēs pārbaudām, vai ir nospiesta poga "Reģistrēties".

Ja uzbrucējs mēģina tieši piekļūt šim failam, viņš saņems kļūdas ziņojumu. Atgādināšu, ka mainīgais $address_site satur vietnes nosaukumu un tas tika deklarēts failā dbconnect.php.

Kļūda! galvenā lapa.

"); } ?>

Captcha vērtība sesijā tika pievienota failā, kad tā tika ģenerēta captcha.php. Atgādinājumam es vēlreiz parādīšu šo faila koda daļu captcha.php, kur sesijai tiek pievienota captcha vērtība:

Tagad pāriesim pie pašas pārbaudes. Failā register.php, ja bloka iekšpusē, kur mēs pārbaudām, vai tika noklikšķināts uz pogas "Reģistrēties", vai drīzāk, kur ir norādīts komentārs "" // (1) Atstarpe nākamajai koda daļai"mēs rakstām:

//Pārbaudīt saņemto captcha //Apgriezt atstarpes no rindas sākuma un beigām $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Salīdzināt saņemto vērtību ar sesijas vērtību. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Ja captcha nav pareizs, mēs atgriezīsim lietotāju reģistrācijas lapā, un tur parādīsim viņam kļūdas ziņojumu, ka viņš ievadījis nepareizu captcha $error_message = ".

Kļūda! Jūs ievadījāt nepareizu captcha

"; // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] = $error_message; // Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: " .$address_site ."/form_register.php" //Apturēt skriptu exit(); "

Kļūda! Nav verifikācijas koda, tas ir, captcha koda. Jūs varat doties uz galveno lapu.

"); }

Tālāk mums ir jāapstrādā saņemtie dati no POST masīva. Pirmkārt, mums ir jāpārbauda globālā POST masīva saturs, tas ir, vai tur ir šūnas, kuru nosaukumi atbilst ievades lauku nosaukumiem no mūsu formas.

Ja šūna pastāv, mēs apgriežam atstarpes no šīs šūnas rindas sākuma un beigām, pretējā gadījumā mēs novirzām lietotāju atpakaļ uz lapu ar reģistrācijas veidlapu.

Pēc tam, kad esam apcirpuši atstarpes, mēs pievienojam rindiņu mainīgajam un pārbaudām, vai šis mainīgais nav tukšs, tad mēs virzāmies tālāk, pretējā gadījumā mēs novirzām lietotāju atpakaļ uz lapu ar reģistrācijas veidlapu.

Ielīmējiet šo kodu norādītajā vietā" // (2) Atstarpe nākamajai koda daļai".

/* Pārbaudiet, vai globālajā masīvā $_POST ir dati, kas nosūtīti no formas, un ietiniet iesniegtos datus parastajos mainīgajos.*/ if(isset($_POST["first_name"]))( //Izgrieziet atstarpes no sākuma un virknes beigas $first_name = trim($_POST["first_name"] //Pārbaudiet, vai mainīgais nav tukšs if(!empty($first_name))( // Drošības labad konvertējiet speciālās rakstzīmes par HTML entītijām $first_name =); htmlspecialchars($first_name, ENT_QUOTES) )else( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Ievadiet savu vārdu

Trūkst nosaukuma lauka

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); //Apturēt skripta izeju(); ) if( isset($_POST["last_name"]))( //Apgriezt atstarpes no rindas sākuma un beigām $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // Drošības nolūkos konvertējiet speciālās rakstzīmes par HTML entītijām $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Lūdzu, ievadiet savu uzvārdu

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); //Apturēt skripta izeju(); ) )else ( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Trūkst uzvārda lauka

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); //Apturēt skripta izeju(); ) if( isset($_POST["email"]))( //Izgrieziet atstarpes no rindas sākuma un beigām $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Koda atrašanās vieta e-pasta adreses formāta un tās unikalitātes pārbaudei )else( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Ievadi savu epastu

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); //Apturēt skripta izeju(); ) )else ( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); //Apturēt skripta izeju(); ) if( isset($_POST["parole"]))( //Apgriezt atstarpes no virknes sākuma un beigām $password = trim($_POST["parole"]); if(!empty($parole)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Šifrēt paroli $password = md5($password."top_secret");else( //Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] . = "

Ievadiet savu paroli

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); //Apturēt skripta izeju(); ) )else ( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); //Apturēt skripta izeju(); ) // (4) Vieta koda lietotāja pievienošanai datu bāzei

Īpaši svarīga ir joma e-pasts. Mums ir jāpārbauda saņemtās pasta adreses formāts un unikalitāte datu bāzē. Tas ir, vai ir jau reģistrēts kāds lietotājs ar tādu pašu e-pasta adresi?

Norādītajā vietā" // (3) Koda atrašanās vieta, lai pārbaudītu pasta adreses formātu un tās unikalitāti" pievienojiet šādu kodu:

//Pārbaudiet saņemtās e-pasta adreses formātu, izmantojot regulāro izteiksmi $reg_email = "/^**@(+(*+)*\.)++/i"; //Ja saņemtās e-pasta adreses formāts neatbilst regulārajai izteiksmei if(!preg_match($reg_email, $email))( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Jūs ievadījāt nepareizu e-pasta adresi

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); //Apturēt skripta izeju(); ) // Mēs pārbaudām, vai šāda adrese jau atrodas datu bāzē ir tieši viena rinda, kas nozīmē, ka lietotājs ar šo e-pasta adresi jau ir reģistrēts if($result_query->num_rows == 1)( //Ja iegūtais rezultāts nav nepatiess if(($row = $result_query->fetch_assoc() ) != false) ( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Lietotājs ar šo e-pasta adresi jau ir reģistrēts

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); )else( // Saglabājiet kļūdas ziņojumu uz sesiju $_SESSION["error_messages"] .= "

Kļūda datu bāzes vaicājumā

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); ) /* atlases aizvēršana */ $ result_query-> close();

Un tā, mēs esam pabeiguši visas pārbaudes, ir pienācis laiks pievienot lietotāju datu bāzei. Norādītajā vietā" // (4) Vieta koda lietotāja pievienošanai datu bāzei" pievienojiet šādu kodu:

//Vaicājums lietotāja pievienošanai datu bāzei $result_query_insert = $mysqli->query("INSERT INTO `users` (vārds, uzvārds, e-pasts, parole) VALUES ("".$first_name."", "".$last_name ." ", "".$email.", "".$password."")"); if(!$result_query_insert)( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Kļūda pieprasījumā pievienot lietotāju datu bāzei

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); //Apturēt skripta izeju(); )else( $_SESSION["success_messages"] = "

Reģistrācija veiksmīgi pabeigta!!!
Tagad jūs varat pieteikties, izmantojot savu lietotājvārdu un paroli.

"; //Nosūtīt lietotāju uz autorizācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_auth.php"); ) /* Pieprasījuma pabeigšana */ $ result_query_insert-> close( //Aizvērt savienojumu ar datu bāzi $mysqli->close();

Ja pieprasījumā pievienot lietotāju datu bāzei radās kļūda, mēs sesijai pievienojam ziņojumu par šo kļūdu un atgriežam lietotāju reģistrācijas lapā.

Citādi, ja viss noritēja labi, sesijai pievienojam arī ziņu, bet šoreiz patīkamāk, proti, lietotājam sakām, ka reģistrācija bija veiksmīga. Un mēs to novirzām uz lapu ar autorizācijas veidlapu.

Skripts e-pasta adreses formāta un paroles garuma pārbaudei ir failā header.php, tāpēc tas attieksies arī uz šīs veidlapas laukiem.

Sesija tiek sākta arī failā header.php, tāpēc failā form_auth.php Nav nepieciešams sākt sesiju, jo mēs saņemsim kļūdu.


Kā jau teicu, šeit darbojas arī skripts e-pasta adreses formāta un paroles garuma pārbaudei. Tāpēc, ja lietotājs ievadīs nepareizu e-pasta adresi vai īsu paroli, viņš nekavējoties saņems kļūdas ziņojumu. Poga ienākt kļūs neaktīvs.

Pēc kļūdu novēršanas poga ienākt kļūst aktīva, un lietotājs veidlapu varēs iesniegt serverī, kur tā tiks apstrādāta.

Lietotāja autorizācija

Lai piešķirtu vērtību darbība autorizācijas handikapam ir norādīts fails auth.php, tas nozīmē, ka veidlapa tiks apstrādāta šajā failā.

Un tā, atveriet failu auth.php un ierakstiet kodu, lai apstrādātu autorizācijas veidlapu. Pirmā lieta, kas jums jādara, ir sākt sesiju un savienot failu dbconnect.php lai izveidotu savienojumu ar datu bāzi.

//Deklarējiet šūnu, lai pievienotu kļūdas, kas var rasties, apstrādājot veidlapu. $_SESSION["error_messages"] = ""; //Deklarēt šūnu veiksmīgu ziņojumu pievienošanai $_SESSION["success_messages"] = "";

/* Pārbaudiet, vai forma ir iesniegta, tas ir, vai tika noklikšķināts uz pogas Pieteikties. Ja jā, tad mēs turpināsim, ja nē, tad lietotājam parādīsim kļūdas ziņojumu, norādot, ka viņš tieši piekļuva šai lapai. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) Atstarpe nākamajai koda daļai )else( exit("

Kļūda! Jūs esat tieši piekļuvis šai lapai, tāpēc nav datu, ko apstrādāt. Jūs varat doties uz galveno lapu.

"); }

//Pārbaudiet saņemto captcha if(isset($_POST["captcha"]))( //Izgrieziet atstarpes no rindas sākuma un beigām $captcha = trim($_POST["captcha"]); if(! tukšs($captcha ))( //Salīdzināt saņemto vērtību ar sesijas vērtību. if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != "")) ( // Ja captcha ir nepareizs , mēs atgriezīsim lietotāju autorizācijas lapā, un tur parādīsim viņam kļūdas ziņojumu, ka viņš ievadījis nepareizu captcha $error_message = ".

Kļūda! Jūs ievadījāt nepareizu captcha

"; // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] = $error_message; // Atgriezt lietotāju uz autorizācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: " .$address_site ."/form_auth.php" //Apturēt skriptu exit( )else( $error_message = ");

Kļūda! Captcha ievades lauks nedrīkst būt tukšs.

"; // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] = $error_message; // Atgriezt lietotāju uz autorizācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: " .$address_site ."/form_auth.php"); //Stop the script exit(//(2) Vieta e-pasta adreses apstrādei //(3) Vieta paroles apstrādei //(4) Sastādīšanas vieta; pieprasījums datu bāzei )else ( //Ja captcha nav nodota, iziet("

Kļūda! Nav verifikācijas koda, tas ir, captcha koda. Jūs varat doties uz galveno lapu.

"); }

Ja lietotājs ievadīja verifikācijas kodu pareizi, mēs virzāmies tālāk, pretējā gadījumā mēs viņu atgriežam autorizācijas lapā.

Pasta adreses pārbaude

//Izgriezt atstarpes no rindas sākuma un beigām $email = trim($_POST["email"]); if(isset($_POST["e-pasts"]))(if(!empty($email))( $email = htmlspecialchars($email, ENT_QUOTES); //Pārbaudiet saņemtās e-pasta adreses formātu, izmantojot regulāro izteiksmi $ reg_email = " /^**@(+(*+)*\.)++/i" //Ja saņemtās e-pasta adreses formāts neatbilst regulārajai izteiksmei if(!preg_match($reg_email, $email); ))( // Saglabāt sesijas kļūdas ziņojumā. $_SESSION["error_messages"] .= "

Jūs ievadījāt nepareizu e-pasta adresi

"; //Atgriezt lietotāju uz autorizācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_auth.php"); //Apturēt skripta izeju(); ) )else ( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Lauks pasta adreses (e-pasta) ievadīšanai nedrīkst būt tukšs.

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_register.php"); //Apturēt skripta izeju(); ) )else ( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Trūkst e-pasta ievades lauka

"; //Atgriezt lietotāju uz autorizācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_auth.php"); //Apturēt skripta izeju(); ) // (3) Paroles apstrādes apgabals

Ja lietotājs ievadīja e-pasta adresi nepareizā formātā vai e-pasta adreses lauka vērtība ir tukša, mēs viņu atgriežam autorizācijas lapā, kur par to parādām ziņojumu.

Paroles pārbaude

Nākamais apstrādājamais lauks ir paroles lauks. Uz norādīto vietu" //(3) Vieta paroles apstrādei", mēs rakstām:

If(isset($_POST["parole"]))( //Apgriezt atstarpes no virknes sākuma un beigām $password = trim($_POST["parole"]); if(!empty($password))( $password = htmlspecialchars($password, ENT_QUOTES) //Šifrēt paroli $password = md5($password."top_secret");else( //Saglabāt kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Ievadiet savu paroli

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_auth.php"); //Apturēt skripta izeju(); ) )else ( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Trūkst paroles lauka

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_auth.php"); //Apturēt skripta izeju(); )

Šeit mēs izmantojam funkciju md5(), lai šifrētu saņemto paroli, jo mūsu paroles datu bāzē ir šifrētā veidā. Papildu slepenais vārds šifrēšanā, mūsu gadījumā " liels noslēpums" jābūt tam, kas tika izmantots, reģistrējot lietotāju.

Tagad jums ir jāveic datubāzes vaicājums, lai atlasītu lietotāju, kura e-pasta adrese ir vienāda ar saņemto e-pasta adresi un kura parole ir vienāda ar saņemto paroli.

//Vaicājums datu bāzē, pamatojoties uz lietotāja izvēli. $result_query_select = $mysqli->query("SELECT * FROM `users` WHERE email = "".$email."" UN parole = "".$password."""); if(!$result_query_select)( // Saglabājiet kļūdas ziņojumu sesijā. $_SESSION["error_messages"] .= "

Vaicājuma kļūda, atlasot lietotāju no datu bāzes

"; //Atgriezt lietotāju uz reģistrācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_auth.php"); //Apturēt skripta izeju(); )else( //Pārbaudiet vai datu bāzē nav lietotāja ar šādiem datiem, tad parādiet kļūdas ziņojumu if($result_query_select->num_rows == 1)( // Ja ievadītie dati sakrīt ar datiem no datu bāzes, tad saglabājiet sesiju masīva pieteikšanās vārds un parole. $_SESSION ).

Nepareizs pieteikšanās vārds un/vai parole

"; //Atgriezt lietotāju uz autorizācijas lapas galveni("HTTP/1.1 301 Moved Permanently"); header("Atrašanās vieta: ".$address_site."/form_auth.php"); //Apturēt skripta izeju(); ) )

Iziet no vietnes

Un pēdējā lieta, ko mēs īstenojam, ir vietnes pamešanas procedūra. Šobrīd galvenē tiek rādītas saites uz autorizācijas lapu un reģistrācijas lapu.

Vietnes galvenē (fails header.php), izmantojot sesiju, mēs pārbaudām, vai lietotājs jau ir autorizēts. Ja nē, tad mēs parādām reģistrācijas un autorizācijas saites, pretējā gadījumā (ja viņš ir pilnvarots), tad reģistrācijas un autorizācijas saišu vietā mēs parādām saiti Izeja.

Modificēts koda fragments no faila header.php:

Reģistrācija

Izeja

Noklikšķinot uz saites iziet no vietnes, mēs tiekam novirzīti uz failu logout.php, kur mēs vienkārši iznīcinām šūnas ar sesijas e-pasta adresi un paroli. Pēc tam mēs atgriezīsim lietotāju atpakaļ lapā, kurā tika noklikšķināts uz saites Izeja.

Faila kods logout.php:

Tas ir viss. Tagad jūs zināt, kā ieviest un apstrādāt reģistrācijas un autorizācijas veidlapas lietotājs jūsu vietnē. Šīs veidlapas ir atrodamas gandrīz katrā vietnē, tāpēc katram programmētājam ir jāzina, kā tās izveidot.

Mēs arī uzzinājām, kā pārbaudīt ievades datus gan klienta pusē (pārlūkprogrammā, izmantojot JavaScript, jQuery), gan servera pusē (izmantojot PHP). Mēs arī mācījāmies ieviest procedūru objekta pamešanai.

Visi skripti ir pārbaudīti un darbojas. No šīs saites varat lejupielādēt arhīvu ar šīs mazās vietnes failiem.

Nākotnē es uzrakstīšu rakstu, kurā aprakstīšu. Un vēl plānoju uztaisīt rakstu, kur paskaidrošu (bez lapas pārlādēšanas). Tātad, lai būtu informēts par jaunu rakstu iznākšanu, varat abonēt manu vietni.

Ja jums ir kādi jautājumi, lūdzu, sazinieties ar mani, un, ja pamanāt rakstā kļūdu, lūdzu, informējiet mani.

Nodarbības plāns (5. daļa):

  1. Autorizācijas veidlapas HTML struktūras izveide
  2. Mēs apstrādājam saņemtos datus
  3. Vietnes galvenē mēs rādām lietotāja sveicienu

Vai jums patika raksts?



Jaunums vietnē

>

Populārākais