Ev Diş müalicəsi Qeydiyyatı php-də yazın. Sadə istifadəçi qeydiyyatı sistemi

Qeydiyyatı php-də yazın. Sadə istifadəçi qeydiyyatı sistemi

Salam! İndi ilə saytda ən sadə qeydiyyatı həyata keçirməyə çalışacağıq PHP istifadə edərək+ MySQL. 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əli 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/). İstifadəçilər cədvəli yaradırıq, 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 bd.php faylı yaradaq. Onun məzmunu:

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

bd.php-ni yadda saxla.
Ə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 içəridə):



Qeydiyyat


Qeydiyyat


Girişiniz:




Şifrəniz:








4. Məlumat bazasına məlumat daxil edəcək və istifadəçini saxlayacaq fayl yaradın. save_user.php (içəridə şərhlər):

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):




Əsas səhifə


Əsas səhifə


Girişiniz:


Şifrəniz:






Qeydiyyatdan keçin



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: təhlükəsizlik, dizayn, məlumat sahələri əlavə edin, avatarları yükləyin, hesabınızdan çıxın (bunun üçün sadəcə olaraq təyin olunmamış funksiya ilə sessiyadan dəyişənləri məhv edin) 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. CVE-2016-8869, CVE-2016-8870 və CVE-2016-9081 nömrələri ilə zəifliklərdən danışacağıq. Hər üçü bir kod parçasından gəlir, yəni beşdir uzun illərÇərçivənin dərinliklərində ləngiyib, qanadlarda gözləyir, yalnız sonra azad olmaq və özü ilə 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 saytında qeyd dərc edib ümumi kontur tapdığı problemdən və bu məsələ ilə bağlı düşüncələrindən danışdı. Eyni gündə çıxır yeni versiya Hələ də həssas kodu ehtiva edən Joomla 3.6.3.

Bundan sonra Davide Tampellini səhvi qeydə alınmayana qədər fırladır sadə istifadəçi, və administrator. 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 rəsmi Joomla repozitoriyasının əsas şöbəsinə 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-i olan 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”)); 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.

Controllers qovluğunda olan skriptlərin adları çağırılan kontrollerlərin adlarına uyğun gəlir. Sorğumuz indi $controller = "registration" olduğundan, register.php faylı və onun register() metodu çağırılacaq.

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, user.php faylında. 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 göndəririk (sorğu ilə ekran görüntüsünə baxın).

  • /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 işlədisə, təbrik edirik - siz sadəcə CVE-2016-8870 “yeni istifadəçilərin qeydiyyatı üçün buraxılmış icazə yoxlaması” zəifliyindən istifadə etdiniz.

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 mövcuddur 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ə üzvlük 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!

Laravel Bəstəkardan layihə asılılıqlarını idarə etməyi tələb edir. Odur ki, Laravel-i quraşdırmazdan əvvəl sisteminizdə Composer-in quraşdırıldığından əmin olun. Composer haqqında ilk dəfə eşidirsinizsə, o, php üçün npm node-a bənzər bir asılılıq idarəetmə vasitəsidir.

Composer-i maşınınıza quraşdırmaq üçün bu postu yoxlayın:

Laravel-in Windows-da quraşdırılması:

Windows maşınında laravel quraşdırmaq üçün aşağıdakı addımları yerinə yetirin. xampp/wamp yığınınız olmasından asılı olmayaraq, hər ikisi üçün işləyir. WAMP-da laravel-i "www" qovluğuna və XAMPP-ə, açıqcası "htdocs"-a quraşdırdığınızdan əmin olun.

ADDIM-1) XAMPP-də "htdocs" qovluğunu açın, SHIFT düyməsini basıb saxlayın və qovluğun üzərinə sağ vurun və "burada əmr pəncərəsini açın" seçin. Alternativ olaraq, əmr pəncərəsini aça və kataloqu "xampp/htdocs" olaraq dəyişə bilərsiniz.

ADDIM-2) Aşağıdakı əmri daxil edin.

Bəstəkar yaratmaq-layihə laravel/laravel my_laravel_site --prefer-dist

Burada "my_laravel_site" laravel fayllarının quraşdırılacağı qovluq adıdır. Bunu öz zövqünüzə görə dəyişdirin.

ADDIM-3) İndi səbirli olmaq vaxtıdır, çünki laravelin quraşdırılması bir az vaxt aparacaq.

ADDIM-4) Quraşdırıldıqdan sonra əmr sorğusunda kataloqu "my_laravel_site" (cd "my_laravel_site") olaraq dəyişdirin və aşağıdakı əmri daxil edin.

Php sənətkarı xidmət edir

ADDIM-5) Bu, url ilə birlikdə "Laravel inkişaf serveri başladı:" kimi bir mesaj göstərəcək.

ADIM-6) URL-ni kopyalayıb brauzerə yapışdırın. İşlər düzgün getsə, laravel salamlama ekranını görəcəksiniz.

ADDIM-7) Hazırdır! Siz laravel-i windows maşınına uğurla quraşdırdınız və işləməyə hazırsınız.

Tətbiq Açarının Ayarlanması:

Laravel quraşdırmadan sonra kiçik konfiqurasiya tələb edir. Bu proqram açarını təyin etməyinizi tələb edir. Bu, sessiyanın və digər həssas məlumatların şifrələnməsi üçün istifadə edilən 32 simvoldan ibarət təsadüfi sətirdir. Adətən bu, laravel-i bəstəkar və ya laravel quraşdırıcısı vasitəsilə quraşdırdığınız zaman avtomatik olaraq qurulacaq.

Qurulmayıbsa, bunu əl ilə etməlisiniz. Əvvəlcə proqram kökündə ".env.example" faylının adını ".env" olaraq dəyişdirdiyinizə əmin olun. Sonra əmr satırını açın və laravel layihə qovluğuna dəyişin. İndi açarı yaratmaq üçün aşağıdakı əmri işlədin.

Php sənətkar açarı: yaratmaq

Bu yaradılan açarı ".env" faylındakı APP_KEY dəyişəninə kopyalayın. Saxla və bitirdin.

Xüsusi Laravel Versiyasının quraşdırılması:

Yuxarıda göstərilən üsul bəstəkarı laravelin ən son versiyasını endirməyə və quraşdırmağa məcbur edəcək. Laravel-in əvvəlki versiyalarını maşınınıza quraşdırmaq istəyirsinizsə, yaratmaq-layihə əmrinə müvafiq versiya nömrəsini daxil etməyinizə əmin olun.

Composer create-project laravel/laravel=5.4 your-project-name --prefer-dist Həmçinin oxuyun:

Eynilə siz də edə bilərsiniz Windows-da bəstəkardan istifadə edərək laravel-i asanlıqla quraşdırın. Ümid edirəm ki, bu təlimatı faydalı hesab edirsiniz. Əgər bəyənirsinizsə, sosial dairənizdə paylaşın.

Qeydiyyat sisteminin yaradılması prosesi kifayət qədər böyük işdir. Siz e-poçt ünvanlarının etibarlılığını iki dəfə yoxlayan, təsdiq e-poçtları göndərən, parolu bərpa etmək imkanı təklif edən, parolları burada saxlayacaq kod yazmalısınız. təhlükəsiz yer, yoxlanılmış daxiletmə formaları və daha çox. Bütün bunları etdikdə belə, istifadəçilər qeydiyyatdan keçməkdən çəkinəcəklər, çünki ən minimal qeydiyyat belə onların fəaliyyətini tələb edir.

Bugünkü dərslikdə biz heç bir parol tələb etməyən sadə qeydiyyat sistemi hazırlayacağıq! Nəticələr asanlıqla dəyişdirilə bilən və ya mövcud PHP veb-saytına inteqrasiya oluna bilən bir sistem olacaq. Əgər maraqlanırsınızsa, oxumağa davam edin.

PHP

İndi biz PHP kodu ilə başlamağa hazırıq. Qeydiyyat sisteminin əsas funksionallığı aşağıda görə biləcəyiniz İstifadəçi sinfi tərəfindən təmin edilir. Sinif minimalist verilənlər bazası kitabxanası olan () istifadə edir. İstifadəçi sinfi verilənlər bazasına daxil olmaq, giriş əlamətləri yaratmaq və onları təsdiqləmək üçün məsuliyyət daşıyır. O, bizə PHP əsaslı vebsaytlarınızın qeydiyyat sisteminə asanlıqla daxil edilə bilən sadə interfeys təqdim edir.

User.class.php

// Şəxsi ORM nümunəsi
şəxsi $orm;

/**
* Möcüzə sətri ilə istifadəçi tapın. Yalnız etibarlı tokenlər nəzərə alınır
* nəzərə. Token yaradıldıqdan sonra 10 dəqiqə ərzində etibarlıdır.
* @param string $token Axtarış üçün nişan
* @return İstifadəçi
*/

İctimai statik funksiya findByToken($token)(

// onu verilənlər bazasında tapın və vaxt damğasının düzgün olduğundan əmin olun


-> harada("token", $token)
->where_raw("token_validity > NOW()")
->bir_tap();

Əgər(!$nəticə)(
yalanı qaytarmaq;
}

Yeni İstifadəçini qaytarın($nəticə);
}

/**
* Ya daxil olun, ya da istifadəçi qeydiyyatdan keçin.
* @return İstifadəçi
*/

İctimai statik funksiya loginOrRegister($email)(

// Əgər belə bir istifadəçi artıq varsa, onu qaytarın

Əgər(İstifadəçi::mövcuddur($e-poçt))(
yeni İstifadəçini qaytarın ($e-poçt);
}

// Əks halda onu yaradıb qaytarın

İstifadəçini qaytarın::create($email);
}

/**
* Yeni istifadəçi yaradın və onu verilənlər bazasında qeyd edin
* @param string $email İstifadəçinin e-poçt ünvanı
* @return İstifadəçi
*/

Şəxsi statik funksiya yaratmaq($email)(

// Verilənlər bazasına yeni istifadəçi yazın və onu qaytarın

$nəticə = ORM::for_table("reg_users")->yarat();
$nəticə->e-poçt = $e-poçt;
$nəticə->saxla();

Yeni İstifadəçini qaytarın($nəticə);
}

/**
* Verilənlər bazasında belə bir istifadəçinin olub-olmadığını yoxlayın və boolean qaytarın.
* @param string $email İstifadəçinin e-poçt ünvanı
* @booleanı qaytarın
*/

İctimai statik funksiya mövcuddur($email)(

// İstifadəçi verilənlər bazasında varmı?
$nəticə = ORM::for_table("reg_users")
-> harada ("e-poçt", $email)
->count();

$nəticəni qaytarın == 1;
}

/**
* Yeni istifadəçi obyekti yaradın
* @param $param ORM nümunəsi, id, e-poçt və ya null
* @return İstifadəçi
*/

İctimai funksiya __construct($param = null)(

If($param instance of ORM)(

// ORM nümunəsi keçdi
$this->orm = $param;
}
başqa if(is_string($param))(

// E-poçt göndərildi
$this->
-> harada ("e-poçt", $param)
->bir_tap();
}
başqa(

If(is_numeric($param))(
// İstifadəçi id-si parametr kimi ötürüldü
$id = $param;
}
else if(isset($_SESSION["loginid"])(

// Heç bir istifadəçi identifikatoru keçmədi, sessiyaya baxın
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
-> harada ("id", $id)
->bir_tap();
}

/**
* Yeni SHA1 giriş nişanı yaradır, onu verilənlər bazasına yazır və qaytarır.
* @qaytarma sətri
*/

İctimai funksiya generatorToken())(
// daxil olmuş istifadəçi üçün nişan yaradın. Verilənlər bazasında qeyd edin.

$token = sha1($this->email.time().rand(0, 1000000));

// Tokeni verilənlər bazasında saxla,
// və yalnız növbəti 10 dəqiqə üçün etibarlı kimi qeyd edin

$this->orm->set("token", $token);
$this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")");
$this->orm->save();

$tokeni qaytarın;
}

/**
*Bu istifadəçiyə daxil olun
* @return etibarsızdır
*/

İctimai funksiyaya giriş()

// İstifadəçini daxil olmuş kimi qeyd edin
$_SESSION["loginid"] = $this->orm->id;

// Last_login db sahəsini yeniləyin
$this->orm->set_expr("son_giriş", "İNDİ()");
$this->orm->save();
}

/**
* Sessiyanı məhv edin və istifadəçidən çıxın.
* @return etibarsızdır
*/

İctimai funksiyadan çıxış()
$_SESSION = massiv();
unset($_SESSION);
}

/**
* İstifadəçinin daxil olub-olmadığını yoxlayın.
* @booleanı qaytarın
*/

İctimai funksiya loggedIn())(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* İstifadəçinin administrator olub olmadığını yoxlayın
* @booleanı qaytarın
*/

İctimai funksiya Admin())(
$this->rank() qaytarın == "administrator";
}

/**
* İstifadəçinin növünü tapın. Bu admin və ya müntəzəm ola bilər.
* @qaytarma sətri
*/

İctimai funksiya dərəcəsi())(
if($this->orm->rank == 1)(
"administrator" ı qaytarın;
}

"müntəzəm"i qaytarın;
}

/**
* Şəxsi elementlərə daxil olmaq üçün sehrli üsul
* İstifadəçi obyektinin xassələri kimi $orm nümunəsi
* @param string $key Əldə edilmiş əmlakın adı
* @qarışıq qayıdır
*/

İctimai funksiya __get($key)(
if(isset($this->orm->$key))(
$this->orm->$açarını qaytarın;
}

Null qaytarın;
}
}
Tokenlər bir alqoritmdən istifadə edərək yaradılır və verilənlər bazasında saxlanılır. Token_validity sütununu 10 dəqiqəyə təyin etmək üçün MySQL-dən istifadə edirik. Tokeni doğrulayanda biz mühərrikə deyirik ki, bizə token lazımdır, token_validity sahəsinin müddəti hələ bitməyib. Bu yolla biz tokenin etibarlı olacağı vaxtı məhdudlaşdırırıq.

Qeyd edək ki, istifadəçi obyektinin xüsusiyyətlərinə daxil olmaq üçün sənədin sonunda __get() sehrli metodundan istifadə edirik. Bu, bizə verilənlər bazasında xassələr kimi saxlanılan məlumatlara daxil olmaq imkanı verir: $user->email, $user->token. Nümunə olaraq, bu sinfi aşağıdakı kod parçasında necə istifadə edə biləcəyimizi görək:


Lazımi funksionallığı saxlayan başqa bir fayl functions.php faylıdır. Orada kodun qalan hissəsini daha səliqəli saxlamağa imkan verən bir neçə köməkçi funksiyamız var.

Functions.php

send_email funksiyası($from, $to, $mövzu, $message)(

// E-poçt göndərmək üçün köməkçi funksiya

$headers = "MIME-versiya: 1.0" . "\r\n";
$headers .= "Məzmun növü: mətn/düz; charset=utf-8" . "\r\n";
$headers .= "Kimdən: ".$from . "\r\n";

Poçtu qaytarın ($to, $mövzu, $mesaj, $başlıqlar);
}

funksiya get_page_url())(

// PHP faylının URL-ni tapın

$url = "http".(boş($_SERVER["HTTPS"])?"":"s")."://".$_SERVER["SERVER_NAME"];

If(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")(
$url.= $_SERVER["REQUEST_URI"];
}
başqa(
$url.= $_SERVER["PATH_INFO"];
}

$url-i qaytarın;
}

funksiya dərəcəsi_limit($ip, $limit_saat = 20, $limit_10_min = 10)(

// Bu IP ünvanı ilə son bir saat ərzində giriş cəhdlərinin sayı

$count_hour = ORM::for_table("reg_login_attempt")
->
->where_raw("ts > SUBTIME(NOW(),"1:00")")
->count();

// Bu IP ünvanı ilə son 10 dəqiqə ərzində daxil olmaq cəhdlərinin sayı

$count_10_min = ORM::for_table("reg_login_attempt")
->harada("ip", sprintf("%u", ip2long($ip)))
->where_raw("ts > SUBTIME(NOW(),"0:10")")
->count();

Əgər($count_saat > $limit_saat || $count_10_min > $limit_10_min)(
yeni İstisna ("Çoxlu giriş cəhdləri!");
}
}

funksiya dərəcəsi_limit_tick($ip, $e-poçt)(

// Giriş cəhdi cədvəlində yeni qeyd yaradın

$login_attempt = ORM::for_table("reg_login_attempt")->create();

$login_attempt->e-poçt = $email;
$login_attempt->ip = sprintf("%u", ip2long($ip));

$login_attempt->save();
}

funksiyanın yönləndirilməsi($url)(
başlıq("Yer: $url");
çıxış;
}
rate_limit və rate_limit_tick funksiyaları bizə müəyyən müddət ərzində avtorizasiya cəhdlərinin sayını məhdudlaşdırmağa imkan verir. Avtorizasiya cəhdləri reg_login_attempt verilənlər bazasında qeydə alınır. Aşağıdakı kod parçasında gördüyünüz kimi, bu funksiyalar giriş forması təsdiqləndikdə işə salınır.

Aşağıdakı kod index.php saytından götürülmüşdür və giriş formasının doğrulanmasına cavabdehdir. O, assets/js/script.js-də gördüyümüz jQuery kodu ilə idarə olunan JSON cavabını qaytarır.

index.php

If(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))(

// JSON başlığını çıxarın

Başlıq("Məzmun növü: proqram/json");

// E-poçt ünvanı etibarlıdırmı?

If(!isset($_POST["email"]) || !filter_var($_POST["e-poçt"], FILTER_VALIDATE_EMAIL))(
throw new Exception("Lütfən düzgün e-poçt ünvanını daxil edin.");
}

// Əgər şəxs yuxarıdadırsa, bu, istisna təşkil edəcək
// icazə verilən giriş cəhdi məhdudiyyətləri (daha çox üçün functions.php-ə baxın):
tarif_limiti($_SERVER["REMOTE_ADDR"]);

// Bu giriş cəhdini qeyd edin
rate_limit_tick($_SERVER["uzaqdan_ADDR"], $_POST["e-poçt"]);

// İstifadəçiyə mesaj göndərin

$message = "";
$email = $_POST["e-poçt"];
$subject = "Giriş Linkiniz";

Əgər(!User::mövcuddur($e-poçt))(
$subject = "Qeydiyyatdan keçdiyiniz üçün təşəkkür edirik!";
$message = "Saytımızda qeydiyyatdan keçdiyiniz üçün təşəkkür edirik!\n\n";
}

// Şəxsiyyətə daxil olmağa və ya qeydiyyatdan keçməyə cəhd edin
$user = İstifadəçi::loginOrRegister($_POST["e-poçt"]);

$message.= "Bu URL-dən daxil ola bilərsiniz:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Link 10 dəqiqədən sonra avtomatik olaraq bitəcək.";

$nəticə = send_email($fromEmail, $_POST["e-poçt"], $mövzu, $mesaj);

Əgər(!$nəticə)(
throw new Exception("E-poçtunuzu göndərərkən xəta baş verdi. Lütfən, yenidən cəhd edin.");
}

Die(json_encode(massiv()
"message" => "Təşəkkür edirik! Gələnlər qutunuza keçid göndərdik. Spam qovluğunuzu da yoxlayın."
)));
}
}
tutmaq(İstisna $e)(

Die(json_encode(massiv()
"xəta"=>1,
"message" => $e->getMessage()
)));
}
Uğurlu avtorizasiya və ya qeydiyyatdan sonra yuxarıdakı kod avtorizasiya üçün linki olan şəxsə e-poçt göndərir. Token yaradılan URL-ə görə $_GET dəyişəni "tkn" kimi təqdim edilir.

index.php

If(isset($_GET["tkn"]))(

// Bu etibarlı giriş nişanıdır?
$user = İstifadəçi::findByToken($_GET["tkn"]);

// Bəli! İstifadəçiyə daxil olun və qorunan səhifəyə yönləndirin.

$user->login();
redirect("protected.php");
}

// Yanlış Token. Giriş formasına geri yönləndirin.
yönləndirmə("index.php");
}
$user->login() funksiyasının işlədilməsi istifadəçiyə sonrakı girişlərdə daxil olaraq qalmasına imkan verən lazımi sessiya dəyişənlərini yaradacaq.

Sistemdən çıxmaq təxminən eyni şəkildə həyata keçirilir:

Index.php

If(isset($_GET["çıxış"]))(

$user = yeni İstifadəçi();

If($user->loggedIn())(
$user->çıxış();
}

Yönləndirmə("index.php");
}
Kodun sonunda istifadəçini yenidən index.php-ə yönləndiririk, beləliklə, URL-də ?logout=1 parametri silinir.

Bizim index.php faylımız da qorunmağa ehtiyac duyacaq - biz artıq daxil olmuş istifadəçilərin formanı görməsini istəmirik. Bunun üçün $user->loggedIn() metodundan istifadə edirik:

Index.php

$user = yeni İstifadəçi();

if($user->loggedIn())(
redirect("protected.php");
}
Nəhayət, veb saytınızın səhifəsini necə qoruya biləcəyinizi və onu yalnız avtorizasiyadan sonra əlçatan edə biləcəyinizi nəzərdən keçirək:

protected.php

// Saytınızdakı istənilən php səhifəsini qorumaq üçün main.php əlavə edin
// və yeni İstifadəçi obyekti yaradın. Bu qədər sadədir!

require_once "includes/main.php";

$user = yeni İstifadəçi();

if(!$user->loggedIn())(
yönləndirmə("index.php");
}
Bu yoxlamadan sonra istifadəçinin uğurla daxil olduğuna əmin ola bilərsiniz. Siz həmçinin $user obyektinin xassələri kimi verilənlər bazasında saxlanılan məlumatlara giriş əldə edəcəksiniz. İstifadəçinin e-poçtunu və rütbəsini göstərmək üçün aşağıdakı kodu istifadə edin:

Echo "Sizin e-poçt: ".$user->email;
echo "Sizin dərəcəniz: ".$user->rank();
Burada rank() metoddur, çünki verilənlər bazasındakı dərəcə sütunu adətən nömrələrdən ibarətdir (adi istifadəçilər üçün 0 və idarəçilər üçün 1) və biz bunların hamısını rütbə adlarına çevirməliyik ki, bu da istifadə etməklə həyata keçirilir. bu üsul. Standart istifadəçini administratora çevirmək üçün phpmyadmin-də (və ya hər hansı digər verilənlər bazası proqramında) istifadəçinin girişini redaktə etmək kifayətdir. İdarəçi olaraq istifadəçinin heç bir hüququ olmayacaq xüsusi xüsusiyyətlər. İnzibatçılara hansı hüquqların verilməsini özünüz seçmək hüququnuz var.

Hazır!

Bununla bizim sadə qeydiyyat sistemimiz hazırdır! Siz onu mövcud PHP saytında istifadə edə və ya öz tələblərinizə uyğun olaraq modernləşdirə bilərsiniz.

Reg.ru: domenlər və hostinq

Rusiyada ən böyük qeydiyyatçı və hostinq provayderi.

2 milyondan çox domen adı xidmətdədir.

Təqdimat, domen poçtu, biznes həlləri.

Dünya üzrə 700 mindən çox müştəri artıq öz seçimini edib.

*Sürüşməni dayandırmaq üçün siçanın üzərinə keçin.

Geri irəli

PHP və MySQL-də sadə istifadəçi qeydiyyatı sisteminin yaradılması

Qeydiyyat sisteminin yaradılması çox işdir. Siz e-poçt ünvanlarını təsdiqləyən, qeydiyyatı təsdiqləyən e-poçt göndərən, həmçinin digər forma sahələrini təsdiq edən və daha çox kod yazmalısınız.

Və bütün bunları yazdıqdan sonra da istifadəçilər qeydiyyatdan keçməkdən çəkinəcəklər, çünki... bu, onlardan müəyyən səy tələb edir.

Bu dərslikdə biz parolları heç tələb etməyən və ya saxlamayan çox sadə qeydiyyat sistemi yaradacağıq! Nəticəni dəyişdirmək və mövcud PHP saytına əlavə etmək asan olacaq. Bunun necə işlədiyini öyrənmək istəyirsiniz? Aşağıda oxuyun.



Super sadə sistemimiz necə işləyəcək:

Biz icazə formasını və qeydiyyatı birləşdirəcəyik. Bu formada e-poçt ünvanınızı daxil etmək üçün sahə və qeydiyyat düyməsi olacaq;
- E-poçt ünvanı ilə sahəni doldurarkən, qeydiyyat düyməsinə klikləməklə, yeni istifadəçi haqqında qeyd yaradılacaq, ancaq daxil edilmiş e-poçt ünvanı verilənlər bazasında tapılmadıqda.

Bundan sonra, təsadüfi unikal simvol dəsti (token) yaradılır, bu, istifadəçi tərəfindən göstərilən e-poçta 10 dəqiqə ərzində uyğun olacaq bir keçid şəklində göndərilir;
- Link istifadəçini saytımıza aparır. Sistem bir işarənin mövcudluğunu müəyyən edir və istifadəçiyə icazə verir;

Bu yanaşmanın üstünlükləri:

Parolları saxlamağa və ya sahələri təsdiqləməyə ehtiyac yoxdur;
- Parolunuzu, təhlükəsizlik suallarınızı və s. bərpa etməyə ehtiyac yoxdur;
- İstifadəçi qeydiyyatdan keçdiyi/daxil olduğu andan siz həmişə əmin ola bilərsiniz ki, bu istifadəçi sizin giriş zonanızda olacaq (e-poçt ünvanı doğrudur);
- İnanılmaz dərəcədə sadə qeydiyyat prosesi;

Qüsurlar:

İstifadəçi hesabının təhlükəsizliyi. Kiminsə istifadəçinin poçtuna girişi varsa, daxil ola bilər.
- E-poçt təhlükəsiz deyil və ələ keçirilə bilər. Nəzərə alın ki, bu sual parolun unudulmuş və bərpa edilməli olduğu halda və ya məlumat ötürülməsi üçün HTTPS-dən istifadə etməyən hər hansı avtorizasiya sistemində (giriş/parol) da aktualdır;
- Siz poçt serverinizi düzgün konfiqurasiya etsəniz, avtorizasiya keçidləri olan mesajların spama düşmə ehtimalı var;

Sistemimizin üstünlükləri və çatışmazlıqlarını müqayisə edərək deyə bilərik ki, sistem yüksək istifadə qabiliyyətinə (son istifadəçi üçün maksimum rahatlıq) malikdir və eyni zamanda, aşağı təhlükəsizlik göstəricisinə malikdir.

Buna görə də ondan vacib məlumatlarla işləməyən forumlarda və xidmətlərdə qeydiyyat üçün istifadə etmək tövsiyə olunur.

Bu sistemdən necə istifadə etmək olar

Saytınızdakı istifadəçilərə icazə vermək üçün sadəcə bir sistemdən istifadə etməlisinizsə və bu dərsi parça-parça etmək istəmirsinizsə, aşağıdakıları etməlisiniz:

Dərsə əlavə edilmiş mənbələri yükləmək lazımdır
- Arxivdə tables.sql faylını tapın. Alternativ yol: bu faylı vasitəsilə açın mətn redaktoru, SQL sorğusunu kopyalayın və icra edin;
- include/main.php faylını açın və verilənlər bazanızla əlaqə yaratmaq üçün parametrləri doldurun (verilənlər bazası ilə əlaqə üçün istifadəçi və parol, həmçinin verilənlər bazasının host və adını göstərin). Eyni faylda sistem tərəfindən göndərilən mesajlar üçün orijinal ünvan kimi istifadə olunacaq e-poçtu da göstərməlisiniz. Formada hostun idarəetmə panelindən yaradılmış həqiqi e-poçt ünvanı olmadıqda bəzi hostlar gedən e-poçtları bloklayır, ona görə də real ünvan göstərin;
- Bütün index.php , protected.php faylları və aktivləri və FTP vasitəsilə qovluqları hostunuza yükləyin;
- Giriş formasını göstərmək istədiyiniz hər bir PHP səhifəsinə aşağıdakı kodu əlavə edin;

Require_once "includes/main.php"; $user = yeni İstifadəçi(); if(!$user->loggedIn())( redirect("index.php"); )
- Hazır!

Bütün bunların necə işlədiyi ilə maraqlananlar üçün aşağıda oxuyun!

İlk addım avtorizasiya forması üçün HTM kodunu yazmaqdır. Bu kod index.php faylında yerləşir. Bu fayl həmçinin forma məlumatlarını və digər faydalı giriş sistemi funksiyalarını idarə edən PHP kodunu ehtiva edir. Bu barədə ətraflı məlumatı PHP kodunun nəzərdən keçirilməsinə həsr olunmuş aşağıdakı bölmədə öyrənə bilərsiniz.

index.php

Dərslik: PHP və MySQL Girişi və ya Qeydiyyatı ilə Super Sadə Qeydiyyat Sistemi

Yuxarıda e-poçt ünvanınızı daxil edin və biz göndərəcəyik
Sizə giriş linki.

Giriş/Qeydiyyat

Başlıq bölməsinə (və teqlər arasında) əsas üslubları daxil etdim (onlar bu dərslikdə əhatə olunmur, ona görə də onlara özünüz baxa bilərsiniz. Qovluq aktivləri/css/style.css). Bağlama teqindən əvvəl jQuery kitabxanasını və aşağıda yazıb təhlil edəcəyimiz script.js faylını daxil etdim.


JavaScript

jQuery funksiyadan istifadə edərək "Qeydiyyat/Giriş" düyməsinin vəziyyətini izləyir e.preventDefault() və AJAX sorğularını göndərir. Serverin cavabından asılı olaraq bu və ya digər mesajı göstərir və müəyyən edir əlavə tədbirlər/

assets/js/script.js

$(function())( var forma = $("#login-register"); form.on("göndər", funksiya(e)( if(form.is(".loading, .loggedIn"))( qaytar false ; ) var email = form.find("input").val(), messageHolder = form.find("span"); $.post(this.action, (email: email), funksiya (m)(if (m.error)(form.addClass("xəta"); messageHolder.text(m.message); ) else(form.removeClass("xəta").addClass("loggedIn"); messageHolder. text(m.message) ); ) )); $(sənəd).ajaxStart(funksiya())(form.addClass("yüklənir"); )); ;

göstərmək üçün forma əlavə edilmişdir hazırki vəziyyət AJAX sorğusu (bu üsullar sayəsində mümkün olmuşdur ajaxStart()) Və ajaxComplete(), faylın sonunda tapa bilərsiniz).

Bu sinif fırlanan animasiyalı GIF faylını nümayiş etdirir (sanki bizə sorğunun işləndiyinə işarə edir) və həmçinin formanın yenidən təqdim edilməsinin qarşısını almaq üçün bayraq rolunu oynayır (qeydiyyat düyməsi artıq bir dəfə kliklədikdə). .loggedIn sinfi başqa bir bayraqdır - o, e-poçt göndərildiyi zaman təyin edilir. Bu bayraq forma ilə hər hansı digər hərəkətləri dərhal bloklayır.

Verilənlər bazası sxemi

Bizim inanılmaz sadə giriş sistemimiz 2 MySQL cədvəlindən istifadə edir (SQL kodu tables.sql faylındadır). Birincisi istifadəçi hesabları haqqında məlumatları saxlayır. İkincisi, giriş cəhdlərinin sayı haqqında məlumatları saxlayır.


İstifadəçi cədvəlinin sxemi.

Sistem diaqramda göründüyü kimi parollardan istifadə etmir. Onda siz token_validity sütununa bitişik tokenləri olan token sütununu görə bilərsiniz. Token istifadəçi sistemə qoşulan və e-poçtunu mesaj göndərmək üçün təyin edən kimi quraşdırılır (bu barədə daha ətraflı növbəti blokda). Token_validity sütunu vaxtı 10 dəqiqə sonra təyin edir, bundan sonra nişan artıq etibarlı deyil.


Avtorizasiya cəhdlərinin sayını hesablayan cədvəl sxemi.

Hər iki cədvəldə IP ünvanı tam ədəd tipli sahədə ip2long funksiyasından istifadə edərək işlənmiş formada saxlanılır.

İndi bəzi PHP kodu yaza bilərik. Sistemin əsas funksionallığı aşağıda görə biləcəyiniz User.class.php sinfinə təyin olunub.

Bu sinif fəal şəkildə idorm (sənədlər) istifadə edir, bu kitabxanalar verilənlər bazası ilə işləmək üçün minimum zəruri alətlərdir. O, verilənlər bazasına daxil olmaq, mö'cüzə yaratma və token təsdiqini idarə edir. O, PHP istifadə edirsə, qeydiyyat sistemini saytınıza qoşmağı asanlaşdıran sadə interfeys təqdim edir.

User.class.php

Class User( // Private ORM case private $orm; /** * İstifadəçini token üzrə tapın. Yalnız etibarlı tokenlər nəzərdən keçirilmək üçün qəbul edilir. Token yaradıldığı andan yalnız 10 dəqiqə ərzində yaradılır * @param string $token . Bu, axtardığımız nişandır * @return İstifadəçi İstifadəçi funksiyasının dəyərini qaytarın */ ictimai statik funksiya findByToken($token)( // verilənlər bazasında nişanı tapın və düzgün vaxt damğasının qoyulduğundan əmin olun. nəticə = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(!$result)( return false; ) new User($result) /** *); istifadəçiyə icazə verin və ya qeydiyyatdan keçirin * @param string $email İstifadəçinin e-poçt ünvanı * @return İstifadəçi */ ictimai statik funksiya loginOrRegister($email)( // Əgər belə istifadəçi. artıq mövcuddursa, verilənlər bazasında saxlanılan müəyyən e-poçt ünvanından İstifadəçi funksiyasının dəyərini qaytarın, əgər(User::exists($email))( return new User($email); ) // Əks halda, yeni istifadəçi yaradın. verilənlər bazası yaradın və göstərilən e-poçtdan User::create funksiyasının dəyərini qaytarın User::create($email ); ) /** * Yeni istifadəçi yaradın və verilənlər bazasında saxlayın * @param string $email. İstifadəçi e-poçt ünvanı * @return İstifadəçi */ şəxsi statik funksiya yaratmaq($email)( // Yeni istifadəçi yazın və İstifadəçi funksiyasının nəticəsini bu dəyərlərdən qaytarın $result = ORM::for_table("reg_users")- >create(); $reult->email = $reult->save(); dəyişən * @param sətri $e-poçt. İstifadəçi e-poçt ünvanı * @return boolean */ ictimai statik funksiya mövcuddur($email)( // İstifadəçi verilənlər bazasında varmı? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; null) ( if($param instanceof ORM)( // ORM yoxlanışı keçdi $this->orm = $param; ) else if(is_string($param))( // E-poçt yoxlanışı keçdi $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one( ) else( $id = 0; if(is_numeric($param))( // $param $ dəyişəninin dəyəri id istifadəçi identifikatoruna ötürülür = $param ) else if(isset($_SESSION["loginid"]))( // Əks halda seansa baxın $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one() ) ) /** * Yeni SHA1 icazə nişanı yaradın, onu verilənlər bazasına yazır və dəyərini qaytarır * @ return string */ public function generateToken( )( // Səlahiyyətli istifadəçi üçün nişan yaradın və onu verilənlər bazasında saxlayın $token = sha1($this->email.time().rand(0, 1000000)); // Tokeni verilənlər bazasında saxla // Və onun yalnız növbəti 10 dəqiqə ərzində etibarlı olduğunu qeyd edin $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); $tokeni qaytarın; ) /** * İstifadəçiyə icazə verin * @return void */ ictimai funksiya login())( // İstifadəçini daxil olmuş kimi qeyd edin $_SESSION["loginid"] = $this->orm->id; // Yeniləyin last_login verilənlər bazası sahəsinin dəyəri $this->orm->set_expr("son_giriş", "NOW()"); * @return void */ ictimai funksiyadan çıxış ()( $_SESSION = array(); unset($_SESSION); ) /** * İstifadəçinin daxil olub-olmadığını yoxlayın * @return boolean */ ictimai funksiya loggedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id ) /** * İstifadəçinin administrator olub-olmadığını yoxlayır * @return boolean */ ictimai funksiya isAdmin())( return $this->rank() = = "administrator"; ) /** * İstifadəçi tipini tapın, administrator və ya adi ola bilər * @return sətri */ ictimai funksiya rank())( if( $this->orm->rank == 1)( "administrator" qaytarın "; ) "normal" qaytarın; ) /** * İstifadəçinin şəxsi məlumatını *İstifadəçi obyektinin xassələri kimi əldə etməyə imkan verən metod * @param string $key Giriş əldə edən əmlakın adı * @return mixed */ ictimai funksiya __get($key)( if(isset($this->orm->$key))( return $this->orm->$ açar; ) null qaytarmaq; ) )

Tokenlər SHA1 alqoritmi ilə yaradılır və verilənlər bazasında saxlanılır. Tokenin etibarlılığı üçün 10 dəqiqəlik vaxt məhdudiyyəti təyin etmək üçün MySQL-in zamanlama funksiyalarından istifadə edirəm.

Token təsdiq edildikdə, biz birbaşa idarəçiyə deyirik ki, biz yalnız hələ bitməmiş, token_validity sütununda saxlanılan tokenləri nəzərdən keçiririk.

Nəzərə alın ki, mən sehrli üsuldan istifadə edirəm __almaqİstifadəçi obyektinin xassələrinə girişi dayandırmaq üçün faylın sonunda docs kitabxanası.

Bunun sayəsində, $user->email, $user->token və s. xassələri sayəsində verilənlər bazasında saxlanılan məlumatlara daxil olmaq mümkün olur. Növbəti kod fraqmentində nümunə olaraq bu siniflərdən necə istifadə olunacağına baxacağıq. .


Qorunan səhifə

Faydalı və zəruri funksionallığı saxlayan başqa bir fayl functions.php faylıdır. Bir neçə sözdə köməkçi var - digər fayllarda daha təmiz və daha oxunaqlı kod yaratmağa imkan verən köməkçi funksiyalar.

functions.php

send_email funksiyası($from, $to, $subject, $message)( // E-poçt göndərən köməkçi $headers = "MIME-Versiya: 1.0" . "\r\n"; $headers .= "Məzmun növü: mətn /plain; charset=utf-8" . "\r\n"; $headers .= "Kimdən: ".$from . "\r\n"; poçtu qaytarın($to, $subject, $message, $headers ) funksiyası get_page_url())( // PHP faylının URL-ni təyin edin $url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://" .$_SERVER ["SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) else( $url = $_SERVER["PATH_INFO"] ) return $url funksiyası rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Bu IP ünvanı üçün $count_hour; = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00" )") ->count(); // Bu IP ünvanı üçün son 10 dəqiqə ərzində giriş cəhdlərinin sayı $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u" , ip2long($ ip))) ->where_raw("ts > SUBTIME(NOW(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( atmaq yeni İstisna("Həddindən artıq giriş cəhdləri!"); ) ) funksiya rate_limit_tick($ip, $email)( // Cədvəldə yeni qeyd yaradın bu giriş cəhdlərinin sayını hesablayır $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->save( ) funksiyası yönləndirmə($url)( başlıq("Yer: $url"); exit; )

Funksiyalar dərəcə_limitidərəcə_limiti_qeyd ilk cəhddən bəri keçən müddət ərzində icazə cəhdlərinin sayına nəzarət edin. Giriş cəhdi verilənlər bazasında reg_login_attempt sütununda qeyd olunur. Bu funksiyalar aşağıdakı kod parçasından göründüyü kimi forma məlumatları emal edildikdə və təqdim edildikdə çağırılır.

Aşağıdakı kod index.php faylından götürülmüşdür və formanın təqdim edilməsini idarə edir. O, JSON cavabını qaytarır, bu da öz növbəsində daha əvvəl baxdığımız assets/js/script.js faylında jQuery tərəfindən işlənir.

index.php

Çalışın( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // JSON başlıq başlığını çıxarın("Məzmun növü: proqram/json"); // Bu e-poçt ünvanı etibarlıdırmı (!isset($_POST["email"]) || !filter_var($_POST["e-poçt"], FILTER_VALIDATE_EMAIL))( yeni İstisna ("Lütfən düzgün e-poçt daxil edin."); ) // Yoxlayın istifadəçi daxil olmağa icazə verdi, icazə verilən bağlantıların sayını keçib (ətraflı məlumat üçün functions.php faylı) rate_limit($_SERVER["REMOTE_ADDR"] // Bu icazə cəhdini qeyd edin rate_limit_tick($_SERVER["REMOTE_ADDR"]); , $ _POST["email"]); // İstifadəçiyə e-poçt göndərin $message = ""; $_POST = "Sizin Giriş Linkiniz"; Qeydiyyatdan keçdiyiniz üçün təşəkkür edirik!"; $message = "Saytımızda qeydiyyatdan keçdiyiniz üçün təşəkkür edirik!\n\n"; ) // İstifadəçiyə icazə verməyə və ya qeydiyyatdan keçirməyə cəhd edin $user = User::loginOrRegister($_POST[ "email"] ); $message.= "Bu URL-dən daxil ola bilərsiniz:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Link 10 dəqiqədən sonra avtomatik olaraq bitəcək."; $nəticə = send_email($fromEmail, $_POST["e-poçt"], $mövzu, $mesaj); if(!$result)( throw new Exception("E-poçtunuzu göndərərkən xəta baş verdi. Lütfən, yenidən cəhd edin."); ) die(json_encode(array("message" => "Təşəkkür edirik! Biz\"link göndərdik spam qovluğunuzu yoxlayın."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() )));

Uğurlu giriş/qeydiyyatdan sonra yuxarıdakı kod istifadəçiyə giriş linki göndərəcək. Token əlçatan olur, çünki üsulla yaradılan keçiddə dəyişən kimi ötürülür $_GET tkn marker ilə

index.php

If(isset($_GET["tkn"]))( // Bu işarə avtorizasiya üçün etibarlıdırmı? $user = User::findByToken($_GET["tkn"]); if($user)( // Bəli , Redirect to the protected page ("protected.php"); ).");

$user->login()

seans üçün lazımi dəyişənləri yaradacaq ki, istifadəçi saytın sonrakı səhifələrinə baxaraq hər zaman avtorizasiyada qalsın.

Sistemdən çıxmaq üçün funksiyanın işlənməsi oxşar şəkildə təşkil edilir.

index.php

If(isset($_GET["çıxış"]))( $user = new User(); if($user->loggedIn())( $user->logout(); ) redirect("index.php") )

Kodun sonunda mən yenidən index.php-ə yönləndirmə təyin etdim, buna görə parametr ?çıxış=1 URL vasitəsilə ötürülməsi tələb olunmur.

Bizim index.php faylımız əlavə tələb edir. müdafiə - sistemə daxil olmuş insanların qeydiyyat formasını yenidən görməsini istəmirik. Bu məqsədlər üçün metoddan istifadə edirik $user->loggedIn().

index.php

$user = yeni İstifadəçi(); if($user->loggedIn())( redirect("protected.php"); )

Nəhayət, burada saytınızın səhifələrini qorumağa və onu yalnız avtorizasiyadan sonra əlçatan etməyə imkan verən bir kod parçası var.

protected.php

// Saytınızdakı hər səhifəni qorumaq üçün main.php faylını daxil edin // və yeni İstifadəçi obyekti yaradın. Bu qədər asandır! require_once "includes/main.php"; $user = yeni İstifadəçi(); if(!$user->loggedIn())( redirect("index.php"); )

Bu yoxlamadan sonra istifadəçinin uğurla avtorizasiya olunduğuna əmin ola bilərsiniz. Siz həmçinin obyekt xassələrindən istifadə edərək verilənlər bazasında saxlanılan məlumatlara daxil ola bilərsiniz $user. İstifadəçinin e-poçtunu və statusunu göstərmək üçün bu kodu istifadə edin:

Echo "Sizin e-poçt: ".$user->email; echo "Sizin dərəcəniz: ".$user->rank();

Metod dərəcə() burada istifadə olunur, çünki verilənlər bazası adətən nömrələri saxlayır (adi istifadəçi üçün 0, idarəçi üçün 1) və biz bu məlumatları aid olduqları statuslara çevirməliyik ki, bu metod bizə kömək edir.

Adi istifadəçini administrator etmək üçün phpMyAdmin (və ya verilənlər bazasını idarə etməyə imkan verən hər hansı digər proqram) vasitəsilə istifadəçi qeydini redaktə etmək kifayətdir. Bu nümunədə administrator statusu heç bir imtiyaz vermir, səhifə sizin idarəçi olduğunuzu göstərəcək - vəssalam.

Ancaq bununla nə etmək sizin ixtiyarınızdadır, idarəçilər üçün müəyyən imtiyazlar və imkanlar təyin edən kodu özünüz yaza və tərtib edə bilərsiniz.

Bitirdik!

Bu inanılmaz super kvazi sadə forma ilə işimiz bitdi! Siz onu PHP saytlarınızda istifadə edə bilərsiniz, bu olduqca sadədir. Siz də onu özünüz üçün dəyişdirə və istədiyiniz kimi edə bilərsiniz.

Material Denis Malışok tərəfindən xüsusi olaraq vebsayt üçün hazırlanmışdır

P.S. PHP və OOP dillərini mənimsəməkdə daha da irəliləmək istəyirsiniz? PHP-də proqramlaşdırma da daxil olmaqla vebsaytın qurulmasının müxtəlif aspektləri üzrə premium dərslərə, həmçinin OOP-dan istifadə edərək PHP-də sıfırdan öz CMS sisteminizi yaratmaq üçün pulsuz kursa diqqət yetirin:

Materialı bəyəndiniz və mənə təşəkkür etmək istəyirsiniz?
Sadəcə dostlarınız və həmkarlarınızla paylaşın!




Saytda yeni

>

Ən məşhur