Ev Uşaq stomatologiyası İcra qeydiyyatı php. Sadə istifadəçi qeydiyyatı sistemi

İcra qeydiyyatı php. Sadə istifadəçi qeydiyyatı sistemi

Üzvlük əsaslı sayt yaratmaq ilk baxışdan çətin bir iş kimi görünür. Əgər siz nə vaxtsa bunu özünüz etmək istəmisinizsə, PHP bacarıqlarınızdan istifadə edərək bunu necə birləşdirəcəyinizi düşünməyə başlayanda sadəcə imtina edin, bu məqalə sizin üçündür. Parolla qorunan təhlükəsiz üzvlər sahəsi ilə üzvlük əsaslı sayt yaratmağın hər tərəfində sizə yol göstərəcəyik.

Bütün proses iki böyük hissədən ibarətdir: istifadəçi qeydiyyatı və istifadəçinin autentifikasiyası. Birinci hissədə biz qeydiyyat formasının yaradılmasını və verilənlərin MySQL verilənlər bazasında saxlanmasını əhatə edəcəyik. İkinci hissədə biz giriş formasını yaradacağıq və istifadəçilərin təhlükəsiz bölgəyə daxil olmasına icazə vermək üçün ondan istifadə edəcəyik.

Kodu yükləyin

Qeydiyyat/giriş sistemi üçün bütün mənbə kodunu aşağıdakı linkdən yükləyə bilərsiniz:

Konfiqurasiya və Yükləmə
ReadMe faylında ətraflı təlimatlar var.

açın source\include\membersite_config.php mətn redaktorunda faylı qurun və konfiqurasiyanı yeniləyin. (Verilənlər bazasına giriş, veb saytınızın adı, e-poçt ünvanınız və s.).

Bütün kataloq məzmununu yükləyin. Formu təqdim etməklə register.php-ni yoxlayın.

Qeydiyyat forması

İstifadəçi hesabı yaratmaq üçün istifadəçidən minimal miqdarda məlumat toplamaq lazımdır. Bizə onun adı, e-poçt ünvanı və istədiyi istifadəçi adı və şifrə lazımdır. Əlbəttə ki, bu nöqtədə daha çox məlumat istəyə bilərik, lakin uzun bir forma həmişə bir dönüşdür. Beləliklə, özümüzü yalnız bu sahələrlə məhdudlaşdıraq.

Budur qeydiyyat forması:

Qeydiyyatdan keçin

Beləliklə, ad, e-poçt və parol üçün mətn sahələrimiz var. Qeyd edək ki, biz daha yaxşı istifadə üçün istifadə edirik.

Formanın təsdiqlənməsi

Bu nöqtədə bəzi forma doğrulama kodunu yerləşdirmək yaxşı bir fikirdir, ona görə də istifadəçi hesabı yaratmaq üçün tələb olunan bütün məlumatlara sahib olduğumuzdan əmin oluruq. Biz adın, e-poçtun və parolun doldurulduğunu və e-poçtun düzgün formatda olduğunu yoxlamalıyıq.

Formanın təqdim edilməsi ilə məşğul olmaq

İndi təqdim olunan forma məlumatlarını idarə etməliyik.

Bu ardıcıllıqdır (endirilmiş mənbədə fg_membersite.php faylına baxın):

funksiyası RegisterUser() ( if(!isset($_POST["submitted"])) ( 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); doğru qaytarın; )

Əvvəlcə formanın təqdim edilməsini təsdiq edirik. Sonra biz forma təqdimetmə məlumatlarını toplayırıq və “təmizləyirik” (e-poçt göndərməzdən, verilənlər bazasında saxlamaqdan və s. əvvəl bunu həmişə edin). Formanın təqdim edilməsi daha sonra verilənlər bazası cədvəlində saxlanılır. Təsdiq tələb edən istifadəçiyə e-poçt göndəririk. Sonra adminə istifadəçinin qeydiyyatdan keçdiyini bildiririk.

Verilənlərin verilənlər bazasında saxlanması

İndi bütün məlumatları topladıqdan sonra onu verilənlər bazasında saxlamalıyıq.
Formanın təqdimatını verilənlər bazasına necə saxladığımızı burada görürük.

funksiyası SaveToDatabase(&$formvars) ( if(!$this->DBLogin()) ( $this->HandleError("Database login failed!"); return false; ) if(!$this->Ensuretable()) ( return false; ) if(!$this->IsFieldUnique($formvars,"email")) ( $this->HandleError("Bu e-poçt artıq qeydiyyatdan keçib"); false qaytarın; ) if(!$this->IsFieldUnique() $formvars,"username")) ( $this->HandleError("Bu İstifadəçi Adı artıq istifadə olunub. Lütfən, başqa istifadəçi adı sınayın"); false qaytarın; ) if(!$this->InsertIntoDB($formvars)) ( $this- >HandleError("Verilənlər bazasına daxil edilmədi!"); false qaytarın; ) doğru qaytarın; )

Qeyd edək ki, siz Membersite_config.php faylında verilənlər bazasına giriş təfərrüatlarını konfiqurasiya etmisiniz. Əksər hallarda verilənlər bazası sahibi üçün “localhost” istifadə edə bilərsiniz.
Sistemə daxil olduqdan sonra cədvəlin mövcud olmasına əmin oluruq.(Əgər yoxsa, skript tələb olunan cədvəli yaradacaq).
Sonra istifadəçi adı və e-poçtun unikal olduğuna əmin oluruq. Əgər unikal deyilsə, istifadəçiyə xətanı qaytarırıq.

Verilənlər bazası cədvəlinin quruluşu

Bu cədvəlin quruluşudur. fg_membersite.php faylında CreateTable() funksiyası cədvəl yaradır. Budur kod:

function CreateTable() ( $qry = "Cədvəl yaradın $this->tablename (". "id_user INT NOT NULL AUTO_INCREMENT ," "name VARCHAR(128) NOT NULL ," "e-poçt VARCHAR(64) NULL DEYİL," "telefon_nömrəsi VARCHAR(16) NOT NULL ," "istifadəçi adı VARCHAR(16) NOT NULL ," "parol VARCHAR(32) NOT NULL ," "təsdiq kodu VARCHAR(32) ," "PRIMARY KEY (id_user)." ")"; if( !mysql_query($qry,$this->bağlantı)) ( $this->HandleDBerror("Cədvəl yaratma xətası \nsorğu\n $qry oldu"); false qaytarın; ) doğru qaytarın; )

id_user sahəsində istifadəçinin unikal identifikatoru olacaq və eyni zamanda cədvəlin əsas açarıdır. Diqqət yetirin ki, biz parol sahəsi üçün 32 simvola icazə veririk. Biz bunu ona görə edirik ki, əlavə təhlükəsizlik tədbiri olaraq parolu MD5 istifadə edərək şifrələnmiş verilənlər bazasında saxlayacağıq. Nəzərə alın ki, MD5 birtərəfli şifrələmə üsulu olduğundan, istifadəçi parolu unutduqda parolu bərpa edə bilməyəcəyik.

Qeydiyyatın cədvələ daxil edilməsi

Budur verilənlər bazasına məlumatları daxil etmək üçün istifadə etdiyimiz kod. Bütün məlumatlarımız $formvars massivində əlçatan olacaq.

funksiyası InsertIntoDB(&$formvars) ( $confirmcode = $this->MakeConfirmationMd5($formvars["email"]); $insert_query = "".$this->tablename" daxil edin."(ad, e-poçt, istifadəçi adı, parol, təsdiq kodu) dəyərləri ("" . $this->SanitizeForSQL($formvars["name"]) . "", "" . $this->SanitizeForSQL($formvars["email"]) . "", "" $ this->SanitizeForSQL($formvars["istifadəçi adı"]) . "", "" .md5($formvars["parol"]) . "", "" . $təsdiq kodu . "")"; if(! mysql_query( $insert_query ,$this->bağlantı)) ( $this->HandleDBerror("Cədvələ verilənlərin daxil edilməsi xətası\nquery:$insert_query"); false qaytarın; ) doğru qaytarın; )

Diqqət yetirin ki, biz parolu verilənlər bazasına daxil etməzdən əvvəl şifrələmək üçün PHP md5() funksiyasından istifadə edirik.
Həmçinin, istifadəçinin e-poçt ünvanından unikal təsdiq kodu hazırlayırıq.

E-poçt göndərilməsi

İndi verilənlər bazamızda qeydiyyatımız olduğundan, istifadəçiyə təsdiq e-poçtu göndərəcəyik. İstifadəçi qeydiyyat prosesini başa çatdırmaq üçün təsdiq e-poçtunda olan keçidə klikləməlidir.

funksiyası SendUserConfirmationEmail(&$formvars) ( $mailer = new PHPMailer(); $mailer->CharSet = "utf-8"; $mailer->AddAddress($formvars["email"],$formvars["ad"]) ; $mailer->Mövzu = ".$this->sitename ilə qeydiyyatınız; $mailer->From = $this->GetFromAddress(); $confirmcode = urlencode($this->MakeConfirmationMd5($formvars["e-poçt" ])); $confirm_url = $this->GetAbsoluteURLFolder()."/confirmreg.php?code=".$confirmcode; $mailer->Body ="Salam ".$formvars["ad"]."\r\ n\r\n". "".$this->sitename" ilə qeydiyyatdan keçdiyiniz üçün təşəkkür edirik.\r\n". "Qeydiyyatınızı təsdiqləmək üçün aşağıdakı linkə klikləyin.\r\n." "$confirm_url\r \n". "\r\n". "Hörmətlə,\r\n". "Vebmaster\r\n". $this->sitename; if(!$mailer->Send()) ( $this-> HandleError("Qeydiyyatı təsdiq edən e-poçt göndərmək alınmadı."); yalanı qaytarın; ) doğrunu qaytarın; )

Yeniləmələr

9 yanvar 2012-ci il
Parolun Sıfırlanması/Parolun dəyişdirilməsi funksiyaları əlavə edilib
Kod indi GitHub-da paylaşılır.

Xoş gəldinizUserFullName(); ?>!

Lisenziya


Kod LGPL lisenziyası altında paylaşılır. Onu kommersiya və ya qeyri-kommersiya saytlarında sərbəst istifadə edə bilərsiniz.

Əlaqədar post yoxdur.

Bu girişlə bağlı şərhlər bağlıdır.

Sayt ziyarətçilərini müəyyən qruplara bölmək üçün saytda kiçik bir sistem quraşdırılmalıdır php-də qeydiyyat. Beləliklə, siz ziyarətçiləri şərti olaraq təsadüfi ziyarətçilərdən ibarət iki qrupa və daha dəyərli məlumat verdiyiniz daha imtiyazlı istifadəçilər qrupuna ayırırsınız.

Əksər hallarda php-də bir faylda yazılmış daha sadələşdirilmiş qeydiyyat sistemindən istifadə olunur register.php.

Beləliklə, biz bir qədər uzaqlaşdıq və indi qeydiyyat faylına daha yaxından baxacağıq.

Register.php faylı

Bunun sizin çox vaxtınızı almamasını təmin etmək üçün biz istifadəçiləri onlardan minimal əlaqə məlumatlarını qəbul edərək toplayacaq sistem yaradacağıq. Bu halda biz hər şeyi mysql verilənlər bazasına daxil edəcəyik. Verilənlər bazasının ən yüksək sürəti üçün istifadəçilər cədvəlini MyISAM formatında və utf-8 kodlaşdırmasında yaradacağıq.

Qeyd! Bütün skriptlər həmişə eyni kodlaşdırmada yazılmalıdır. Bütün sayt faylları və MySql verilənlər bazası eyni kodlaşdırmada olmalıdır. Ən çox yayılmış kodlaşdırmalar UTF-8 və Windows-1251-dir.

Niyə hər şeyi bir kodlaşdırmada yazmalısınız, daha sonra danışacağıq. Hələlik bu məlumatı skript yaratmaq üçün ciddi bir qayda kimi qəbul edin, əks halda gələcəkdə skriptlərlə bağlı problemlər yaranacaq. Əlbəttə ki, yaxşıdır, ancaq skriptdəki səhvləri axtarmağa çox vaxt itirəcəksiniz.

Skript özü necə işləyəcək?

Biz hər şeyi sadələşdirmək və tez nəticələr əldə etmək istəyirik. Buna görə də istifadəçilərdən yalnız giriş, e-poçt və parol alacağıq. Və spam robotlarından qorunmaq üçün kiçik captcha quraşdıracağıq. Əks halda Londondan hansısa oğlan bir neçə dəqiqə ərzində bütün məlumat bazasını saxta istifadəçilərlə dolduracaq kiçik robot analizator yazacaq, onun dahiliyinə və cəzasızlığına sevinəcək.

Budur skriptin özü. Hər şey bir faylda qeyd olunur register.php:

! `; // qırmızı sual işarəsi $sha=$sh."scripts/pro/"; //əsas qovluğa gedən yol $bg=` bgcolor="#E1FFEB"`; // sətirlərin fon rəngi?> Qeydiyyat skripti nümunəsi register.php style.css" />

Bu halda skript özünə istinad edir. Və o, forma və forma daxil edilmiş məlumatların emalçısıdır. Nəzərə alın ki, fayl zip arxivi kimi sıxılmışdır və konfiqurasiya faylı config.php, istifadəçilərin verilənlər bazası zibil qutusu, functions.php köməkçi funksiyalarını ehtiva edən fayl, style.css stil faylı və register.php faylının özündən ibarətdir. Captcha simvollarının işləməsi və yaradılması üçün cavabdeh olan bir neçə fayl da var.

Salam! İndi biz PHP + MySQL istifadə edərək saytda ən sadə qeydiyyatı həyata keçirməyə çalışacağıq. Bunun üçün Apache kompüterinizdə quraşdırılmalıdır. Skriptimizin iş prinsipi aşağıda göstərilmişdir.

1. Verilənlər bazasında istifadəçilər cədvəlini yaratmaqla başlayaq. O, istifadəçi məlumatlarını (giriş və şifrə) ehtiva edəcəkdir. Gəlin phpmyadmin-ə gedək (əgər siz kompüterinizdə verilənlər bazası yaradırsınızsa http://localhost/phpmyadmin/). Cədvəl yaradın istifadəçilər, onun 3 sahəsi olacaq.

Mən onu mysql verilənlər bazasında yaradıram, siz başqa verilənlər bazasında yarada bilərsiniz. Sonra, şəkildəki kimi dəyərləri təyin edin:

2. Bu cədvələ qoşulma tələb olunur. Gəlin fayl yaradaq bd.php. Onun məzmunu:

$db = mysql_connect("sizin MySQL serveriniz","bu server üçün giriş","bu server üçün parol");
mysql_select_db ("qoşulduğumuz verilənlər bazasının adı", $db);
?>

Mənim vəziyyətimdə bu belə görünür:

$db = mysql_connect("localhost","user","1234");
mysql_select_db("mysql",$db);
?>

Yadda saxla bd.php.
Əla! Verilənlər bazasında cədvəlimiz və onunla əlaqəmiz var. İndi istifadəçilərin məlumatlarını tərk edəcəyi bir səhifə yaratmağa başlaya bilərsiniz.

3. Məzmunu olan reg.php faylı yaradın (bütün şərhlər daxilində):



Qeydiyyat


Qeydiyyat


















4. Fayl yaradın, verilənlər bazasına məlumatları daxil edəcək və istifadəçini saxlayacaq. save_user.php(içəridə şərhlər):



{
}
//əgər login və parol daxil edilibsə, onda biz onları emal edirik ki, teqlər və skriptlər işləməsin, insanların nə daxil edə biləcəyini heç vaxt bilməyəcəksiniz.


//əlavə boşluqları silin
$login = trim($login);
$parol = trim($parol);
// verilənlər bazasına qoşulun
// eyni girişə malik istifadəçinin mövcudluğunu yoxlayın
$nəticə = mysql_query("İstifadəçilərdən identifikatoru SEÇ HARADA login="$giriş"",$db);
if (!empty($myrow["id"])) (
exit("Bağışlayın, daxil etdiyiniz login artıq qeydiyyatdan keçib. Lütfən, başqa login daxil edin.");
}
// əgər belə deyilsə, məlumatları yadda saxlayın
$result2 = mysql_query("İstifadəçilər INSERT INTO (giriş, parol) VALUES("$login","$parol")");
// Səhvlərin olub olmadığını yoxlayın
əgər ($nəticə2=="DOĞRU")
{
echo "Uğurla qeydiyyatdan keçdiniz! İndi sayta daxil ola bilərsiniz. Əsas səhifə";
}
başqa(
echo "Xəta! Siz qeydiyyatdan keçməmisiniz.";
}
?>

5. Artıq istifadəçilərimiz qeydiyyatdan keçə bilər! Bundan sonra, artıq qeydiyyatdan keçmiş istifadəçilər üçün sayta daxil olmaq üçün "qapı" yaratmalısınız. index.php(içəridə şərhlər):

// bütün prosedur seanslarda işləyir. Bu, istifadəçinin saytda olduğu müddətdə məlumatlarının saxlandığı yerdir. Onları səhifənin ən əvvəlində işə salmaq çox vacibdir!!!
session_start();
?>


Əsas səhifə


Əsas səhifə











Qeydiyyatdan keçin



// Giriş və istifadəçi id dəyişənlərinin boş olub olmadığını yoxlayın
əgər (boş($_SESSION["giriş"]) və ya boş($_SESSION["id"]))
{
// Əgər boşdursa, biz linki göstərmirik
echo "Siz qonaq kimi daxil olmusunuz
Bu keçid yalnız qeydiyyatdan keçmiş istifadəçilər üçün əlçatandır";
}
başqa
{

Faylda index.php Biz yalnız qeydiyyatdan keçmiş istifadəçilər üçün açıq olan bir keçid göstərəcəyik. Bu, skriptin bütün nöqtəsidir - istənilən məlumatlara girişi məhdudlaşdırmaq.

6. Daxil edilmiş loqin və parolun yoxlanıldığı fayl qalır. testreg.php (içəridə şərhlər):

session_start();// bütün prosedur sessiyalarda işləyir. Bu, istifadəçinin saytda olduğu müddətdə məlumatlarının saxlandığı yerdir. Onları səhifənin ən əvvəlində işə salmaq çox vacibdir!!!
if (isset($_POST["login"])) ( $login = $_POST["login"]; if ($login == "") ( unset($login);) ) //daxil edilmiş loqini daxil edin istifadəçi $login dəyişəninə daxil olur, əgər boşdursa, dəyişəni məhv edin
if (isset($_POST["parol"])) ( $password=$_POST["password"]; if ($password =="") ( unset($password);) )
//istifadəçinin daxil etdiyi parolu $password dəyişəninə qoyun, əgər boşdursa, dəyişəni məhv edin
əgər (empty($login) və ya empty($password)) //istifadəçi login və ya parol daxil etməyibsə, o zaman xəta veririk və skripti dayandırırıq
{
exit("Bütün məlumatları daxil etməmisiniz, geri qayıdın və bütün sahələri doldurun!");
}
//əgər login və parol daxil edilibsə, onda biz onları emal edirik ki, teqlər və skriptlər işləməsin, insanların nə daxil edə biləcəyini heç vaxt bilməyəcəksiniz.
$giriş = zolaqlar($giriş);
$login = htmlspecialchars($login);
$parol = zolaqlar($parol);
$password = htmlspecialchars($password);
//əlavə boşluqları silin
$login = trim($login);
$parol = trim($parol);
// verilənlər bazasına qoşulun
include("bd.php");// bd.php faylı bütün digərləri ilə eyni qovluqda olmalıdır, əgər belə deyilsə, sadəcə yolu dəyişdirin

$nəticə = mysql_query("İstifadəçilərdən * SEÇİN HARADA login="$giriş"",$db); //verilənlər bazasından daxil edilmiş loqinlə istifadəçi haqqında bütün məlumatları əldə edin
$myrow = mysql_fetch_array($nəticə);
əgər (boş($myrow["parol"]))
{
//əgər daxil edilmiş girişi olan istifadəçi mövcud deyilsə
}
başqa(
//əgər varsa, parolları yoxlayın
if ($myrow["parol"]==$parol) (
//əgər parollar üst-üstə düşürsə, onda biz istifadəçi üçün sessiyaya başlayırıq! Siz onu təbrik edə bilərsiniz, o içəri girdi!
$_SESSION["login"]=$myrow["giriş"];
$_SESSION["id"]=$myrow["id"];//bu məlumat çox tez-tez istifadə olunur, ona görə də daxil olmuş istifadəçi "onu özü ilə aparacaq"
echo "Siz sayta uğurla daxil oldunuz! Əsas səhifə";
}
başqa(
//əgər parollar uyğun gəlmirsə

Çıxın ("Bağışlayın, daxil etdiyiniz login və ya parol səhvdir.");
}
}
?>

Tamam, indi hər şey bitdi! Dərs darıxdırıcı ola bilər, amma çox faydalıdır. Burada yalnız qeydiyyat ideyası göstərilir, onda siz onu təkmilləşdirə bilərsiniz: qoruma, dizayn, məlumat sahələri əlavə edin, avatarları yükləyin, hesabdan çıxın (bunun üçün sadəcə olaraq funksiya ilə sessiyadan dəyişənləri məhv edin) təyin olunmadı) və s. Uğurlar!

Hər şeyi yoxladım, düzgün işləyir!

Bu gün biz oktyabrın sonunda internetdə partlayan məşhur CMS Joomla-da 1 günlük kritik zəifliyin istismarına baxacağıq. Nömrələrlə zəifliklər haqqında danışacağıq CVE-2016-8869, CVE-2016-8870CVE-2016-9081. Hər üçü, beş il ərzində çərçivənin dərinliklərində gizlənən, qanadlarda gözləyən bir kod parçasından gəlir, yalnız bundan sonra azad olmaq və xaos, sındırılmış saytlar və bu Joomla-nın günahsız istifadəçilərinin göz yaşlarını gətirmək üçün. Yalnız monitorların işığından gözləri qızarmış, klaviaturaları çörək qırıntıları ilə dolu olan ən cəsur və cəsarətli tərtibatçılar qəzəblənən pis ruhlara meydan oxuya və başlarını düzəlişlər qurbangahına qoya bildilər.

XƏBƏRDARLIQ

Bütün məlumatlar yalnız məlumat məqsədləri üçün verilir. Nə redaktorlar, nə də müəllif bu məqalənin materiallarının vurduğu hər hansı mümkün zərərə görə məsuliyyət daşımır.

Hər şeyin başladığı yer

6 oktyabr 2016-cı ildə Demis Palma Stack Exchange-də bir mövzu yaratdı və bu mövzuda soruşdu: niyə əslində Joomla 3.6 versiyasında eyni adlı registr() ilə istifadəçilərin qeydiyyatı üçün iki üsul var? Birincisi UsersControllerRegistration nəzarətçisində, ikincisi isə UsersControllerUser nəzarətçisindədir. Damis bilmək istəyirdi ki, UsersControllerUser::register() metodu haradasa istifadə olunub, yoxsa bu, köhnə məntiqdən qalan sadəcə təkamül anaxronizmidir. Onun narahatlığı ondan ibarət idi ki, bu üsul heç bir baxış tərəfindən istifadə edilməsə belə, hazırlanmış sorğu ilə çağırıla bilər. Mən itoctopus ləqəbi ilə bir tərtibatçıdan cavab aldım, o da təsdiq etdi: problem həqiqətən mövcuddur. Və Joomla tərtibatçılarına hesabat göndərdi.

Sonra hadisələr ən sürətlə inkişaf etdi. Oktyabrın 18-də Joomla tərtibatçıları o vaxta qədər istifadəçinin qeydiyyatına icazə verən PoC layihəsi hazırlamış Damisdən hesabatı qəbul etdilər. O, öz internet səhifəsində qeyd edib, orada tapdığı problem və bu məsələ ilə bağlı fikirlərini ümumi şəkildə danışıb. Həmin gün Joomla 3.6.3-ün hələ də həssas kodu ehtiva edən yeni versiyası buraxılır.

Bundan sonra Davide Tampellini səhvi sadə bir istifadəçinin deyil, idarəçinin qeydiyyatı nöqtəsinə çevirir. Oktyabrın 21-də Joomla təhlükəsizlik komandasına yeni bir iş gəlir. Artıq imtiyazların artırılmasından danışılır. Elə həmin gün Joomla saytında elan yerləşdirilir ki, çərşənbə axşamı, oktyabrın 25-də sistem nüvəsindəki kritik zəifliyi düzəldən 3.6.3 seriya nömrəsi ilə növbəti versiya buraxılacaq.

25 oktyabr Joomla Security Strike Team Damis tərəfindən aşkar edilən kod parçasının yaratdığı ən son problemi tapır. Sonra 21 oktyabr tarixli gözə çarpmayan adı olan "Prepare 3.6.4 Stabil Release" adlı öhdəlik rəsmi Joomla repozitoriyasının əsas filialına köçürülür və bu, uğursuz səhvi düzəldir.

Bu çıxdıqdan sonra çoxsaylı maraqlı şəxslər developer icmasına qoşulurlar - onlar zəifliyi təbliğ etməyə və istismarlar hazırlamağa başlayırlar.

Oktyabrın 27-də tədqiqatçı Harri Roberts Xiphos Research repozitoriyasına PHP faylını həssas CMS ilə serverə yükləyə bilən hazır istismarı yükləyir.

Təfərrüatlar

Yaxşı, arxa plan bitdi, keçək ən maraqlı hissəyə - zəifliyin təhlilinə. Mən Joomla 3.6.3-ü sınaq versiyası kimi quraşdırdım, ona görə də bütün sətir nömrələri bu versiya üçün uyğun olacaq. Və aşağıda görəcəyiniz fayllara gedən bütün yollar quraşdırılmış CMS-in kökünə nisbətən göstəriləcək.

Damis Palmanın kəşfi sayəsində sistemdə istifadəçi qeydiyyatını həyata keçirən iki üsul olduğunu bilirik. Birincisi CMS tərəfindən istifadə olunur və /components/com_users/controllers/registration.php:108 faylında yerləşir. İkincisi (zəng etməli olduğumuz) /components/com_users/controllers/user.php:293-də yaşayır. Gəlin buna daha yaxından nəzər salaq.

286: /** 287: * İstifadəçini qeydiyyatdan keçirmə üsulu. 288: * 289: * @return boolean 290: * 291: * @1.6-dan bəri 292: */ 293: ictimai funksiya qeydiyyatı() 294: ( 295: JSession::checkToken("post") və ya jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Forma məlumatını əldə edin. 301: $data = $this->input->post->get("user", array(), "array"); . .. 315: $return = $model->validate($form, $data); 316: 317: // Səhvləri yoxlayın. 318: if ($return === false) 319: ( ... 345: / / Qeydiyyatı tamamlayın 346: $return = $model->register($data);

Burada yalnız maraqlı sətirləri buraxdım. Həssas metodun tam versiyasına Joomla repozitoriyasında baxmaq olar.

Normal istifadəçi qeydiyyatı zamanı nə baş verdiyini anlayaq: hansı məlumatlar göndərilir və necə emal olunur. Əgər parametrlərdə istifadəçi qeydiyyatı aktivləşdirilibsə, formanı http://joomla.local/index.php/component/users/?view=registration ünvanında tapmaq olar.


Qanuni istifadəçi qeydiyyatı sorğusu aşağıdakı ekran görüntüsünə bənzəyir.


com_users komponenti istifadəçilərlə işləmək üçün məsuliyyət daşıyır. Sorğuda tapşırıq parametrinə diqqət yetirin. O, $controller.$method formatına malikdir. Fayl strukturuna baxaq.

Qovluqdakı skriptlərin adları nəzarətçilərçağırılan nəzarətçilərin adlarına uyğun gəlir. Sorğumuz indi $controller = "registration" ehtiva etdiyi üçün fayl çağırılacaq qeydiyyat.php və onun register() metodu.

Diqqət, sual: qeydiyyat emalını kodun həssas yerinə necə köçürmək olar? Yəqin ki, artıq təxmin etmisiniz. Zəif və real metodların adları eynidir (registr), ona görə də sadəcə çağırılan nəzarətçinin adını dəyişmək lazımdır. Zəif nəzarətçimiz harada yerləşir? Doğrudur, faylda user.php. Belə çıxır ki, $controller = "istifadəçi" . Hər şeyi bir araya gətirərək tapşırıq = user.register alırıq. İndi qeydiyyat sorğusu bizə lazım olan üsulla işlənir.


Etməli olduğumuz ikinci şey məlumatları düzgün formatda göndərməkdir. Burada hər şey sadədir. Legitimate register() bizdən jform adlı bir massiv gözləyir, biz orada qeydiyyat məlumatlarını - ad, giriş, parol, e-poçt (sorğu ilə ekran görüntüsünə baxın) ötürürük.

  • /components/com_users/controllers/registration.php: 124: // İstifadəçi məlumatlarını əldə edin. 125: $requestData = $this->input->post->get("jform", array(), "massiv");

Müştərimiz bu məlumatları istifadəçi adlı massivdən alır.

  • /components/com_users/controllers/user.php: 301: // Forma məlumatlarını əldə edin. 302: $data = $this->input->post->get("istifadəçi", array(), "massiv");

Buna görə də sorğudakı bütün parametrlərin adlarını jfrom-dan user-ə dəyişirik.

Üçüncü addımımız etibarlı CSRF tokenini tapmaqdır, çünki onsuz qeydiyyat olmayacaq.

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

Bu, MD5 hash-ə bənzəyir və siz onu, məsələn, /index.php/component/users/?view=login saytındakı avtorizasiya formasından götürə bilərsiniz.


İndi istədiyiniz üsuldan istifadə edərək istifadəçilər yarada bilərsiniz. Hər şey düzəldisə, təbrik edirəm - sadəcə bir zəiflikdən istifadə etdiniz CVE-2016-8870"Yeni istifadəçilərin qeydiyyatı üçün icazə yoxlanışı çatışmır."

UsersControllerRegistration nəzarətçisinin “işləyən” registr() metodunda belə görünür:

  • /components/com_users/controllers/registration.php: 113: // Əgər qeydiyyat deaktiv edilibsə - Giriş səhifəsinə yönləndirin. 114: əgər (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=" login", false); 117: 118: false qaytarın; 119: )

Və beləliklə, həssas vəziyyətdə:

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

Bəli, olmaz.

İkinci, daha ciddi problemi başa düşmək üçün yaratdığımız sorğunu göndərək və kodun müxtəlif hissələrində onun necə icra olunduğunu görək. Budur, işçi metodunda istifadəçinin təqdim etdiyi məlumatların təsdiqlənməsi üçün cavabdeh olan hissə:

Davamı yalnız üzvlər üçün əlçatandır

Seçim 1. Saytdakı bütün materialları oxumaq üçün “sayt” icmasına qoşulun

Müəyyən edilmiş müddət ərzində cəmiyyətə üzv olmaq sizə BÜTÜN Hacker materiallarına giriş imkanı verəcək, şəxsi məcmu endiriminizi artıracaq və peşəkar Xakep Score reytinqi toplamağa imkan verəcək!

Bu yazıda öyrənəcəksiniz qeydiyyat və icazə formasını necə yaratmaq olar HTML, JavaScript, PHP və MySql istifadə edərək. Bu cür formalar növündən asılı olmayaraq demək olar ki, hər bir vebsaytda istifadə olunur. Onlar forum, onlayn mağaza, sosial şəbəkələr (Facebook, Twitter, Odnoklassniki kimi) və bir çox başqa növ saytlar üçün yaradılmışdır.

Yerli kompüterinizdə veb saytınız varsa, ümid edirəm ki, artıq var yerli server quraşdırılıb və işləyir. Onsuz heç nə işləməyəcək.

Verilənlər bazasında cədvəlin yaradılması

İstifadəçi qeydiyyatını həyata keçirmək üçün ilk növbədə bizə verilənlər bazası lazımdır. Əgər sizdə artıq varsa, o zaman əladır, əks halda onu yaratmalısınız. Məqalədə bunu necə edəcəyimi ətraflı izah edirəm.

Beləliklə, verilənlər bazamız var (qısaldılmış DB kimi), indi cədvəl yaratmalıyıq istifadəçilər qeydiyyatdan keçmiş istifadəçilərimizi əlavə edəcəyik.

Mən də məqalədə verilənlər bazasında cədvəl yaratmağı izah etdim. Cədvəl yaratmazdan əvvəl onun hansı sahələri ehtiva edəcəyini müəyyən etməliyik. Bu sahələr qeydiyyat formasındakı sahələrə uyğun olacaq.

Beləliklə, formamızın hansı sahələrin olacağını düşündük, təsəvvür etdik və cədvəl yaratdıq istifadəçilər bu sahələrlə:

  • id- İdentifikator. Sahə id Verilənlər bazasındakı hər bir cədvəldə olmalıdır.
  • ad_ad- Adı saxlamaq üçün.
  • Soyad- Soyadı qorumaq üçün.
  • e-poçt- Poçt ünvanını saxlamaq üçün. Giriş kimi e-poçtdan istifadə edəcəyik, ona görə də bu sahə unikal olmalıdır, yəni UNİKAL indeksə malik olmalıdır.
  • email_status- Poçtun təsdiq edilib-edilmədiyini göstərmək üçün sahə. Əgər məktub təsdiqlənərsə, o zaman 1 dəyəri olacaq, əks halda dəyər 0-dır.
  • parol- Parolu saxlamaq üçün.


Əgər qeydiyyat formanızda başqa sahələrin olmasını istəyirsinizsə, onları da buraya əlavə edə bilərsiniz.

Budur, bizim masamız istifadəçilər hazır. Gəlin növbəti mərhələyə keçək.

Verilənlər bazası bağlantısı

Biz verilənlər bazasını yaratdıq, indi ona qoşulmaq lazımdır. PHP MySQLi uzantısından istifadə edərək qoşulacağıq.

Saytımızın qovluğunda adı olan bir fayl yaradın dbconnect.php, və orada aşağıdakı skripti yazın:

DB bağlantısı xətası. Xətanın təsviri: ".mysqli_connect_error()."

"; exit(); ) // $mysqli->set_charset("utf8") kodlamasını təyin edin; // Rahatlıq üçün bura bizim saytımızın adını ehtiva edən dəyişən əlavə edin $address_site = "http://testsite .local" ; ?>

Bu fayl dbconnect.php forma işləyicilərinə qoşulmaq lazımdır.

Dəyişənə diqqət yetirin $address_site, burada üzərində işləyəcəyim test saytımın adını qeyd etdim. Zəhmət olmasa saytınızın adını müvafiq olaraq göstərin.

Saytın strukturu

İndi isə saytımızın HTML strukturuna baxaq.

Saytın başlığını və altbilgisini ayrı fayllara köçürəcəyik, header.phpfooter.php. Onları bütün səhifələrə daxil edəcəyik. Məhz əsas səhifədə (fayl index.php), qeydiyyat forması olan səhifəyə (fayl form_register.php) və avtorizasiya forması olan səhifəyə (fayl form_auth.php).

Linklərimizlə bloklayın, qeydiyyaticazə, onları saytın başlığına əlavə edin ki, bütün səhifələrdə göstərilsin. Bir link daxil ediləcək qeydiyyat forması səhifəsi(fayl form_register.php) və digəri ilə səhifəyə icazə forması(fayl form_auth.php).

header.php faylının məzmunu:

Saytımızın adı

Nəticədə əsas səhifəmiz belə görünür:


Təbii ki, saytınız tamam başqa struktura malik ola bilər, lakin bu, bizim üçün indi vacib deyil. Əsas odur ki, qeydiyyat və avtorizasiya üçün keçidlər (düymələr) var.

İndi isə keçək qeydiyyat formasına. Artıq başa düşdüyünüz kimi, bizdə fayl var form_register.php.

Verilənlər bazasına (phpMyAdmin-də) gedin, cədvəl strukturunu açın istifadəçilər və bizə hansı sahələrə ehtiyacımız olduğuna baxın. Bu o deməkdir ki, bizə ad və soyad daxil etmək üçün sahələr, poçt ünvanını (E-poçt) daxil etmək üçün sahə və parol daxil etmək üçün sahə lazımdır. Və təhlükəsizlik məqsədləri üçün captcha daxil etmək üçün sahə əlavə edəcəyik.

Serverdə qeydiyyat formasının işlənməsi nəticəsində istifadəçinin qeydiyyatdan keçə bilməyəcəyi müxtəlif xətalar baş verə bilər. Buna görə də, istifadəçinin qeydiyyatın niyə uğursuz olduğunu başa düşməsi üçün bu səhvlər haqqında mesajları göstərmək lazımdır.

Formanı göstərməzdən əvvəl sessiyadan səhv mesajlarını göstərmək üçün blok əlavə edin.

Və daha bir şey, əgər istifadəçi artıq icazəlidirsə və maraqdan brauzerin ünvan çubuğuna yazaraq birbaşa qeydiyyat səhifəsinə keçir. site_address/form_register.php, onda bu halda qeydiyyat forması əvəzinə onun artıq qeydiyyatdan keçdiyini bildirən başlıq göstərəcəyik.

Ümumiyyətlə, fayl kodu form_register.php bunu aldıq:

Artıq qeydiyyatdan keçmisiniz

Brauzerdə qeydiyyat forması olan səhifə belə görünür:


İstifadə etməklə tələb olunan atribut, biz bütün sahələri məcburi etdik.

Qeydiyyat formasının koduna diqqət yetirin captcha göstərilir:


Faylın yolunu şəkil üçün src atributunun qiymətində göstərdik captcha.php, bu captcha-nı yaradır.

Fayl koduna baxaq captcha.php:

Kod yaxşı şərh edilmişdir, ona görə də mən yalnız bir məqama diqqət yetirəcəyəm.

Funksiya daxilində imageTtfText(), şriftə gedən yol müəyyən edilir verdana.ttf. Beləliklə, captcha-nın düzgün işləməsi üçün bir qovluq yaratmalıyıq şriftlər, və şrift faylını ora yerləşdirin verdana.ttf. Siz onu tapıb internetdən yükləyə və ya bu məqalənin materialları ilə birlikdə arxivdən götürə bilərsiniz.

HTML strukturu ilə işimiz bitdi, davam etmək vaxtıdır.

JQuery istifadə edərək e-poçtun etibarlılığının yoxlanılması

İstənilən forma həm müştəri tərəfində (JavaScript, jQuery-dən istifadə etməklə), həm də server tərəfində daxil edilmiş məlumatların etibarlılığını yoxlamalıdır.

E-poçt sahəsinə xüsusi diqqət yetirməliyik. Daxil edilmiş poçt ünvanının etibarlı olması çox vacibdir.

Bu giriş sahəsi üçün e-poçt növünü təyin etdik (type="e-poçt"), bu, bizi yanlış formatlara qarşı bir az xəbərdar edir. Ancaq bu kifayət deyil, çünki brauzerin bizə təqdim etdiyi kod müfəttişi vasitəsilə biz atribut dəyərini asanlıqla dəyişə bilərik növü ilə e-poçt haqqında mətn, və budur, çekimiz artıq etibarlı olmayacaq.


Və bu halda biz daha etibarlı yoxlama aparmalıyıq. Bunun üçün JavaScript-dən jQuery kitabxanasından istifadə edəcəyik.

jQuery kitabxanasına qoşulmaq üçün faylda header.php etiketlər arasında , bağlanış etiketindən əvvəl , bu sətri əlavə edin:

Bu sətirdən dərhal sonra e-poçt doğrulama kodunu əlavə edəcəyik. Burada daxil edilmiş parolun uzunluğunu yoxlamaq üçün kod əlavə edəcəyik. Onun uzunluğu ən azı 6 simvol olmalıdır.

Bu skriptdən istifadə edərək daxil edilmiş e-poçt ünvanının etibarlılığını yoxlayırıq. Əgər istifadəçi səhv E-poçt daxil edibsə, biz bu barədə xəta mesajı göstəririk və formanı göndərmə düyməsini söndürürük. Hər şey qaydasındadırsa, o zaman xətanı aradan qaldırırıq və formanı göndər düyməsini aktivləşdiririk.

Beləliklə, biz müştəri tərəfində forma təsdiqini tamamladıq. İndi onu serverə göndərə bilərik, burada da bir neçə yoxlama aparacağıq və verilənlər bazasına məlumat əlavə edəcəyik.

İstifadəçi qeydiyyatı

Formanı emal üçün fayla göndəririk register.php, POST üsulu ilə. Bu işləyici faylının adı atribut dəyərində göstərilmişdir hərəkət. Göndərmə üsulu isə atribut dəyərində göstərilir üsul.

Bu faylı açın register.php və etməli olduğumuz ilk şey seans başlatma funksiyasını yazmaq və əvvəllər yaratdığımız faylı birləşdirməkdir dbconnect.php(Bu faylda verilənlər bazası ilə əlaqə yaratdıq). Həm də gəlin dərhal hüceyrələri elan edək xəta_mesajlarıuğur_mesajları qlobal sessiya massivində. IN xəta_mesajları biz formanın işlənməsi zamanı baş verən bütün səhv mesajlarını qeyd edəcəyik müvəffəqiyyətli_mesajlar, sevincli mesajlar yazacağıq.

Davam etməzdən əvvəl yoxlamaq lazımdır forma ümumiyyətlə təqdim olunubmu?. Təcavüzkar atribut dəyərinə baxa bilər hərəkət formadan və bu formanı hansı faylın işlədiyini öyrənin. Və o, brauzerin ünvan çubuğuna aşağıdakı ünvanı yazmaqla birbaşa bu fayla getmək fikrinə sahib ola bilər: http://site_address/register.php

Beləliklə, qlobal POST massivində adı formadakı "Qeydiyyatdan keç" düyməmizin adına uyğun gələn xananı yoxlamaq lazımdır. Bu yolla "Qeydiyyatdan keç" düyməsinin kliklənib-kliklənmədiyini yoxlayırıq.

Təcavüzkar birbaşa bu fayla daxil olmağa çalışarsa, səhv mesajı alacaq. Nəzərinizə çatdırım ki, $address_site dəyişəni saytın adını ehtiva edir və o, faylda elan edilib. dbconnect.php.

Xəta!Əsas səhifə.

"); } ?>

Sessiyadakı captcha dəyəri yaradılan zaman fayla əlavə edildi captcha.php. Xatırlatma olaraq, sizə fayldan bu kod parçasını yenidən göstərəcəyəm captcha.php, burada captcha dəyəri sessiyaya əlavə olunur:

İndi yoxlamanın özünə keçək. Faylda register.php, if blokunun içərisində "Qeydiyyatdan keç" düyməsinin basılıb-tıklanmadığını yoxlayırıq, daha doğrusu şərhin " göstərildiyi yerdə" // (1) Növbəti kod parçası üçün boşluq"Biz yazırıq:

//Qəbul edilən captcha-nı yoxlayın //Sətrin əvvəlindən və sonundan boşluqları kəsin $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Alınan dəyəri sessiyanın dəyəri ilə müqayisə edin. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Əgər captcha düzgün deyilsə, biz istifadəçini qeydiyyat səhifəsinə qaytarırıq və orada ona səhv captcha daxil etdiyinə dair səhv mesajı göstərəcəyik. $error_message = "

Xəta! Siz səhv captcha daxil etdiniz

"; // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] = $error_message; // İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: " .$address_site ."/form_register.php"); //Skriptdən çıxışı dayandırın(); ) // (2) Növbəti kod parçası üçün yerləşdirin )else( //Əgər captcha ötürülməyibsə və ya boş çıxışdırsa. ("

Xəta! Doğrulama kodu, yəni captcha kodu yoxdur. Əsas səhifəyə keçə bilərsiniz.

"); }

Sonra, POST massivindən alınan məlumatları emal etməliyik. İlk növbədə qlobal POST massivinin məzmununu, yəni adları bizim formamızdan daxil olan sahələrin adlarına uyğun gələn xanaların olub-olmadığını yoxlamaq lazımdır.

Əgər xana mövcuddursa, onda bu xanadan sətrin əvvəlindən və sonundan boşluqları kəsirik, əks halda istifadəçini qeydiyyat forması olan səhifəyə yenidən yönləndiririk.

Sonra, boşluqları kəsdikdən sonra dəyişənə sətri əlavə edirik və bu dəyişənin boşluğunu yoxlayırıq, boş deyilsə, davam edirik, əks halda istifadəçini qeydiyyat forması ilə səhifəyə yönləndiririk.

Bu kodu göstərilən yerə yapışdırın" // (2) Növbəti kod parçası üçün boşluq".

/* $_POST qlobal massivində formadan göndərilən verilənlərin olub-olmadığını yoxlayın və təqdim edilmiş məlumatları adi dəyişənlərə sarın.*/ if(isset($_POST["first_name"]))( //Boşluqları əvvəldən kəsin. və sətirin sonu $first_name = trim($_POST["first_name"]); //Dəyişkənin boşluğunu yoxlayın if(!empty($first_name))( // Təhlükəsizlik üçün xüsusi simvolları HTML obyektlərinə çevirin $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

Adınızı daxil edin

Ad sahəsi çatışmır

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_register.php"); //Skriptdən çıxışı dayandırın(); ) if( isset($_POST["last_name"]))( //Sətrin əvvəlindən və sonundan boşluqları kəsin $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // Təhlükəsizlik üçün xüsusi simvolları HTML obyektlərinə çevirin $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

Zəhmət olmasa soyadınızı daxil edin

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_register.php"); //Skriptdən çıxışı dayandırın(); ) )else ( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

Soyad sahəsi yoxdur

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_register.php"); //Skriptdən çıxışı dayandırın(); ) if( isset($_POST["email"]))( //Sətrin əvvəlindən və sonundan boşluqları kəsin $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) E-poçt ünvanının formatını və onun unikallığını yoxlamaq üçün kod yeri )else( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

E-poçtunuzu daxil edin

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_register.php"); //Skriptdən çıxışı dayandırın(); ) )else ( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_register.php"); //Skriptdən çıxışı dayandırın(); ) if( isset($_POST["password"]))( //Sətrin əvvəlindən və sonundan boşluqları kəsin $password = trim($_POST["password"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Şifrəni şifrələyin $password = md5($password."top_secret"); )else( // Səhv mesajını sessiyada saxla. $_SESSION["error_messages"] .= "

Şifrənizi daxil edin

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_register.php"); //Skriptdən çıxışı dayandırın(); ) )else ( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_register.php"); //Skriptdən çıxışı dayandırın(); ) // (4) Verilənlər bazasına istifadəçi əlavə etmək üçün kodu yerləşdirin

Sahə xüsusi əhəmiyyət kəsb edir e-poçt. Alınan poçt ünvanının formatını və verilənlər bazasında unikallığını yoxlamaq lazımdır. Yəni, artıq qeydiyyatdan keçmiş eyni e-poçt ünvanı olan istifadəçi varmı?

Göstərilən yerdə" // (3) Poçt ünvanının formatını və unikallığını yoxlamaq üçün kod yeri" aşağıdakı kodu əlavə edin:

//Qəbul edilən e-poçt ünvanının formatını $reg_email = "/^**@(+(*+)*\.)++/i" ifadəsindən istifadə edərək yoxlayın; //Əgər alınan e-poçt ünvanının formatı adi ifadə ilə uyğun gəlmirsə if(!preg_match($reg_email, $email))( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

Siz səhv e-poçt daxil etdiniz

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_register.php"); //Skriptdən çıxışı dayandırın(); ) // Biz belə bir ünvanın artıq verilənlər bazasında olub-olmadığını yoxlayırıq. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /Əgər alınanların sayı tam olaraq bir sıradırsa, bu o deməkdir ki, bu e-poçt ünvanı olan istifadəçi artıq qeydiyyatdan keçib if($result_query->num_rows == 1)( //Əgər alınan nəticə yalan deyilsə if(($row =) $result_query->fetch_assoc()) != false) ( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

Bu e-poçt ünvanı olan istifadəçi artıq qeydiyyatdan keçib

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_site."/form_register.php"); )else( // Səhv mesajını yadda saxlayın sessiyaya . $_SESSION["error_messages"] .= "

Verilənlər bazası sorğusunda xəta

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); başlıq("Yer: ".$adres_sayt."/form_register.php"); ) /* seçimi bağlamaq */ $ result_query-> close(); //Skriptdən çıxışı dayandırın(); ) /* seçimi bağlamaq */ $result_query->close();

Beləliklə, bütün yoxlamaları bitirdik, istifadəçini verilənlər bazasına əlavə etməyin vaxtı gəldi. Göstərilən yerdə" // (4) Verilənlər bazasına istifadəçi əlavə etmək üçün kodu yerləşdirin" aşağıdakı kodu əlavə edin:

//İstifadəçini verilənlər bazasına əlavə etmək üçün sorğu $result_query_insert = $mysqli->query("INSERT INTO `users` (ad, soyad, e-poçt, parol) VALUES ("".$first_name."", "".$last_name ." ", "".$e-poçt.", "".$parol."")"); if(!$result_query_insert)( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

İstifadəçinin verilənlər bazasına əlavə edilməsi sorğusunda xəta baş verdi

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_register.php"); //Skriptdən çıxışı dayandırın(); )else( $_SESSION["success_messages"] = "

Qeydiyyat uğurla başa çatdı!!!
İndi istifadəçi adı və şifrənizlə daxil ola bilərsiniz.

"; //İstifadəçini avtorizasiya səhifəsinin başlığına göndərin("HTTP/1.1 301 Daimi köçürüldü"); başlıq("Yer: ".$adres_sayt."/form_auth.php"); ) /* Sorğu tamamlanır */ $ result_query_insert-> close(); //Verilənlər bazası ilə əlaqəni bağlayın $mysqli->close();

Əgər verilənlər bazasına istifadəçi əlavə etmək sorğusunda xəta baş veribsə, biz bu xəta haqqında sessiyaya mesaj əlavə edirik və istifadəçini qeydiyyat səhifəsinə qaytarırıq.

Əks halda, hər şey qaydasındadırsa, biz də sessiyaya bir mesaj əlavə edirik, lakin bu dəfə daha xoşdur, yəni istifadəçiyə qeydiyyatın uğurlu olduğunu bildiririk. Və biz onu avtorizasiya forması ilə səhifəyə yönləndiririk.

E-poçt ünvanı formatını və parol uzunluğunu yoxlamaq üçün skript fayldadır header.php, buna görə də bu formada olan sahələrə tətbiq olunacaq.

Sessiya da faylda başlayır header.php, belə ki, faylda form_auth.php Seansa başlamağa ehtiyac yoxdur, çünki xəta alacağıq.


Artıq dediyim kimi, e-poçt ünvanı formatını və parol uzunluğunu yoxlamaq üçün skript də burada işləyir. Buna görə də, istifadəçi səhv e-poçt ünvanı və ya qısa parol daxil edərsə, dərhal səhv mesajı alacaq. Bir düymə girmək fəaliyyətsiz olacaq.

Səhvləri düzəltdikdən sonra düyməni basın girmək aktivləşir və istifadəçi formanı onun işlənəcəyi serverə təqdim edə biləcək.

İstifadəçi icazəsi

Dəyəri atribut etmək üçün hərəkət icazə handikapında müəyyən bir fayl var auth.php, bu o deməkdir ki, forma bu faylda işlənəcək.

Və beləliklə, faylı açın auth.php və icazə formasını emal etmək üçün kod yazın. Etməli olduğunuz ilk şey bir seansa başlamaq və faylı birləşdirməkdir dbconnect.php verilənlər bazasına qoşulmaq üçün.

//Formanı emal edərkən baş verə biləcək xətaları əlavə etmək üçün xana elan edin. $_SESSION["error_messages"] = ""; //Uğurlu mesajlar əlavə etmək üçün xana elan edin $_SESSION["success_messages"] = "";

/* Formanın təqdim edilib-edilmədiyini, yəni Login düyməsinin kliklədiyini yoxlayın. Əgər belədirsə, davam edirik, yoxsa, istifadəçiyə bu səhifəyə birbaşa daxil olduğunu göstərən səhv mesajı göstərəcəyik. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) Növbəti kod parçası üçün boşluq )else( exit("

Xəta! Siz bu səhifəyə birbaşa daxil olmusunuz, ona görə də emal ediləcək məlumat yoxdur. Əsas səhifəyə keçə bilərsiniz.

"); }

//Qəbul edilən captcha-nı yoxlayın if(isset($_POST["captcha"]))( //Sətrin əvvəlindən və sonundan boşluqları kəsin $captcha = trim($_POST["captcha"]); if(! empty($captcha ))( //Alınan dəyəri sessiyanın dəyəri ilə müqayisə edin. if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != "")) ( // Əgər captcha səhvdirsə, istifadəçini avtorizasiya səhifəsinə qaytarırıq və orada onun səhv captcha daxil etdiyinə dair səhv mesajı göstərəcəyik. $error_message = "

Xəta! Siz səhv captcha daxil etdiniz

"; // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] = $error_message; // İstifadəçini icazə səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: " .$address_site ."/form_auth.php"); //Skriptdən çıxışı dayandırın(); ) )else( $error_message = "

Xəta! Captcha giriş sahəsi boş olmamalıdır.

"; // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] = $error_message; // İstifadəçini icazə səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: " .$address_site ."/form_auth.php"); //Skripti dayandırın exit(); ) //(2) E-poçt ünvanının işlənilməsi üçün yer //(3) Parolun işlənilməsi üçün yer //(4) verilənlər bazasına sorğunun tərtib edilməsi )else ( //Əgər captcha keçməyibsə exit("

Xəta! Doğrulama kodu, yəni captcha kodu yoxdur. Əsas səhifəyə keçə bilərsiniz.

"); }

İstifadəçi doğrulama kodunu düzgün daxil edibsə, davam edirik, əks halda onu avtorizasiya səhifəsinə qaytarırıq.

Poçt ünvanının yoxlanılması

//Sətrin əvvəlindən və sonundan boşluqları kəsin $email = trim($_POST["email"]); if(isset($_POST["email"]))( if(!empty($email))( $email = htmlspecialchars($email, ENT_QUOTES); //Qəbul edilən e-poçt ünvanının formatını $ müntəzəm ifadəsindən istifadə edərək yoxlayın reg_email = " /^**@(+(*+)*\.)++/i"; //Əgər alınan e-poçt ünvanının formatı normal ifadə ilə uyğun gəlmirsə if(!preg_match($reg_email, $email) ))( // Sessiya xəta mesajında ​​yadda saxla. $_SESSION["error_messages"] .= "

Siz səhv e-poçt daxil etdiniz

"; //İstifadəçini avtorizasiya səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_auth.php"); //Skriptdən çıxışı dayandırın(); ) )else ( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

Poçt ünvanını (elektron poçtu) daxil etmək üçün sahə boş olmamalıdır.

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_register.php"); //Skriptdən çıxışı dayandırın(); ) )else ( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

E-poçt daxiletmə sahəsi çatışmır

"; //İstifadəçini avtorizasiya səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_auth.php"); //Skriptdən çıxışı dayandırın(); ) // (3) Parolun emalı sahəsi

İstifadəçi e-poçt ünvanını səhv formatda daxil edibsə və ya e-poçt ünvanı sahəsinin dəyəri boşdursa, biz onu bu barədə mesaj göstərdiyimiz avtorizasiya səhifəsinə qaytarırıq.

Parolun yoxlanılması

Emal ediləcək növbəti sahə parol sahəsidir. Göstərilən yerə" //(3) Parolun işlənməsi üçün yer", Biz yazırıq:

If(isset($_POST["password"]))( //Sətrin əvvəlindən və sonundan boşluqları kəsin $password = trim($_POST["password"]); if(!empty($password))( $password = htmlspecialchars($password, ENT_QUOTES); //Şifrəni şifrələyin $password = md5($password."top_secret"); )else( //Xəta mesajını sessiyada saxla. $_SESSION["error_messages"] . = "

Şifrənizi daxil edin

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_auth.php"); //Skriptdən çıxışı dayandırın(); ) )else ( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

Parol sahəsi çatışmır

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_auth.php"); //Skriptdən çıxışı dayandırın(); )

Burada qəbul edilən parolu şifrələmək üçün md5() funksiyasından istifadə edirik, çünki parollarımız verilənlər bazasında şifrələnmiş formadadır. Şifrələmədə əlavə bir gizli söz, bizim vəziyyətimizdə " tam məxfi" istifadəçini qeydiyyatdan keçirərkən istifadə edilən olmalıdır.

İndi e-poçt ünvanı qəbul edilmiş e-poçt ünvanına və parolu qəbul edilmiş parola bərabər olan istifadəçini seçmək üçün verilənlər bazasına sorğu göndərməlisiniz.

//İstifadəçinin seçiminə əsasən verilənlər bazasında sorğu. $result_query_select = $mysqli->query("SELECT * FROM `users` WHERE email = "".$email."" AND password = "".$parol."""); if(!$result_query_select)( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

Verilənlər bazasından istifadəçi seçərkən sorğu xətası

"; //İstifadəçini qeydiyyat səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_auth.php"); //Skriptdən çıxışı dayandırın(); )else( //Verilənlər bazasında belə məlumatı olan istifadəçinin olub olmadığını yoxlayın, sonra xəta mesajını göstərin if($result_query_select->num_rows == 1)( // Əgər daxil edilmiş məlumat verilənlər bazasından verilənlərə uyğun gəlirsə, onda yadda saxlayın seanslar massivinə giriş və parol. $_SESSION["email"] = $email; $_SESSION["password"] = $password; //İstifadəçini əsas səhifənin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü" ); header("Yer: ".$address_site ."/index.php"); )else( // Səhv mesajını sessiyada yadda saxlayın. $_SESSION["error_messages"] .= "

Səhv giriş və/və ya parol

"; //İstifadəçini avtorizasiya səhifəsinin başlığına qaytarın("HTTP/1.1 301 Daimi köçürüldü"); header("Yer: ".$adres_sayt."/form_auth.php"); //Skriptdən çıxışı dayandırın(); ) )

Saytdan çıxın

Və həyata keçirdiyimiz son şeydir saytı tərk etmək qaydası. Hazırda başlıqda avtorizasiya səhifəsinə və qeydiyyat səhifəsinə keçidlər göstərilir.

Saytın başlığında (fayl header.php), sessiyadan istifadə edərək istifadəçinin artıq avtorizasiya olub-olmadığını yoxlayırıq. Yoxdursa, biz qeydiyyat və avtorizasiya bağlantılarını göstəririk, əks halda (əgər o səlahiyyətlidirsə), onda qeydiyyat və avtorizasiya bağlantıları əvəzinə linki göstəririk. Çıx.

Fayldan dəyişdirilmiş kod parçası header.php:

Qeydiyyat

Çıx

Saytdan çıxış linkinə tıkladığınız zaman bir fayla keçirik çıxış.php, burada biz sadəcə olaraq sessiyadan e-poçt ünvanı və parol olan hüceyrələri məhv edirik. Bundan sonra istifadəçini keçidin kliklədiyi səhifəyə qaytarırıq çıxış.

Fayl kodu logout.php:

Hamısı budur. İndi necə olduğunu bilirsiniz qeydiyyat və icazə formalarını həyata keçirmək və emal etmək veb saytınızdakı istifadəçi. Bu formalar demək olar ki, hər bir vebsaytda mövcuddur, ona görə də hər bir proqramçı onları necə yaratmağı bilməlidir.

Həm müştəri tərəfində (brauzerdə, JavaScript, jQuery-dən istifadə etməklə), həm də server tərəfində (PHP-dən istifadə etməklə) daxil edilmiş məlumatların doğruluğunu da öyrəndik. Biz də öyrəndik saytı tərk etmək prosedurunu həyata keçirin.

Bütün skriptlər sınaqdan keçirilib və işləyir. Bu kiçik saytın faylları ilə arxivi bu linkdən yükləyə bilərsiniz.

Gələcəkdə təsvir edəcəyim bir məqalə yazacağam. Mən də izah edəcəyim bir məqalə yazmağı planlaşdırıram (səhifəni yenidən yükləmədən). Beləliklə, yeni məqalələrin buraxılışından xəbərdar olmaq üçün veb saytıma abunə ola bilərsiniz.

Hər hansı bir sualınız varsa, mənimlə əlaqə saxlayın və məqalədə hər hansı bir səhv görsəniz, mənə bildirin.

Dərs Planı (5-ci Hissə):

  1. Avtorizasiya forması üçün HTML strukturunun yaradılması
  2. Alınan məlumatları emal edirik
  3. İstifadəçinin salamını saytın başlığında göstəririk

Məqaləni bəyəndinizmi?



Saytda yeni

>

Ən məşhur