Uy Stomatologiya Ro'yxatdan o'tishni php da yozing. Oddiy foydalanuvchi ro'yxatga olish tizimi

Ro'yxatdan o'tishni php da yozing. Oddiy foydalanuvchi ro'yxatga olish tizimi

Salom! Endi biz saytdagi eng oddiy ro'yxatdan o'tishni amalga oshirishga harakat qilamiz PHP yordamida+ MySQL. Buning uchun kompyuteringizga Apache o'rnatilishi kerak. Bizning skriptimizning ishlash printsipi quyida ko'rsatilgan.

1. Ma’lumotlar bazasida foydalanuvchilar jadvalini yaratishdan boshlaylik. U foydalanuvchi ma'lumotlarini (login va parol) o'z ichiga oladi. Keling, phpmyadmin ga o'tamiz (agar siz shaxsiy kompyuteringizda ma'lumotlar bazasini yaratayotgan bo'lsangiz). http://localhost/phpmyadmin/). Biz jadval yaratamiz foydalanuvchilar , unda 3 ta maydon bo'ladi.

Men uni mysql ma'lumotlar bazasida yarataman, siz uni boshqa ma'lumotlar bazasida yaratishingiz mumkin. Keyin qiymatlarni rasmdagi kabi o'rnating:

2. Ushbu jadvalga ulanish talab qilinadi.

Keling, bd.php faylini yaratamiz. Uning tarkibi:

Mening holatimda bu shunday ko'rinadi:
bd.php ni saqlang.

Ajoyib! Bizda ma'lumotlar bazasida jadval va unga ulanish mavjud. Endi siz foydalanuvchilar o'z ma'lumotlarini qoldiradigan sahifani yaratishni boshlashingiz mumkin.



3. Tarkibga ega reg.php faylini yarating (barcha izohlar ichidagi):


3. Tarkibga ega reg.php faylini yarating (barcha izohlar ichidagi):


Roʻyxatdan oʻtish




Sizning login:








Sizning parolingiz:

4. Ma'lumotlar bazasiga ma'lumotlarni kiritadigan va foydalanuvchini saqlaydigan fayl yarating. save_user.php (ichki sharhlar):




5. Endi bizning foydalanuvchilarimiz ro'yxatdan o'tishlari mumkin!


5. Endi bizning foydalanuvchilarimiz ro'yxatdan o'tishlari mumkin!


Roʻyxatdan oʻtish


Sizning login:






Keyinchalik, allaqachon ro'yxatdan o'tgan foydalanuvchilar uchun saytga kirish uchun "eshik" yaratishingiz kerak. index.php (ichki sharhlar):



Bosh sahifa

Roʻyxatdan oʻtish

Xo'sh, hammasi shu! Dars zerikarli bo'lishi mumkin, lekin juda foydali. Bu erda faqat ro'yxatdan o'tish g'oyasi ko'rsatilgan, keyin siz uni yaxshilashingiz mumkin: xavfsizlik, dizayn, ma'lumotlar maydonlarini qo'shing, avatarlarni yuklang, hisobingizdan chiqing (buni amalga oshirish uchun o'rnatilmagan funksiya bilan seansdagi o'zgaruvchilarni yo'q qilish kifoya) va hokazo. Omad tilaymiz! Men hamma narsani tekshirdim, u to'g'ri ishlaydi! Ramkaning tubida cho'kib, qanotlarda kutib, shundan keyingina ozod bo'lish va o'zi bilan tartibsizlik, buzilgan saytlar va ushbu Joomla-ning begunoh foydalanuvchilarining ko'z yoshlarini olib kelish uchun. Faqat monitorlarning yorug'ligidan ko'zlari qizarib ketgan va klaviaturalari non bo'laklari bilan to'ldirilgan eng jasur va jasur ishlab chiquvchilar g'azablangan yovuz ruhlarga qarshi tura oldilar va boshlarini tuzatish qurbongohiga qo'ydilar.

OGOHLANTIRISH Barcha ma'lumotlar faqat ma'lumot olish uchun berilgan. Na muharrirlar, na muallif ushbu maqola materiallaridan kelib chiqishi mumkin bo'lgan har qanday zarar uchun javobgar emas. Hammasi qaerdan boshlangan

2016-yil 6-oktabrda Demis Palma Stack Exchange-da mavzu yaratdi, unda u savol berdi: nima uchun aslida Joomla 3.6 versiyasida bir xil nomli registr() bilan foydalanuvchilarni ro‘yxatdan o‘tkazishning ikkita usuli bor? Birinchisi UsersControllerRegistration boshqaruvchisida, ikkinchisi UsersControllerUser kontrollerida. Damis qayerdadir UsersControllerUser::register() usuli ishlatilganmi yoki bu eski mantiqdan qolgan evolyutsion anaxronizmmi, bilishni xohladi. Uning tashvishi shundaki, agar bu usul hech qanday ko'rinish tomonidan qo'llanilmasa ham, uni tayyorlangan so'rov orqali chaqirish mumkin edi. Men itoctopus taxallusi ostida ishlab chiquvchidan javob oldim, u tasdiqladi: muammo haqiqatan ham mavjud. Va Joomla dasturchilariga hisobot yubordi.

Keyin voqealar eng tez rivojlandi. 18-oktabr kuni Joomla ishlab chiquvchilari Damisning hisobotini qabul qilishdi, u o‘sha vaqtga kelib foydalanuvchilarni ro‘yxatdan o‘tkazish imkonini beruvchi PoC loyihasini ishlab chiqqan edi. U o'z veb-saytida qayd e'lon qildi, qaerda umumiy kontur topilgan muammo va bu boradagi fikrlari haqida gapirdi. Xuddi shu kuni chiqadi yangi versiya Hali ham zaif kodni o'z ichiga olgan Joomla 3.6.3.

Shundan so'ng Davide Tampellini xatoni ro'yxatdan o'tgunga qadar aylantiradi oddiy foydalanuvchi, va administrator. Va 21 oktyabr kuni Joomla xavfsizlik guruhiga yangi ish keladi. Bu allaqachon imtiyozlarni oshirish haqida gapiradi. Shu kuni Joomla veb-saytida 25-oktabr, seshanba kuni tizim yadrosidagi muhim zaiflikni tuzatuvchi 3.6.3 seriya raqamiga ega navbatdagi versiya chiqarilishi haqida e’lon paydo bo‘ldi.

25 oktyabr Joomla Security Strike Team Damis tomonidan topilgan kod bo'lagi tomonidan yaratilgan so'nggi muammoni topdi. Keyin 21-oktabrdagi ko‘zga ko‘rinmas nomli “Prepare 3.6.4 Stabil Release” nomli majburiyat rasmiy Joomla omborining asosiy bo‘limiga yuboriladi, bu noxush xatoni tuzatadi.

Bu chiqqandan so'ng, ko'plab manfaatdor shaxslar dasturchilar hamjamiyatiga qo'shilishadi - ular zaiflikni targ'ib qilishni va ekspluatatsiyalarni tayyorlashni boshlaydilar.

27-oktabrda tadqiqotchi Garri Roberts Xiphos Research omboriga PHP faylini zaif CMSga ega serverga yuklay oladigan tayyor ekspluatatsiyani yukladi.

Tafsilotlar

Xo'sh, fon tugadi, keling, eng qiziqarli qismga - zaiflikni tahlil qilishga o'tamiz. Men Joomla 3.6.3 ni sinov versiyasi sifatida o'rnatdim, shuning uchun barcha qator raqamlari ushbu versiya uchun tegishli bo'ladi. Va siz quyida ko'radigan fayllarning barcha yo'llari o'rnatilgan CMS ildiziga nisbatan ko'rsatiladi.

Damis Palmaning kashfiyoti tufayli biz tizimda foydalanuvchi ro'yxatini amalga oshiradigan ikkita usul mavjudligini bilamiz. Birinchisi CMS tomonidan qo'llaniladi va /components/com_users/controllers/registration.php:108 faylida joylashgan. Ikkinchisi (biz qo'ng'iroq qilishimiz kerak bo'lgan) /components/com_users/controllers/user.php:293 da yashaydi. Keling, buni batafsil ko'rib chiqaylik.

286: /** 287: * Foydalanuvchini ro'yxatdan o'tkazish usuli. 288: * 289: * @return boolean 290: * 291: * @1,6 dan beri 292: */ 293: umumiy funksiya registr() 294: ( 295: JSession::checkToken("post") yoki jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Form ma'lumotlarini oling: $this->input->post->get("user", "array"); 315: $return = $model->validate($form, $data 316: 317: // Xatolarni tekshiring: agar ($return === false) 319: ( ... 345: / /). Ro'yxatdan o'tishni tugating 346: $return = $model->register($data);

Bu erda men faqat qiziqarli satrlarni qoldirdim. Zaif usulning to'liq versiyasini Joomla omborida ko'rish mumkin.

Keling, oddiy foydalanuvchi ro'yxatga olish paytida nima sodir bo'lishini aniqlaylik: qanday ma'lumotlar yuboriladi va ular qanday qayta ishlanadi. Sozlamalarda foydalanuvchini roʻyxatdan oʻtkazish yoqilgan boʻlsa, shaklni http://joomla.local/index.php/component/users/?view=registration sahifasida topish mumkin.


Qonuniy foydalanuvchini ro'yxatdan o'tkazish so'rovi quyidagi skrinshotga o'xshaydi.


com_users komponenti foydalanuvchilar bilan ishlash uchun javobgardir. So'rovdagi vazifa parametriga e'tibor bering. U $controller.$method formatiga ega. Keling, fayl tuzilishini ko'rib chiqaylik.

Controllers papkasidagi skriptlarning nomlari chaqirilgan kontrollerlarning nomlariga mos keladi. Bizning so'rovimizda hozir $controller = "registration" mavjud bo'lgani uchun register.php fayli va uning register() usuli chaqiriladi.

Diqqat, savol: ro'yxatga olish jarayonini kodning zaif joyiga qanday o'tkazish kerak? Ehtimol, siz allaqachon taxmin qilgansiz. Zaif va haqiqiy usullarning nomlari bir xil (ro'yxatga olish), shuning uchun biz chaqirilgan kontroller nomini o'zgartirishimiz kerak. Bizning zaif boshqaruvchimiz qayerda joylashgan? Bu to'g'ri, user.php faylida. Ma'lum bo'lishicha, $controller = "user" . Har bir narsani birlashtirib, biz vazifa = user.register olamiz. Endi ro'yxatga olish so'rovi bizga kerak bo'lgan usul bilan qayta ishlanadi.


Biz qilishimiz kerak bo'lgan ikkinchi narsa - ma'lumotlarni to'g'ri formatda yuborish. Bu erda hamma narsa oddiy. Legitimate register() bizdan jform nomli massivni kutadi, unda biz ro'yxatdan o'tish ma'lumotlarini - ism, login, parol, elektron pochtani o'tkazamiz (so'rov bilan skrinshotga qarang).

  • /components/com_users/controllers/registration.php: 124: // Foydalanuvchi ma'lumotlarini oling.

125: $requestData = $this->input->post->get("jform", array(), "massiv");

  • Bizning mijozimiz ushbu ma'lumotlarni foydalanuvchi deb nomlangan massivdan oladi.

/components/com_users/controllers/user.php: 301: // Shakl ma'lumotlarini oling.

302: $data = $this->input->post->get("foydalanuvchi", array(), "massiv");

  • Shuning uchun biz so'rovdagi barcha parametrlarning nomlarini jfrom dan user ga o'zgartiramiz.

Bizning uchinchi qadamimiz yaroqli CSRF tokenini topishdir, chunki usiz ro'yxatdan o'tish bo'lmaydi.


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

Bu MD5 xeshiga o'xshaydi va siz uni, masalan, /index.php/component/users/?view=login saytidagi avtorizatsiya shaklidan olishingiz mumkin.

  • Endi siz kerakli usul yordamida foydalanuvchilarni yaratishingiz mumkin. Agar hamma narsa ishlagan bo'lsa, tabriklaymiz - siz hozirgina CVE-2016-8870 "yangi foydalanuvchilarni ro'yxatdan o'tkazish uchun ruxsatnoma tekshiruvi etishmayotgan" zaifligidan foydalandingiz.

UsersControllerRegistration kontrolleridagi "ishchi" registr() usulida u shunday ko'rinadi:

  • /components/com_users/controllers/registration.php: 113: // Agar ro'yxatdan o'tish o'chirilgan bo'lsa - Kirish sahifasiga yo'naltirish.

114: agar (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=" login", noto'g'ri); 117: 118: noto'g'ri qaytarish; 119: )

Va shuning uchun zaiflarda:

Davomi faqat a'zolar uchun mavjud Variant 1. Saytdagi barcha materiallarni o'qish uchun "sayt" hamjamiyatiga qo'shiling

Belgilangan muddat ichida hamjamiyatga a'zolik sizga BARCHA Hacker materiallariga kirish imkonini beradi, shaxsiy jami chegirmangizni oshiradi va professional Xakep Score reytingini to'plash imkonini beradi!

Laravel kompozitordan loyiha bog'liqliklarini boshqarishni talab qiladi. Shuning uchun Laravelni o'rnatishdan oldin tizimingizda Composer o'rnatilganligiga ishonch hosil qiling. Agar siz Composer haqida birinchi marta eshitayotgan bo'lsangiz, bu php uchun npm tuguniga o'xshash qaramlikni boshqarish vositasi.

Composerni kompyuteringizga oʻrnatish uchun ushbu xabarni tekshiring:

Laravel-ni Windows-ga o'rnatish:

Windows mashinasiga laravelni o'rnatish uchun quyidagi amallarni bajaring. Sizda xampp/wamp stekiga ega bo'lishingizdan qat'i nazar, u ikkalasi uchun ham ishlaydi. WAMP da laravelni "www" jildiga va XAMPP ga o'rnatganingizga ishonch hosil qiling, aniqki "htdocs".

QADAM-1) XAMPP da "htdocs" jildini oching, SHIFT tugmachasini bosib ushlab turing va papkani o'ng tugmasini bosing va "bu yerda buyruq oynasini ochish" ni tanlang. Shu bilan bir qatorda, siz buyruqlar oynasini ochishingiz va katalogni "xampp/htdocs" ga o'zgartirishingiz mumkin.

QADAM-2) Quyidagi buyruqni kiriting.

Composer create-project laravel/laravel my_laravel_site --prefer-dist

Bu erda "my_laravel_site" - laravel fayllari o'rnatiladigan papka nomi. Buni o'zingizning xohishingizga ko'ra o'zgartiring.

QADAM-3) Endi sabr qilish vaqti keldi, chunki laravelni o'rnatish biroz vaqt talab etadi.

QADAM-4) O'rnatilgandan so'ng, buyruq satrida katalogni "my_laravel_site" (cd "my_laravel_site") ga o'zgartiring va quyidagi buyruqni kiriting.

Php hunarmand xizmati

5-QADAM) Bu url bilan birga "Laravel ishlab chiqish serveri ishga tushdi:" kabi xabarni ko'rsatadi.

QADAM-6) URL manzilini brauzerga nusxalash va joylashtirish. Agar ishlar to'g'ri ketsa, siz laravelning xush kelibsiz ekranini ko'rasiz.

QADAM-7) Bajarildi! Siz Windows mashinasiga laravelni muvaffaqiyatli o'rnatdingiz va u bilan ishlashga tayyorsiz.

Ilova kalitini sozlash:

Laravel o'rnatishdan keyin ozgina konfiguratsiyani talab qiladi. Bu dastur kalitini o'rnatishingizni talab qiladi. Bu seans va boshqa nozik ma'lumotlarni shifrlash uchun ishlatiladigan 32 belgidan iborat tasodifiy qator. Odatda bu laravelni kompozitor yoki laravel o'rnatuvchisi orqali o'rnatganingizda avtomatik ravishda o'rnatiladi.

Agar u o'rnatilmagan bo'lsa, buni qo'lda qilishingiz kerak. Avval ".env.example" faylining nomini ilova ildizida ".env" ga o'zgartirganingizga ishonch hosil qiling. Keyin buyruq satrini oching va laravel loyiha jildiga o'zgartiring. Endi kalitni yaratish uchun quyidagi buyruqni bajaring.

Php hunarmand kaliti: yaratish

Ushbu yaratilgan kalitni ".env" faylidagi APP_KEY o'zgaruvchisiga nusxalang. Saqlash va siz tugatdingiz.

Maxsus Laravel versiyasini o'rnatish:

Yuqorida keltirilgan usul kompozitorni laravelning so'nggi versiyasini yuklab olish va o'rnatishga majbur qiladi. Agar siz laravelning oldingi versiyalarini kompyuteringizga o'rnatmoqchi bo'lsangiz, create-project buyrug'iga tegishli versiya raqamini kiritganingizga ishonch hosil qiling.

Composer create-project laravel/laravel=5.4 sizning loyihangiz nomi --prefer-dist Shuningdek, o'qing:

Xuddi shunday mumkin Windowsda kompozitor yordamida laravelni osongina o'rnating. Umid qilamanki, siz ushbu qo'llanmani foydali deb topasiz. Agar sizga yoqqan bo'lsa, uni ijtimoiy doirangizda baham ko'ring.

Ro'yxatga olish tizimini yaratish jarayoni juda ko'p ishdir. Siz elektron pochta manzillarining haqiqiyligini ikki marta tekshiradigan, tasdiqlovchi elektron pochta xabarlarini yuboradigan, parolni tiklash imkoniyatini taklif qiladigan, parollarni saqlash uchun kod yozishingiz kerak. xavfsiz joy, tekshirilgan kiritish shakllari va boshqalar. Bularning barchasini qilganingizda ham, foydalanuvchilar ro'yxatdan o'tishni istamaydilar, chunki hatto eng minimal ro'yxatdan o'tish ham ularning faolligini talab qiladi.

Bugungi o'quv qo'llanmada biz hech qanday parol talab qilmaydigan oddiy ro'yxatga olish tizimini ishlab chiqamiz! Natijalar osongina o'zgartirilishi yoki mavjud PHP veb-saytiga integratsiya qilinishi mumkin bo'lgan tizim bo'ladi. Agar qiziqsangiz, o'qishni davom eting.

PHP

Endi biz PHP kodini ishga tushirishga tayyormiz. Ro'yxatga olish tizimining asosiy funksionalligi foydalanuvchi sinfi tomonidan ta'minlanadi, siz quyida ko'rishingiz mumkin. Sinf minimalist ma'lumotlar bazasi kutubxonasi bo'lgan () dan foydalanadi. User klassi ma'lumotlar bazalariga kirish, kirish tokenlarini yaratish va ularni tekshirish uchun javobgardir. U bizga PHP-ga asoslangan veb-saytlaringizni ro'yxatga olish tizimiga osongina kiritilishi mumkin bo'lgan oddiy interfeysni taqdim etadi.

User.class.php

// Shaxsiy ORM namunasi
xususiy $orm;

/**
* Token qatori bo'yicha foydalanuvchi toping. Faqat haqiqiy tokenlar hisobga olinadi
* hisobga olish. Token yaratilgandan keyin 10 daqiqa davomida amal qiladi.
* @param string $token Qidiriladigan token
* @return Foydalanuvchi
*/

Ommaviy statik funksiya findByToken($token)(

// uni ma'lumotlar bazasidan toping va vaqt tamg'asi to'g'ri ekanligiga ishonch hosil qiling


-> qayerda("token", $token)
->where_raw("token_validity > NOW()")
->find_one();

If(!$natija)(
yolg'onni qaytarish;
}

Yangi foydalanuvchini qaytarish ($ natija);
}

/**
* Yoki tizimga kiring yoki foydalanuvchini ro'yxatdan o'tkazing.
* @return Foydalanuvchi
*/

Umumiy statik funksiya loginOrRegister($email)(

// Agar bunday foydalanuvchi allaqachon mavjud bo'lsa, uni qaytaring

If(User::exists($email))(
yangi foydalanuvchini qaytarish ($ elektron pochta);
}

// Aks holda, uni yarating va qaytaring

Foydalanuvchini qaytarish::create($email);
}

/**
* Yangi foydalanuvchi yarating va uni ma'lumotlar bazasiga saqlang
* @param string $email Foydalanuvchining elektron pochta manzili
* @return Foydalanuvchi
*/

Shaxsiy statik funktsiya yaratish($email)(

// Ma'lumotlar bazasiga yangi foydalanuvchi yozing va uni qaytaring

$natija = ORM::for_table("reg_users")->create();
$result->email = $email;
$result->save();

Yangi foydalanuvchini qaytarish ($ natija);
}

/**
* Ma'lumotlar bazasida bunday foydalanuvchi mavjudligini tekshiring va mantiqiy qiymatni qaytaring.
* @param string $email Foydalanuvchining elektron pochta manzili
* @return mantiqiy
*/

Umumiy statik funksiya mavjud($email)(

// Foydalanuvchi ma'lumotlar bazasida mavjudmi?
$natija = ORM::for_table("reg_users")
-> qayerda("elektron pochta", $email)
->hisoblash();

Qaytish $natija == 1;
}

/**
* Yangi foydalanuvchi ob'ektini yarating
* @param $param ORM namunasi, identifikator, email yoki null
* @return Foydalanuvchi
*/

Umumiy funktsiya __construct($param = null)(

If($param instanceof ORM)(

// ORM namunasi uzatildi
$this->orm = $param;
}
else if(is_string($param))(

// Elektron pochta xabari yuborildi
$this->
-> qaerda ("elektron pochta", $param)
->find_one();
}
boshqa(

If(is_numeric($param))(
// Foydalanuvchi identifikatori parametr sifatida uzatildi
$id = $param;
}
else if(isset($_SESSION["loginid"]))(

// Hech qanday foydalanuvchi identifikatori o'tkazilmadi, sessiyaga qarang
$id = $_SESSION["loginid"];
}

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

/**
* Yangi SHA1 login tokenini yaratadi, uni ma'lumotlar bazasiga yozadi va qaytaradi.
* @qaytish qatori
*/

Ommaviy funksiyagenerToken())(
// tizimga kirgan foydalanuvchi uchun token yarating. Uni ma'lumotlar bazasiga saqlang.

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

// Tokenni ma'lumotlar bazasiga saqlang,
// va uni faqat keyingi 10 daqiqa uchun amal qiladi deb belgilang

$this->orm->set("token", $token);
$this->orm->set_expr("token_validity", "Qo'shish VAQT (HOZIR(),"0:10")");
$this->orm->save();

$tokenni qaytaring;
}

/**
*Ushbu foydalanuvchiga kiring
* @return bekor
*/

Umumiy funktsiya login()

// Foydalanuvchini tizimga kirgan deb belgilang
$_SESSION["loginid"] = $this->orm->id;

// last_login db maydonini yangilang
$this->orm->set_expr("so'nggi_login", "HOZIR()");
$this->orm->save();
}

/**
* Seansni yo'q qiling va foydalanuvchidan chiqing.
* @return bekor
*/

Umumiy funksiyadan chiqish()
$_SESSION = massiv();
unset($_SESSION);
}

/**
* Foydalanuvchi tizimga kirganligini tekshiring.
* @return mantiqiy
*/

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

/**
* Foydalanuvchining administrator ekanligini tekshiring
* @return mantiqiy
*/

Umumiy funktsiya:Admin())(
$this->rank() == "administrator"ni qaytaring;
}

/**
* Foydalanuvchi turini toping. Bu administrator yoki oddiy bo'lishi mumkin.
* @qaytish qatori
*/

Jamoat funksiyasi darajasi())(
if($this->orm->rank == 1)(
"administrator" ni qaytarish;
}

"muntazam" ni qaytaring;
}

/**
* Shaxsiy elementlarga kirishning sehrli usuli
* $orm misoli foydalanuvchi obyektining xossalari sifatida
* @param string $key Kiritilgan xususiyat nomi
* @qaytish aralash
*/

Umumiy funksiya __get($key)(
if(isset($this->orm->$key))(
$this->orm->$keyni qaytaring;
}

Nullni qaytaring;
}
}
Tokenlar algoritm yordamida yaratiladi va ma'lumotlar bazasida saqlanadi. Token_validity ustunini 10 daqiqaga o'rnatish uchun MySQL-dan foydalanamiz. Tokenni tasdiqlashda biz dvigatelga token kerakligini aytamiz, token_validity maydoni hali tugamagan. Shunday qilib, biz token amal qiladigan vaqtni cheklaymiz.

E'tibor bering, biz foydalanuvchi ob'ektining xususiyatlariga kirish uchun hujjat oxirida __get() sehrli usulidan foydalanamiz. Bu bizga ma'lumotlar bazasida xususiyatlar sifatida saqlangan ma'lumotlarga kirish imkonini beradi: $user->email, $user->token. Misol tariqasida, ushbu klassni quyidagi kod parchasida qanday ishlatishimiz mumkinligini ko'rib chiqamiz:


Kerakli funksiyalarni saqlaydigan boshqa fayl - functions.php. U erda bizda kodning qolgan qismini toza saqlashga imkon beruvchi bir nechta yordamchi funksiyalar mavjud.

Functions.php

send_email funksiyasi($from, $to, $subject, $message)(

// Elektron pochta xabarlarini yuborish uchun yordamchi funksiya

$headers = "MIME-versiyasi: 1.0" . "\r\n";
$headers .= "Tarkib turi: matn/plain; charset=utf-8" . "\r\n";
$headers .= "Kimdan: ".$dan . "\r\n";

Pochtani qaytarish ($to, $mavzu, $xabar, $sarlavhalar);
}

funksiya get_page_url())(

// PHP faylining URL manzilini toping

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

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

$url-ni qaytarish;
}

funktsiya tezligi_chegarasi($ip, $cheklangan_soat = 20, $limit_10_min = 10)(

// Ushbu IP manzil bo'yicha so'nggi bir soat ichida kirishga urinishlar soni

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

// Ushbu IP manzil bo'yicha so'nggi 10 daqiqada kirishga urinishlar soni

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

Agar($count_soat > $chek_soat || $count_10_min > $limit_10_min)(
yangi Istisno ("Kirish uchun juda ko'p urinishlar!");
}
}

funktsiya rate_limit_tick($ip, $email)(

// Kirishga urinishlar jadvalida yangi yozuv yarating

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

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

$login_attempt->save();
}

funktsiyani qayta yo'naltirish($url)(
header("Joylashuv: $url");
chiqish;
}
Rate_limit va rate_limit_tick funksiyalari bizga ma'lum vaqt davomida avtorizatsiyaga urinishlar sonini cheklash imkonini beradi. Avtorizatsiya urinishlari reg_login_attempt ma'lumotlar bazasida qayd etiladi. Ushbu funksiyalar kirish formasi tekshirilganda ishga tushadi, buni quyidagi kod parchasida ko‘rishingiz mumkin.

Quyidagi kod index.php dan olingan va login formasini tekshirish uchun javobgardir. U assets/js/script.js da ko'rgan jQuery kodi bilan boshqariladigan JSON javobini qaytaradi.

index.php

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

// JSON sarlavhasini chiqaring

Sarlavha("Tarkib turi: ilova/json");

// Elektron pochta manzili haqiqiymi?

If(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(
throw new Exception("Iltimos, to'g'ri elektron pochta manzilini kiriting.");
}

// Agar shaxs yuqorida bo'lsa, bu istisno qiladi
// ruxsat etilgan kirish urinishlari chegaralari (batafsil ma'lumot uchun functions.php ga qarang):
tarif_chegarasi($_SERVER["REMOTE_ADDR"]);

// Ushbu kirish urinishini yozib oling
rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["elektron pochta"]);

// Xabarni foydalanuvchiga yuboring

$xabar = "";
$email = $_POST["elektron pochta"];
$subject = "Kirish havolangiz";

If(!User::mavjud($email))(
$subject = "Ro'yxatdan o'tganingiz uchun tashakkur!";
$message = "Saytimizda ro'yxatdan o'tganingiz uchun tashakkur!\n\n";
}

// Kirish yoki shaxsni ro'yxatdan o'tkazishga harakat qiling
$user = User::loginOrRegister($_POST["elektron pochta"]);

$message.= "Siz ushbu URL manzilidan kirishingiz mumkin:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Havola 10 daqiqadan so'ng avtomatik ravishda tugaydi.";

$natija = send_email($fromEmail, $_POST["email"], $mavzu, $xabar);

If(!$natija)(
throw new Exception("E-pochtangizni yuborishda xatolik yuz berdi. Qayta urinib koʻring.");
}

Die(json_encode(massiv()
"message" => "Rahmat! Biz sizning pochta qutingizga havola yubordik. Spam jildingizni ham tekshiring."
)));
}
}
catch($e istisno)(

Die(json_encode(massiv()
"xato"=>1,
"xabar" => $e->getMessage()
)));
}
Muvaffaqiyatli avtorizatsiya yoki ro'yxatdan o'tgandan so'ng, yuqoridagi kod avtorizatsiya uchun havola bilan shaxsga elektron pochta xabarini yuboradi. Token yaratilgan URL tufayli $_GET oʻzgaruvchisi “tkn” sifatida taqdim etiladi.

index.php

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

// Bu yaroqli login tokenmi?
$user = User::findByToken($_GET["tkn"]);

// Ha! Foydalanuvchiga kiring va himoyalangan sahifaga yo'naltiring.

$user->login();
qayta yo'naltirish ("protected.php");
}

// Yaroqsiz token. Kirish formasiga qayta yo'naltiring.
qayta yo'naltirish ("index.php");
}
$user->login() ni ishga tushirish zarur seans oʻzgaruvchilarini yaratadi, bu esa foydalanuvchiga keyingi loginlarda tizimga kirishda qolish imkonini beradi.

Tizimdan chiqish taxminan bir xil tarzda amalga oshiriladi:

Index.php

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

$user = yangi foydalanuvchi();

If($user->loggedIn())(
$user->logout();
}

Qayta yo'naltirish ("index.php");
}
Kod oxirida biz foydalanuvchini yana index.php ga yo'naltiramiz, shuning uchun URLdagi ?logout=1 parametri o'chiriladi.

Bizning index.php faylimiz ham himoyaga muhtoj bo'ladi - biz allaqachon tizimga kirgan foydalanuvchilar formani ko'rishini xohlamaymiz. Buning uchun biz $user->loggedIn() usulidan foydalanamiz:

Index.php

$user = yangi foydalanuvchi();

if($user->loggedIn())(
qayta yo'naltirish ("protected.php");
}
Va nihoyat, veb-sayt sahifangizni qanday himoya qilish va uni avtorizatsiyadan so'ng foydalanish mumkin bo'lishini ko'rib chiqamiz:

protected.php

// Saytingizdagi har qanday php sahifani himoya qilish uchun main.php ni qo'shing
// va yangi User ob'ektini yarating. Bu juda oddiy!

require_once "includes/main.php";

$user = yangi foydalanuvchi();

if(!$user->loggedIn())(
qayta yo'naltirish ("index.php");
}
Ushbu tekshiruvdan so'ng, foydalanuvchi muvaffaqiyatli tizimga kirganligiga ishonch hosil qilishingiz mumkin. Shuningdek, siz $user ob'ektining xossalari sifatida ma'lumotlar bazasida saqlanadigan ma'lumotlarga kirish huquqiga ega bo'lasiz. Foydalanuvchining elektron pochta manzilini va ularning darajasini ko'rsatish uchun quyidagi koddan foydalaning:

Echo "Sizning elektron pochtangiz: ".$user->email;
echo "Sizning darajangiz: ".$user->rank();
Bu erda rank() - bu usul, chunki ma'lumotlar bazasidagi darajalar ustuni odatda raqamlarni o'z ichiga oladi (oddiy foydalanuvchilar uchun 0 va ma'murlar uchun 1) va biz bularning barchasini daraja nomlariga aylantirishimiz kerak, ular yordamida amalga oshiriladi. bu usul. Standart foydalanuvchini administratorga aylantirish uchun foydalanuvchining phpmyadmin (yoki boshqa maʼlumotlar bazasi dasturi)dagi yozuvini tahrirlash kifoya. Administrator sifatida foydalanuvchi hech qanday huquqlarga ega bo'lmaydi maxsus xususiyatlar. Ma'murlarga qanday huquqlarni berishni o'zingiz tanlash huquqiga egasiz.

Tayyor!

Shu bilan bizning oddiy ro'yxatga olish tizimimiz tayyor! Siz uni mavjud PHP saytida ishlatishingiz yoki o'zingizning talablaringizga mos ravishda modernizatsiya qilishingiz mumkin.

Reg.ru: domenlar va xosting

Rossiyadagi eng yirik registrator va xosting provayderi.

Xizmatda 2 milliondan ortiq domen nomlari.

Rag'batlantirish, domen pochtasi, biznes yechimlari.

Dunyo bo'ylab 700 mingdan ortiq mijoz allaqachon o'z tanlovini amalga oshirgan.

*Sichqonchani o‘tkazishni to‘xtatib turish uchun ustiga bosing.

Orqaga Oldinga

PHP va MySQL da foydalanuvchilarni ro'yxatga olishning oddiy tizimini yaratish

Ro'yxatga olish tizimini yaratish juda ko'p ish. Siz elektron pochta manzillarini tasdiqlovchi kod yozishingiz kerak, ro'yxatdan o'tishni tasdiqlovchi elektron pochta xabarini yuborasiz, shuningdek, boshqa shakl maydonlarini tasdiqlaydi va yana ko'p narsalar.

Va bularning barchasini yozganingizdan keyin ham foydalanuvchilar ro'yxatdan o'tishni xohlamaydilar, chunki... bu esa ulardan biroz harakat talab qiladi.

Ushbu qo'llanmada biz parollarni umuman talab qilmaydigan yoki saqlamaydigan juda oddiy ro'yxatga olish tizimini yaratamiz! Natijani o'zgartirish va mavjud PHP saytiga qo'shish oson bo'ladi. Bu qanday ishlashini bilmoqchimisiz? Quyida oʻqing.



Bizning super oddiy tizimimiz qanday ishlaydi:

Biz avtorizatsiya shakli va ro'yxatdan o'tishni birlashtiramiz. Ushbu shaklda elektron pochta manzilingizni kiritish uchun maydon va ro'yxatdan o'tish tugmasi bo'ladi;
- Elektron pochta manzili bilan maydonni to'ldirganda, ro'yxatdan o'tish tugmasini bosish orqali yangi foydalanuvchi haqida yozuv yaratiladi, lekin kiritilgan elektron pochta manzili ma'lumotlar bazasida topilmasa.

Shundan so'ng, tasodifiy noyob belgilar to'plami (token) yaratiladi, u foydalanuvchi tomonidan ko'rsatilgan elektron pochtaga 10 daqiqa davomida tegishli bo'lgan havola ko'rinishida yuboriladi;
- Havola foydalanuvchini bizning veb-saytimizga olib boradi. Tizim token mavjudligini aniqlaydi va foydalanuvchiga ruxsat beradi;

Ushbu yondashuvning afzalliklari:

Parollarni saqlash yoki maydonlarni tekshirishning hojati yo'q;
- Parolni, xavfsizlik savollarini va hokazolarni tiklashning hojati yo'q;
- Foydalanuvchi ro'yxatdan o'tgan/kirgan paytdan boshlab, siz doimo ushbu foydalanuvchi sizning kirish zonangizda bo'lishiga ishonch hosil qilishingiz mumkin (elektron pochta manzili to'g'ri);
- Ajablanarli darajada oddiy ro'yxatga olish jarayoni;

Kamchiliklari:

Foydalanuvchi hisobi xavfsizligi. Agar kimdir foydalanuvchining pochtasiga kirish imkoniga ega bo'lsa, u tizimga kirishi mumkin.
- Elektron pochta xavfsiz emas va uni ushlash mumkin. Shuni yodda tutingki, bu savol parol unutilgan va qayta tiklanishi kerak bo'lgan holatda yoki ma'lumotlarni uzatish uchun HTTPS dan foydalanmaydigan har qanday avtorizatsiya tizimida (login/parol);
- Pochta serveringizni to'g'ri sozlaganingizda, avtorizatsiya havolalari bo'lgan xabarlar spamga tushib qolishi ehtimoli bor;

Tizimimizning afzalliklari va kamchiliklarini solishtirsak, shuni aytishimiz mumkinki, tizim yuqori qulaylikka ega (oxirgi foydalanuvchi uchun maksimal qulaylik) va shu bilan birga, past xavfsizlik ko'rsatkichiga ega.

Shuning uchun undan muhim ma'lumotlar bilan ishlamaydigan forumlar va xizmatlarda ro'yxatdan o'tish uchun foydalanish tavsiya etiladi.

Ushbu tizimdan qanday foydalanish kerak

Agar siz shunchaki saytingizdagi foydalanuvchilarni avtorizatsiya qilish uchun tizimdan foydalanishingiz kerak bo'lsa va siz ushbu saboqni ajratib olishni xohlamasangiz, quyidagilarni qilishingiz kerak:

Darsga biriktirilgan manbalarni yuklab olishingiz kerak
- Arxivdagi tables.sql faylini toping. Shu bilan bir qatorda: ushbu faylni orqali oching matn muharriri, SQL so'rovini nusxalash va uni bajarish;
- include/main.php ni oching va ma'lumotlar bazasi bilan ulanish sozlamalarini to'ldiring (ma'lumotlar bazasiga ulanish uchun foydalanuvchi va parolni, shuningdek, ma'lumotlar bazasi xostini va nomini ko'rsating). Xuddi shu faylda siz tizim tomonidan yuborilgan xabarlar uchun asl manzil sifatida foydalaniladigan elektron pochta manzilini ham ko'rsatishingiz kerak. Ba'zi xostlar, agar formada xostning boshqaruv panelidan yaratilgan haqiqiy elektron pochta manzili bo'lmasa, chiquvchi elektron pochta xabarlarini bloklaydi, shuning uchun haqiqiy manzilni ko'rsating;
- Barcha index.php , protected.php fayllari va aktivlarini FTP orqali xostingizga papkalarni o'z ichiga oladi;
- Kirish formasini ko'rsatmoqchi bo'lgan har bir PHP sahifasiga quyidagi kodni qo'shing;

Require_once "includes/main.php"; $user = yangi foydalanuvchi(); if(!$user->loggedIn())( redirect("index.php"); )
- Tayyor!

Bularning barchasi qanday ishlashiga qiziquvchilar uchun quyida o'qing!

Birinchi qadam avtorizatsiya shakli uchun HTM kodini yozishdir. Ushbu kod index.php faylida joylashgan. Ushbu fayl, shuningdek, forma ma'lumotlari va boshqa foydali kirish tizimining funktsiyalarini boshqaradigan PHP kodini o'z ichiga oladi. Bu haqda ko'proq ma'lumotni PHP kodini ko'rib chiqishga bag'ishlangan quyidagi bo'limda bilib olishingiz mumkin.

index.php

Qo'llanma: PHP va MySQL tizimiga kirish yoki ro'yxatdan o'tish bilan juda oddiy ro'yxatga olish tizimi

Yuqoridagi elektron pochta manzilingizni kiriting va biz yuboramiz
sizga kirish havolasi.

Kirish/Ro‘yxatdan o‘tish

Bosh bo'limida (va teglar orasida) men asosiy uslublarni kiritdim (ular ushbu qo'llanmada yoritilmagan, shuning uchun ularni o'zingiz ko'rishingiz mumkin. Folder assets/css/style.css). Yopish tegidan oldin men jQuery kutubxonasi va script.js faylini qo'shdim, biz ularni quyida yozamiz va tahlil qilamiz.


JavaScript

jQuery funksiyadan foydalangan holda "Ro'yxatdan o'tish/Kirish" tugmasi holatini kuzatib boradi e.preventDefault() va AJAX so'rovlarini yuboradi. Server javobiga qarab u yoki bu xabarni ko'rsatadi va aniqlaydi keyingi harakatlar/

assets/js/script.js

$(function())( var form = $("#login-register"); form.on("yuborish", function(e)( if(form.is(".loading, .loggedIn"))( qaytish false ; ) var email = form.find("input").val(), messageHolder = form.find("span"); $.post(this.action, (email: email), function (m)( if (m.error)(form.addClass("xato"); messageHolder.text(m.message); ) else(form.removeClass("xato").addClass("loggedIn"); messageHolder. text(m.message) ) )); $(document).ajaxStart(function())( form.addClass("loading"); )); ;

ko'rsatish uchun shaklga qo'shildi hozirgi holat AJAX so'rovi (bu usullar tufayli amalga oshirildi ajaxStart()) Va ajaxComplete(), uni faylning oxirida topishingiz mumkin).

Bu sinf aylanadigan animatsion gif faylini ko'rsatadi (go'yo bizga so'rov qayta ishlanayotganiga ishora qiladi) va shuningdek, formani qayta yuborilishining oldini olish uchun bayroq vazifasini bajaradi (ro'yxatdan o'tish tugmasi allaqachon bir marta bosilgan bo'lsa). .loggedIn klassi boshqa bayroqdir - u elektron pochta yuborilganda o'rnatiladi. Bu bayroq shakl bilan boshqa harakatlarni darhol bloklaydi.

Ma'lumotlar bazasi sxemasi

Bizning aql bovar qilmaydigan darajada oddiy jurnal tizimi 2 ta MySQL jadvalidan foydalanadi (SQL kodi tables.sql faylida). Birinchisi foydalanuvchi hisoblari haqidagi ma'lumotlarni saqlaydi. Ikkinchisi kirishga urinishlar soni haqidagi ma'lumotlarni saqlaydi.


Foydalanuvchi jadvali sxemasi.

Diagrammada ko'rinib turganidek, tizim parollardan foydalanmaydi. Unda siz token_validity ustuniga ulashgan tokenli token ustunini ko'rishingiz mumkin. Token foydalanuvchi tizimga ulanishi va elektron pochta manzilini xabar yuborish uchun sozlashi bilanoq oʻrnatiladi (bu haqda keyingi blokda batafsil maʼlumot beriladi). Token_validity ustuni vaqtni 10 daqiqadan keyin belgilaydi, shundan so'ng token endi haqiqiy emas.


Avtorizatsiyaga urinishlar sonini hisoblaydigan jadval sxemasi.

Ikkala jadvalda IP-manzil qayta ishlangan shaklda, ip2long funksiyasidan foydalanib, butun sonli maydonda saqlanadi.

Endi biz PHP kodini yozishimiz mumkin. Tizimning asosiy funksionalligi User.class.php sinfiga berilgan, uni quyida ko'rishingiz mumkin.

Bu sinf idorm (docs) dan faol foydalanadi, bu kutubxonalar ma'lumotlar bazalari bilan ishlash uchun minimal zarur vositalardir. U ma'lumotlar bazasiga kirish, token yaratish va tokenni tekshirish bilan shug'ullanadi. Bu oddiy interfeysni taqdim etadi, agar u PHP dan foydalansa, ro'yxatga olish tizimini saytingizga ulashni osonlashtiradi.

User.class.php

Class User( // Private ORM case private $orm; /** * Token boʻyicha foydalanuvchi toping. Koʻrib chiqish uchun faqat yaroqli tokenlar qabul qilinadi. Token yaratilgan paytdan boshlab faqat 10 daqiqa davomida hosil boʻladi * @param string $token Bu biz izlayotgan tokendir * @return User funksiyasi */ umumiy statik funksiya findByToken($token)( // maʼlumotlar bazasida tokenni toping va toʻgʻri vaqt tamgʻasi oʻrnatilganligiga ishonch hosil qiling. natija = ORM::for_table("reg_users") ->qaerda ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(! if(!$result)( return false;); ) new User($result) /** *); foydalanuvchini avtorizatsiya qilish yoki ro'yxatdan o'tkazish * @param string $email Foydalanuvchining elektron pochta manzili * @return User */ umumiy statik funksiya loginOrRegister($email)( // Agar shunday foydalanuvchi. allaqachon mavjud bo'lsa, ma'lumotlar bazasida saqlangan ko'rsatilgan elektron pochta manzilidan Foydalanuvchi funktsiyasi qiymatini qaytaring, if(User::exists($email))( return new User($email); ) // Aks holda, ma'lumotlar bazasida yangi foydalanuvchi yarating. ma'lumotlar bazasini yarating va ko'rsatilgan elektron pochtadan User::create funksiyasining qiymatini qaytaring User::create($email );

Tokenlar SHA1 algoritmi yordamida yaratiladi va ma'lumotlar bazasida saqlanadi. Tokenning amal qilishi uchun 10 daqiqalik vaqt chegarasini belgilash uchun MySQL-ning vaqt funksiyalaridan foydalanmoqdaman.

Token tasdiqlanganda, biz ishlov beruvchiga faqat token_validity ustunida saqlangan muddati tugamagan tokenlarni ko'rib chiqayotganimizni to'g'ridan-to'g'ri aytamiz.

Iltimos, men sehrli usuldan foydalanayotganimni unutmang __olmoq Foydalanuvchi ob'ektining xususiyatlariga kirishni to'xtatish uchun fayl oxiridagi docs kutubxonasi.

Buning sharofati bilan $user->email, $user->token va boshqalar xossalari tufayli ma'lumotlar bazasida saqlangan ma'lumotlarga kirish mumkin bo'ladi. Keyingi kod fragmentida biz ushbu sinflardan qanday foydalanishni ko'rib chiqamiz. misol.


Himoyalangan sahifa

Foydali va kerakli funksiyalarni saqlaydigan yana bir fayl bu functions.php faylidir. Boshqa fayllarda tozaroq va o'qilishi mumkin bo'lgan kodni yaratishga imkon beruvchi yordamchi funktsiyalar deb ataladigan bir nechta yordamchilar mavjud.

functions.php

Funktsiya send_email($from, $to, $subject, $message)( // E-pochta xabarini yuboruvchi yordamchi $headers = "MIME-versiyasi: 1.0" . "\r\n"; $headers .= "Tarkib turi: matn /plain; charset=utf-8" . "\r\n"; $headers .= "Kimdan: ".$from . "\r\n"; pochtani qaytarish ($to, $subject, $message, $headers ) funksiyasi get_page_url())( // PHP faylining URL manzilini aniqlang $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 funksiyasi rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Ushbu IP manzil uchun $count_hour; = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(HOZIR(),"1:00" )") ->count(); // Ushbu IP manzilda oxirgi 10 daqiqada tizimga kirishga urinishlar soni $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u" , ip2long($ ip))) ->where_raw("ts > SUBTIME(HOZIR(),"0:10")") ->count();

if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( yangi Istisno oching("Kirish uchun juda koʻp urinishlar!"); ) ) funksiya rate_limit_tick($ip, $email)( // Jadvalda yangi yozuv yaratish kirishga urinishlar sonini hisoblaydi $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->save( ) function redirect($url)( header("Location: $url"); exit; ) Funksiyalar tarif_chegarasi Va tarif_chegarasi_belgisi

birinchi urinishdan keyin o'tgan vaqt davomida avtorizatsiyaga urinishlar sonini kuzatib boring. Kirish urinishi ma'lumotlar bazasida reg_login_attempt ustunida qayd etiladi. Quyidagi kod parchasidan ko'rinib turganidek, bu funksiyalar forma ma'lumotlariga ishlov berilganda va yuborilganda chaqiriladi.

index.php

Sinab ko'ring( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // JSON sarlavhasini chiqaring("Content-type: application/json"); // Agar ushbu elektron pochta manzili to'g'rimi? (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( yangi istisno ("Iltimos, to'g'ri elektron pochta manzilini kiriting."); ) // Tekshiring foydalanuvchi tizimga kirishga ruxsat berdi, u ruxsat etilgan ulanishlar sonidan oshib ketdimi (batafsil ma'lumot uchun functions.php fayli) rate_limit($_SERVER["REMOTE_ADDR"] // Ushbu avtorizatsiya urinishini yozib oling rate_limit_tick($_SERVER["REMOTE_ADDR"]); , $ _POST["elektron pochta"]); // Foydalanuvchiga e-pochta jo'natish $message = ""; $email = $_POST["email"] )( $subject = "; Ro'yxatdan o'tganingiz uchun rahmat!"; $message = "Saytimizda ro'yxatdan o'tganingiz uchun tashakkur!\n\n"; ) // Foydalanuvchini avtorizatsiya qilish yoki ro'yxatdan o'tkazishga urinish $user = User::loginOrRegister($_POST[ "email"] ); $message.= "Siz ushbu URL orqali kirishingiz mumkin:\n";

$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Havola 10 daqiqadan so'ng avtomatik ravishda tugaydi.";$natija = send_email($fromEmail, $_POST["email"], $mavzu, $xabar);

index.php

if(!$result)( throw new Exception("E-pochtangizni yuborishda xatolik yuz berdi. Qayta urinib koʻring."); ) die(json_encode(array("message" => "Rahmat! Biz havola yubordik. spam jildingizni ham tekshiring."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() )));

Muvaffaqiyatli kirish/ro'yxatdan o'tgandan so'ng, yuqoridagi kod foydalanuvchiga kirish havolasini yuboradi. Token mavjud bo'ladi, chunki usul bilan hosil qilingan havolada o'zgaruvchi sifatida uzatiladi

$_GET

tkn belgisi bilan

index.php

If(isset($_GET["tkn"]))( // Bu token avtorizatsiya uchun amal qiladimi? $user = User::findByToken($_GET["tkn"]); if($user)( // Ha , Himoyalangan sahifaga qayta yo'naltirish ("protected.php"); ");)

Kodning oxirida men yana index.php ga yo'naltirishni o'rnatdim, shuning uchun parametr ?chiqish=1 URL orqali uzatilishi shart emas.

Bizning index.php faylimiz qo'shimcha talab qiladi. himoya - biz tizimga kirgan odamlar ro'yxatdan o'tish shaklini qayta ko'rishlarini xohlamaymiz. Ushbu maqsadlar uchun biz usuldan foydalanamiz $user->loggedIn().

index.php

$user = yangi foydalanuvchi(); if($user->loggedIn())( redirect("protected.php"); )

Va nihoyat, bu yerda sizning saytingiz sahifalarini himoya qilish va faqat avtorizatsiyadan so'ng foydalanish imkoniyatini beradigan kod parchasi.

protected.php

// Saytingizdagi har bir sahifani himoya qilish uchun main.php faylini qo'shing // va yangi Foydalanuvchi ob'ektini yarating. Bu qanchalik oson! require_once "includes/main.php"; $user = yangi foydalanuvchi(); if(!$user->loggedIn())( redirect("index.php"); )

Ushbu tekshiruvdan so'ng, foydalanuvchi muvaffaqiyatli avtorizatsiya qilinganligiga ishonch hosil qilishingiz mumkin. Ob'ekt xususiyatlaridan foydalangan holda ma'lumotlar bazasida saqlangan ma'lumotlarga ham kirishingiz mumkin $foydalanuvchi. Foydalanuvchining elektron pochtasi va holatini ko'rsatish uchun ushbu koddan foydalaning:

Echo "Sizning elektron pochtangiz: ".$user->email; echo "Sizning darajangiz: ".$user->rank();

Usul daraja() Bu erda foydalaniladi, chunki ma'lumotlar bazasi odatda raqamlarni saqlaydi (muntazam foydalanuvchi uchun 0, administrator uchun 1) va biz bu ma'lumotlarni ular tegishli bo'lgan holatlarga aylantirishimiz kerak, bu usul bizga yordam beradi.

Oddiy foydalanuvchini administrator qilish uchun phpMyAdmin (yoki maʼlumotlar bazalarini boshqarish imkonini beruvchi boshqa dastur) orqali foydalanuvchi yozuvini tahrirlash kifoya. Ushbu misolda administrator maqomi hech qanday imtiyozlar bermaydi, sahifa sizning administrator ekanligingizni ko'rsatadi - bu hammasi.

Lekin bu bilan nima qilish sizning ixtiyoringizga bog'liq, siz o'zingiz administratorlar uchun ma'lum imtiyozlar va imkoniyatlarni o'rnatadigan kod yozishingiz va yozishingiz mumkin.

Biz tugatdik!

Biz bu ajoyib super kvazi oddiy shaklni tayyorladik! Siz uni PHP saytlarida ishlatishingiz mumkin, bu juda oddiy. Bundan tashqari, uni o'zingiz uchun o'zgartirishingiz va uni o'zingiz xohlagan tarzda qilishingiz mumkin.

Material Denis Malyshok tomonidan veb-sayt sayti uchun maxsus tayyorlangan

P.S.

PHP va OOP tillarini o'zlashtirishda oldinga siljishni xohlaysizmi? Veb-sayt yaratishning turli jihatlari, jumladan PHPda dasturlash bo'yicha premium darslarga, shuningdek, OOP yordamida PHP-da noldan boshlab o'z CMS tizimingizni yaratish bo'yicha bepul kursga e'tibor bering:
Sizga material yoqdimi va menga rahmat aytmoqchimisiz?




Saytda yangi

>

Eng mashhur