Oxirgi marta 2019-yil 20-avgustda Vinsi tomonidan o‘zgartirilgan.

Foydalanuvchiga kirish va ro'yxatdan o'tish har qanday CMS ilovalari uchun asosiy talabdir. Bu loyihani boshlashdagi dastlabki ish. Foydalanuvchi login autentifikatsiyasiga ega ilova anonim kirishni oldini olish orqali xavfsizlikni ta'minlaydi. Ilovamizda autentifikatsiyani yoqishning turli usullari mavjud, masalan OAuth loginni yoqish yoki Yagona tizimga kirish (SSO) va shunga o'xshash boshqa usullarni amalga oshirish. Oldingi qo'llanmada biz qanday amalga oshirishni ko'rib chiqdik, shuningdek, .

Ushbu misol ham kirish, ham ro'yxatdan o'tish funksiyalarini o'z ichiga oladi. Ro'yxatdan o'tgan a'zolarni saqlash uchun MySQL ma'lumotlar bazasidan foydalandim. Foydalanuvchini ro'yxatdan o'tkazish foydalanuvchidan ma'lumotlarni olish uchun kirishni o'z ichiga oladi. Ushbu shaklni topshirgandan so'ng, shakl ma'lumotlari PHP ga joylashtiriladi va ma'lumotlar bazasida saqlanadi. Ma'lumotlar bazasiga saqlashdan oldin foydalanuvchi paroli shifrlanadi. PHP kodiga joylashtirishdan oldin. Agar foydalanuvchi joriy hisob ma'lumotlari bilan tizimga kirgan bo'lsa, foydalanuvchi va unga keyingi davom etishiga ruxsat beriladi.

Foydalanuvchi ro'yxatdan o'tish shakli

Ushbu kod foydalanuvchiga ro'yxatdan o'tish shaklini ko'rsatish uchun mo'ljallangan. Foydalanuvchi o'z ma'lumotlari bilan shaklni yuborganida, foydalanuvchi kiritgan ma'lumotlarni tekshirish uchun JavaScript funksiyasi chaqiriladi. Muvaffaqiyatli tekshiruvdan so'ng, PHP kodi ma'lumotlar bazasini kiritishni amalga oshirish uchun joylashtirilgan shakl ma'lumotlarini o'qiydi.

">

JavaScript tekshiruvi majburiy maydonlarning bo'sh bo'lmagan tekshiruvi va regex naqshli elektron pochta formatini tekshirish bilan shug'ullanadi.

Ushbu PHP kodi ro'yxatga olish formasi ma'lumotlaridan foydalanib qo'shimchani yaratish uchun. Ma'lumotlar bazasini kiritgandan so'ng, foydalanuvchini tasdiqlash uchun muvaffaqiyat/xato javobi yuboriladi.

openConnection(); $sql1 = "tbl_registered_users dan ism, elektron pochta manzilini tanlang, bu erda email="$email""; $user = $db->so'rov($sql1); $natija = $user->fetchAll(); $_SESSION["emailname"] = $natija["email"]; if (empty($result)) ( $sql = "tbl_registered_users (ism, email, parol) qiymatlariga kiriting("$name","$email","$password")"; $db->exec($sql) ); $database->closeConnection(); $response = array("type" => "muvaffaqiyat", "message" => "Ro‘yxatdan o‘tish muvaffaqiyatli amalga oshirildi.
Endi tizimga kiring."); ) else ( $response = array("type" => "xato", "xabar" => "E-pochta allaqachon ishlatilmoqda."); ) ) ?>

PHP yordamida kirish autentifikatsiyasi

Roʻyxatdan oʻtgan foydalanuvchi ushbu login formasi orqali ilovaga kirishi mumkin. Kirish autentifikatsiyasi login elektron pochta va parolni ro'yxatdan o'tgan foydalanuvchi ma'lumotlar bazasiga moslashtirish orqali amalga oshiriladi. Agar moslik topilsa, ilova foydalanuvchiga davom etishiga imkon beradi. Aks holda, login paneli foydalanuvchini noto'g'ri urinish haqida tan oladi.

Ma'lumotlar bazasi bilan foydalanuvchi loginni tekshirish uchun PHP kodi quyida ko'rsatilgan. Muvaffaqiyatli kirishdan so'ng, men foydalanuvchini dashboard.php ga yo'naltiraman. Boshqaruv paneli tizimga kirgan a'zoga murojaat qilib, xush kelibsiz xabarni ko'rsatadi. Shuningdek, joriy seansdan chiqish imkoniyati mavjud bo'ladi.

openConnection(); $sql = "tbl_registered_users dan * ni tanlang, bu erda email = "$email" va parol= "$parol""; $user = $db->so'rov($sql); $natija = $user->fetchAll(PDO::FETCH_ASSOC); $id = $natija["id"]; $name = $natija["ism"]; $email = $natija["elektron pochta"]; $_SESSION["name"] = $name; $_SESSION["id"] = $id; $ma'lumotlar bazasi->closeConnection(); sarlavha("joylashuv: boshqaruv paneli.php"); ) ?>

Ushbu maqolada siz o'rganasiz ro'yxatga olish va avtorizatsiya shaklini qanday yaratish kerak HTML, JavaScript, PHP va MySql-dan foydalanish. Bunday shakllar, uning turidan qat'i nazar, deyarli har bir saytda qo'llaniladi. Ular forum uchun, onlayn-do'kon va ijtimoiy tarmoqlar (masalan, Facebook, Twiter, Odnoklassniki) va boshqa ko'plab saytlar uchun yaratilgan.

Agar sizning mahalliy kompyuteringizda saytingiz bo'lsa, umid qilamanki, sizda allaqachon mavjud. Busiz hech narsa ishlamaydi.

Ma'lumotlar bazasida jadval yaratish

Foydalanuvchilarni ro'yxatga olishni amalga oshirish uchun bizga birinchi navbatda ma'lumotlar bazasi kerak. Agar sizda allaqachon mavjud bo'lsa, unda ajoyib, aks holda siz uni yaratishingiz kerak. Maqolada men buni qanday qilishni batafsil tushuntiraman.

Shunday qilib, bizda ma'lumotlar bazasi (qisqartirilgan JB) bor, endi biz jadval yaratishimiz kerak foydalanuvchilar unda biz ro'yxatdan o'tgan foydalanuvchilarimizni qo'shamiz.

Ma'lumotlar bazasida jadvalni qanday yaratish kerak, men maqolada ham tushuntirdim. Jadvalni yaratishdan oldin uning qanday maydonlarni o'z ichiga olishini aniqlashimiz kerak. Ushbu maydonlar ro'yxatga olish formasidagi maydonlarga mos keladi.

Shunday qilib, biz o'yladik, bizning formamiz qanday maydonlarga ega bo'lishini tasavvur qildik va jadval tuzdik foydalanuvchilar ushbu maydonlar bilan:

  • id- Identifikator. Maydon id ma'lumotlar bazasidagi har bir jadvalda bo'lishi kerak.
  • ism- Ismni saqlash uchun.
  • familiya- Familiyani saqlash uchun.
  • elektron pochta- Pochta manzilini saqlash uchun. Biz login sifatida elektron pochtadan foydalanamiz, shuning uchun bu maydon noyob bo'lishi kerak, ya'ni UNIQUE indeksiga ega bo'lishi kerak.
  • email_status- Pochta tasdiqlangan yoki tasdiqlanmaganligini ko'rsatadigan maydon. Agar pochta tasdiqlansa, u 1 qiymatiga, aks holda 0 qiymatiga ega bo'ladi.
  • parol- Parolni saqlash uchun.


Agar roʻyxatdan oʻtish formangizda yana bir qancha maydonlar boʻlishini istasangiz, ularni shu yerga ham qoʻshishingiz mumkin.

Mana, bizning stolimiz foydalanuvchilar tayyor. Keling, keyingi bosqichga o'tamiz.

Ma'lumotlar bazasiga ulanish

Biz ma'lumotlar bazasini yaratdik, endi unga ulanishimiz kerak. Biz MySQLi PHP kengaytmasi yordamida ulanamiz.

Saytimiz papkasida nomli fayl yarating dbconnect.php, va unda biz quyidagi skriptni yozamiz:

Ma'lumotlar bazasiga ulanish xatosi. Xato tavsifi: ".mysqli_connect_error()."

"; exit(); ) // Ulanish kodlashini o'rnating $mysqli->set_charset("utf8"); //Qulaylik uchun bu erga bizning saytimiz nomini o'z ichiga olgan o'zgaruvchini qo'shing $address_site = "http://testsite .local" ; ?>

Bu fayl dbconnect.php shakl ishlov beruvchilariga ulanishi kerak bo'ladi.

O'zgaruvchiga e'tibor bering $address_site, bu erda men o'zim ishlaydigan test saytim nomini ko'rsatdim. Shunga ko'ra saytingiz nomini ko'rsatasiz.

Sayt tuzilishi

Endi veb-saytimizning HTML tuzilishini ko'rib chiqamiz.

Sayt sarlavhasi va altbilgisini alohida fayllarga ko'chiring, header.php va footer.php. Biz ularni barcha sahifalarda bog'laymiz. Ya'ni, asosiy (fayl index.php), ro'yxatdan o'tish shakli (fayl form_register.php) va avtorizatsiya shakli bilan sahifada (fayl form_auth.php).

Bizning havolalarimiz bilan bloklash, ro'yxatdan o'tish va ruxsat, sayt sarlavhasiga qo'shing, shunda ular barcha sahifalarda ko'rsatiladi. Bitta havola kiritiladi ro'yxatga olish shakli sahifasi(fayl form_register.php) va ikkinchisi bilan sahifaga avtorizatsiya shakli(fayl form_auth.php).

header.php faylining mazmuni:

Saytimiz nomi

Natijada bizning asosiy sahifamiz quyidagicha ko'rinadi:


Albatta, sizning saytingiz butunlay boshqacha tuzilishga ega bo'lishi mumkin, ammo bu biz uchun hozir muhim emas. Asosiysi, ro'yxatdan o'tish va avtorizatsiya qilish uchun havolalar (tugmalar) mavjud.

Endi ro'yxatdan o'tish shakliga o'tamiz. Siz allaqachon tushunganingizdek, bizda fayl mavjud form_register.php.

Biz ma'lumotlar bazasiga o'tamiz (phpMyAdmin-da), jadval tuzilishini ochamiz foydalanuvchilar va bizga qanday sohalar kerakligini ko'ring. Shunday qilib, bizga ism va familiyani kiritish uchun maydonlar, pochta manzilini (elektron pochta) kiritish maydoni va parolni kiritish uchun maydon kerak. Va xavfsizlik maqsadida biz captcha kiritish maydonini qo'shamiz.

Serverda ro'yxatdan o'tish shaklini qayta ishlash natijasida turli xil xatolar yuzaga kelishi mumkin, buning natijasida foydalanuvchi ro'yxatdan o'ta olmaydi. Shuning uchun, foydalanuvchi nima uchun ro'yxatdan o'tish muvaffaqiyatsizlikka uchraganini tushunishi uchun unga ushbu xatolar haqida xabarlarni ko'rsatish kerak.

Shaklni ko'rsatishdan oldin biz sessiyadagi xato xabarlarini ko'rsatish uchun blok qo'shamiz.

Va yana bir lahza, agar foydalanuvchi allaqachon avtorizatsiya qilingan bo'lsa va qiziqish uchun u brauzerning manzil satriga yozish orqali to'g'ridan-to'g'ri ro'yxatdan o'tish sahifasiga kiradi. website_url/form_register.php, keyin bu holda, ro'yxatdan o'tish shakli o'rniga, biz allaqachon ro'yxatdan o'tgan degan sarlavhani ko'rsatamiz.

Umuman olganda, fayl kodi form_register.php biz buni shunday oldik:

Siz allaqachon ro'yxatdan o'tgansiz

Brauzerda ro'yxatdan o'tish sahifasi quyidagicha ko'rinadi:


Yordamida zarur atribut, biz barcha maydonlarni majburiy qilib qo'ydik.

Qayerda ro'yxatdan o'tish shakli kodiga e'tibor bering captcha ko'rsatiladi:


Biz rasm uchun src atributining qiymatida faylga yo'lni ko'rsatdik captcha.php, bu captcha ni yaratadi.

Keling, fayl kodini ko'rib chiqaylik captcha.php:

Kod yaxshi izohlangan, shuning uchun men faqat bir nuqtaga e'tibor qarataman.

Funktsiya ichida imageTtfText(), shriftga yo'l belgilanadi verdana.ttf. Shunday qilib, captcha to'g'ri ishlashi uchun biz papka yaratishimiz kerak shriftlar, va u yerga shrift faylini qo'ying verdana.ttf. Siz uni Internetdan topishingiz va yuklab olishingiz yoki ushbu maqolaning materiallari bilan arxivdan olishingiz mumkin.

Biz HTML tuzilmasi bilan tugatdik, davom etish vaqti keldi.

JQuery yordamida elektron pochtani tekshirish

Har qanday shakl mijoz tomonida (JavaScript, jQuery yordamida) va server tomonida kiritilgan ma'lumotlarni tekshirishni talab qiladi.

Elektron pochta maydoniga alohida e'tibor qaratishimiz kerak. Kiritilgan elektron pochta manzili haqiqiy bo'lishi juda muhimdir.

Ushbu kiritish maydoni uchun biz elektron pochta turini o'rnatdik (type="email"), bu bizni noto'g'ri formatlardan biroz ogohlantiradi. Ammo, bu etarli emas, chunki brauzer bizga taqdim etadigan kod inspektori orqali siz atributning qiymatini osongina o'zgartirishingiz mumkin. turi bilan elektron pochta yoqilgan matn, va tamom, bizning chekimiz endi haqiqiy emas.


Va bu holda, biz yanada ishonchli tekshirishni amalga oshirishimiz kerak. Buning uchun JavaScript-dan jQuery kutubxonasidan foydalanamiz.

jQuery kutubxonasini ulash uchun faylda header.php teglar orasida , yopilish tegidan oldin , ushbu qatorni qo'shing:

Ushbu qatordan so'ng elektron pochtani tekshirish kodini qo'shing. Bu erda biz kiritilgan parol uzunligini tekshirish uchun kodni qo'shamiz. U kamida 6 ta belgidan iborat boʻlishi kerak.

Ushbu skript yordamida biz kiritilgan elektron pochta manzilining haqiqiyligini tekshiramiz. Agar foydalanuvchi noto'g'ri elektron pochta manzilini kiritgan bo'lsa, biz bu haqda xatolikni ko'rsatamiz va formaning yuborish tugmasini o'chirib qo'yamiz. Agar hamma narsa yaxshi bo'lsa, biz xatoni olib tashlaymiz va formaning yuborish tugmasini faollashtiramiz.

Shunday qilib, mijoz tomonidan shaklni tekshirish bilan biz tugatdik. Endi biz uni serverga yuborishimiz mumkin, u erda biz bir nechta tekshiruvlarni qilamiz va ma'lumotlar bazasiga ma'lumotlarni qo'shamiz.

Foydalanuvchini ro'yxatdan o'tkazish

Shaklni faylga ishlov berish uchun yuboramiz register.php, POST usuli orqali. Atribut qiymatida ko'rsatilgan ushbu ishlov beruvchi faylining nomi harakat. Va yuborish usuli atribut qiymatida ko'rsatilgan usuli.

Ushbu faylni oching register.php va biz qilishimiz kerak bo'lgan birinchi narsa - seansni ishga tushirish funksiyasini yozish va biz avval yaratilgan faylni kiritish dbconnect.php(Ushbu faylda biz ma'lumotlar bazasiga ulanishni amalga oshirdik). Va shunga qaramay, darhol hujayralarni e'lon qiling xato_xabarlar va muvaffaqiyat_xabarlari sessiya global massivida. DA xato_xabarlar biz shaklni qayta ishlash jarayonida yuzaga keladigan barcha xato xabarlarni yozib olamiz va ichida muvaffaqiyat_xabarlari Keling, baxtli xabarlar yozaylik.

Davom etishdan oldin biz tekshirishimiz kerak forma umuman topshirilganmi yoki yo'qmi. Tajovuzkor atributning qiymatiga qarashi mumkin harakat shakldan o'ting va ushbu forma qaysi faylga ishlov berayotganini bilib oling. Va u brauzerning manzil satriga quyidagi manzilni kiritish orqali to'g'ridan-to'g'ri ushbu faylga o'tish g'oyasini o'ylab topishi mumkin: http://site_site/register.php

Shunday qilib, global POST massivida nomi formadagi "Ro'yxatdan o'tish" tugmachamiz nomiga mos keladigan hujayra mavjudligini tekshirishimiz kerak. Shunday qilib, biz "Ro'yxatdan o'tish" tugmasi bosilganmi yoki yo'qligini tekshiramiz.

Agar tajovuzkor to'g'ridan-to'g'ri ushbu faylga o'tishga harakat qilsa, u xato xabarini oladi. Sizga eslatib o'tamanki, $address_site o'zgaruvchisi sayt nomini o'z ichiga oladi va u faylda e'lon qilingan dbconnect.php.

Xato! bosh sahifa.

"); } ?>

Seansdagi captcha qiymati uni yaratish jarayonida faylga qo'shilgan captcha.php. Eslatib o'tamiz, men fayldagi ushbu kod qismini yana bir bor ko'rsataman captcha.php, bu erda captcha qiymati sessiyaga qo'shiladi:

Endi testning o'ziga o'taylik. Fayl ichida register.php, if blokining ichida, biz "Ro'yxatdan o'tish" tugmasi bosilganligini tekshiramiz, to'g'rirog'i, sharh qayerda " // (1) Keyingi kod qismi uchun joy"Biz yozamiz:

//Qabul qilingan captcha ni tekshiring //String boshidan va oxiridan bo'shliqlarni kesib oling $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Qabul qilingan qiymatni sessiya qiymati bilan solishtiring. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Agar captcha noto'g'ri bo'lsa, foydalanuvchini ro'yxatdan o'tish sahifasiga qaytaring va u erda u noto'g'ri captcha kiritganligi haqida xato xabarini ko'rsatamiz. $error_message = "

Xato! Siz noto'g'ri captcha kiritdingiz

"; // Seansga xato xabarini saqlang. $_SESSION["error_messages"] = $error_message; // Foydalanuvchini ro'yxatdan o'tish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy ko'chirildi"); header("Joylashuv: " .$address_site ."/form_register.php"); //Skriptdan chiqishni to'xtating(); ) // (2) Keyingi kod qismi uchun joylashtiring )else( //Agar captcha o'tkazilmasa yoki u bo'sh bo'lsa, chiqish ("

Xato! Tasdiqlash kodi, ya'ni captcha kodi yo'q. Siz asosiy sahifaga o'tishingiz mumkin.

"); }

Keyinchalik, POST massividan olingan ma'lumotlarni qayta ishlashimiz kerak. Avvalo, biz global POST massivining mazmunini tekshirishimiz kerak, ya'ni u erda nomlari bizning formamizdagi kiritish maydonlarining nomlariga mos keladigan hujayralar mavjudligini tekshirishimiz kerak.

Agar hujayra mavjud bo'lsa, biz ushbu katakdagi satrning boshidan va oxiridan bo'sh joylarni kesib tashlaymiz, aks holda biz foydalanuvchini ro'yxatdan o'tish formasi bilan sahifaga qayta yo'naltiramiz.

Bundan tashqari, bo'shliqlar kesilgandan so'ng, biz o'zgaruvchiga satr qo'shamiz va bu o'zgaruvchining bo'shligini tekshiramiz, agar u bo'sh bo'lmasa, davom eting, aks holda biz foydalanuvchini ro'yxatdan o'tish shakli bilan sahifaga qayta yo'naltiramiz.

Ushbu kodni belgilangan joyga joylashtiring // (2) Keyingi kod qismi uchun joy".

/* $_POST global massivida formadan yuborilgan maʼlumotlar bor yoki yoʻqligini tekshiring va yuborilgan maʼlumotlarni oddiy oʻzgaruvchilarga qoʻshing.*/ if(isset($_POST["first_name"]))( // Boʻshliqlarni boshi va oxiridan qisqartiring. string $first_name = trim($_POST["first_name"]); //O'zgaruvchining bo'shligini tekshiring if(!empty($first_name))( // Xavfsizlik uchun maxsus belgilarni HTML ob'ektlariga aylantiring $first_name = htmlspecialchars( $first_name, ENT_QUOTES) ; )else( // Xato xabarini seansga saqlang. $_SESSION["error_messages"] .= "

Ismingizni kiriting

Nom maydoni yetishmayapti

"; //Foydalanuvchini roʻyxatga olish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); //Skriptdan chiqishni toʻxtating(); ) if( isset($_POST["familiya_ism"]))( // Satrning boshidan va oxiridan bo'shliqlarni kesib oling $last_name = trim($_POST["familiya_ism"]); if(!empty($last_name)) ( // Xavfsizlik uchun maxsus belgilarni HTML ob'ektlariga aylantiring $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Xato xabarini sessiyaga saqlang. $_SESSION["error_messages"] .= "

Familiyangizni kiriting

"; //Foydalanuvchini roʻyxatga olish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); //Skriptdan chiqishni toʻxtating(); ) )else ( // Xato xabarini seansga saqlang. $_SESSION["error_messages"] .= "

Nom maydoni yetishmayapti

"; //Foydalanuvchini roʻyxatga olish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); //Skriptdan chiqishni toʻxtating(); ) if( isset($_POST["email"]))( // Satrning boshidan va oxiridan bo'shliqlarni kesib tashlang $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Elektron pochta manzili formatini va uning o'ziga xosligini tekshirish uchun kod o'rni )else( // Xato xabarini sessiyaga saqlang. $_SESSION["error_messages" ] .= "

Elektron pochtangizni kiriting

"; //Foydalanuvchini roʻyxatga olish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); //Skriptdan chiqishni toʻxtating(); ) )else ( // Xato xabarini seansga saqlang. $_SESSION["error_messages"] .= "

"; //Foydalanuvchini roʻyxatga olish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); //Skriptdan chiqishni toʻxtating(); ) if( isset($_POST["password"]))( // satr boshidan va oxiridan bo'shliqlarni kesib tashlang $password = trim($_POST["password"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Parolni shifrlang $password = md5($password."top_secret"); )else( // Xato xabarini sessiyaga saqlang. $_SESSION["error_messages"] .= "

Parolingizni kiriting

"; //Foydalanuvchini roʻyxatga olish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); //Skriptdan chiqishni toʻxtating(); ) )else ( // Xato xabarini seansga saqlang. $_SESSION["error_messages"] .= "

"; //Foydalanuvchini roʻyxatga olish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); //Skriptdan chiqishni toʻxtating(); ) // (4) Ma'lumotlar bazasiga foydalanuvchi qo'shish uchun kodni joylashtiring

Bu soha alohida ahamiyatga ega. elektron pochta. Qabul qilingan pochta manzilining formatini va ma'lumotlar bazasidagi o'ziga xosligini tekshirishimiz kerak. Ya'ni, bir xil elektron pochta manziliga ega foydalanuvchi allaqachon ro'yxatdan o'tganmi.

Belgilangan joyda" // (3) Pochta manzili formatini va uning o'ziga xosligini tekshirish uchun kod joyi"quyidagi kodni qo'shing:

//Qabul qilingan elektron pochta manzilining formatini $reg_email = "/^**@(+(*+)*\.)++/i" oddiy ifodasi yordamida tekshiring; //Agar qabul qilingan elektron pochta manzilining formati oddiy ifodaga mos kelmasa if(!preg_match($reg_email, $email))( // Xato xabarini sessiyaga saqlang. $_SESSION["error_messages"] .= "

Yaroqsiz e-pochta manzilini kiritdingiz

"; //Foydalanuvchini roʻyxatga olish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); //Skriptdan chiqishni toʻxtating(); ) // Ma'lumotlar bazasida shunday manzil mavjudligini tekshiring $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email.""); Agar mavjud bo`lsa. Agar ular aynan bitta qator boʻlsa, u holda ushbu elektron pochta manziliga ega foydalanuvchi allaqachon roʻyxatdan oʻtgan if($result_query->num_rows == 1)( //Agar natija notoʻgʻri boʻlsa if(($row = $result_query->fetch_assoc()) ! = false) ( // Xato xabarini seansga saqlang. $_SESSION["error_messages"] .= "

Ushbu elektron pochta manziliga ega foydalanuvchi allaqachon ro'yxatdan o'tgan

"; //Foydalanuvchini roʻyxatdan oʻtish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); )else( //Xato xabarini saqlang sessiyaga .$_SESSION["error_messages"] .= "

Ma'lumotlar bazasi so'rovida xato

"; //Foydalanuvchini roʻyxatga olish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); ) /* tanlovni yoping */ $ result_query-> close(); //Skriptdan chiqishni toʻxtating(); ) /* tanlovni yoping */ $result_query->close();

Shunday qilib, biz barcha tekshiruvlar bilan yakunlandik, foydalanuvchini ma'lumotlar bazasiga qo'shish vaqti keldi. Belgilangan joyda" // (4) Ma'lumotlar bazasiga foydalanuvchi qo'shish uchun kodni joylashtiring"quyidagi kodni qo'shing:

//Foydalanuvchini ma'lumotlar bazasiga qo'shish uchun so'rov $result_query_insert = $mysqli->query("INSERT INTO `foydalanuvchilar' (familiya, familiya, email, parol) VALUES ("".$first_name."", "".$last_name ." ", "".$elektron pochta."", "".$parol."")"); if(!$result_query_insert)( // Xato xabarini seansga saqlang. $_SESSION["error_messages"] .= "

Maʼlumotlar bazasiga foydalanuvchi qoʻshish soʻrovi xatosi

"; //Foydalanuvchini roʻyxatga olish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); //Skriptdan chiqishni toʻxtating(); )else( $_SESSION["success_messages"] = "

Ro'yxatdan o'tish muvaffaqiyatli yakunlandi!!!
Endi siz foydalanuvchi nomi va parolingizdan foydalanib tizimga kirishingiz mumkin.

"; //Foydalanuvchini kirish sahifasi sarlavhasiga yuboring("HTTP/1.1 301 Doimiy ko'chirildi"); header("Joylashuv: ".$adres_sayt."/form_auth.php"); ) /* So'rovni bajarish */ $ result_query_insert-> close(); //Ma'lumotlar bazasi ulanishini yopish $mysqli->close();

Agar foydalanuvchini ma'lumotlar bazasiga qo'shish so'rovida xatolik yuzaga kelsa, biz ushbu xato haqida sessiyaga xabar qo'shamiz va foydalanuvchini ro'yxatdan o'tish sahifasiga qaytaramiz.

Aks holda, agar hamma narsa yaxshi bo'lsa, biz ham sessiyaga xabar qo'shamiz, lekin bu allaqachon yoqimliroq, ya'ni foydalanuvchiga ro'yxatdan o'tish muvaffaqiyatli bo'lganligini aytamiz. Va biz uni avtorizatsiya shakli bilan sahifaga yo'naltiramiz.

Elektron pochta manzili formatini va parol uzunligini tekshirish uchun skript faylda mavjud header.php, shuning uchun u o'sha shakldagi maydonlarga ham ta'sir qiladi.

Seans ham faylda boshlanadi header.php, shuning uchun faylda form_auth.php seansni boshlash shart emas, chunki biz xatoga yo'l qo'yamiz.


Aytganimdek, pochta manzili formatini va parol uzunligini tekshirish uchun skript ham bu erda ishlaydi. Shuning uchun, agar foydalanuvchi noto'g'ri elektron pochta manzilini yoki qisqa parolni kiritsa, u darhol xato xabarini oladi. Bir tugma kirish harakatsiz holga keladi.

Xatolarni tuzatgandan so'ng, tugma kirish faollashadi va foydalanuvchi shaklni qayta ishlanadigan serverga yuborishi mumkin.

Foydalanuvchi avtorizatsiyasi

Atribut qiymati uchun harakat avtorizatsiya formasida fayl mavjud auth.php, bu shakl ushbu faylda qayta ishlanishini anglatadi.

Shunday qilib, faylni ochamiz auth.php va avtorizatsiya shaklini qayta ishlash uchun kodni yozing. Birinchi narsa seansni boshlash va faylni kiritishdir dbconnect.php ma'lumotlar bazasiga ulanish uchun.

//Formani qayta ishlash jarayonida yuzaga kelishi mumkin bo'lgan xatolarni qo'shish uchun katakchani e'lon qiling. $_SESSION["error_messages"] = ""; //Muvaffaqiyatli xabarlarni qo'shish uchun katakchani e'lon qilish $_SESSION["success_messages"] = "";

/* Shakl yuborilganligini, ya'ni Login tugmasi bosilganligini tekshiring. Ha bo'lsa, biz oldinga boramiz, agar bo'lmasa, foydalanuvchiga to'g'ridan-to'g'ri ushbu sahifaga o'tganligi haqida xato xabarini ko'rsatamiz. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) Keyingi kod qismi uchun joy )else( exit("

Xato! Siz bu sahifaga toʻgʻridan-toʻgʻri kirgansiz, shuning uchun qayta ishlanadigan maʼlumotlar yoʻq. Siz asosiy sahifaga o'tishingiz mumkin.

"); }

//Qabul qilingan captcha-ni tekshiring if(isset($_POST["captcha"]))( //String boshidan va oxiridan bo'shliqlarni kesib oling $captcha = trim($_POST["captcha"]); if(!empty ($captcha ))( //Qabul qilingan qiymatni sessiya qiymati bilan solishtiring. if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != ""))( // Agar captcha noto'g'ri bo'lsa, biz foydalanuvchini avtorizatsiya sahifasiga qaytaramiz va u erda u noto'g'ri captcha kiritganligi haqida xato xabarini ko'rsatamiz. $error_message = "

Xato! Siz noto'g'ri captcha kiritdingiz

"; // Seansga xato xabarini saqlang. $_SESSION["error_messages"] = $error_message; // Foydalanuvchini avtorizatsiya sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy ko'chirildi"); header("Joylashuv: " .$address_site ."/form_auth.php"); //Skriptdan chiqishni to'xtating(); ) )else( $error_message = "

Xato! Captcha kiritish maydoni bo'sh bo'lmasligi kerak.

"; // Seansga xato xabarini saqlang. $_SESSION["error_messages"] = $error_message; // Foydalanuvchini avtorizatsiya sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy ko'chirildi"); header("Joylashuv: " .$address_site ."/form_auth.php"); //Skriptni to'xtating exit(); ) //(2) Pochta manzilini qayta ishlash joyi //(3) Parolni qayta ishlash uchun joy //(4) ma'lumotlar bazasiga so'rov qilish )else ( //Agar captcha o'tkazilmasa exit("

Xato! Tasdiqlash kodi, ya'ni captcha kodi yo'q. Siz asosiy sahifaga o'tishingiz mumkin.

"); }

Agar foydalanuvchi tasdiqlash kodini to'g'ri kiritgan bo'lsa, biz davom etamiz, aks holda uni avtorizatsiya sahifasiga qaytaramiz.

Elektron pochta manzilini tekshirish

// Satrning boshidan va oxiridan bo'sh joylarni kesish $email = trim($_POST["email"]); if(isset($_POST["email"]))( if(!empty($email))( $email = htmlspecialchars($email, ENT_QUOTES); //Qabul qilingan elektron pochta manzilining formatini $ oddiy ifodasi yordamida tekshiring. reg_email = " /^**@(+(*+)*\.)++/i"; //Agar qabul qilingan elektron pochta manzilining formati oddiy ifodaga mos kelmasa if(!preg_match($reg_email, $email) ))( // Seans xato xabariga saqlash.$_SESSION["error_messages"] .= "

Yaroqsiz e-pochta manzilini kiritdingiz

"; //Foydalanuvchini avtorizatsiya sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy ko'chirildi"); header("Joylashuv: ".$adres_sayt."/form_auth.php"); //Skriptdan chiqishni to'xtating(); ) )else ( // Xato xabarini seansga saqlang. $_SESSION["error_messages"] .= "

Pochta manzilini (elektron pochta) kiritish uchun maydon bo'sh bo'lmasligi kerak.

"; //Foydalanuvchini roʻyxatga olish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); //Skriptdan chiqishni toʻxtating(); ) )else ( // Xato xabarini seansga saqlang. $_SESSION["error_messages"] .= "

Elektron pochtani kiritish uchun maydon yo'q

"; //Foydalanuvchini avtorizatsiya sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy ko'chirildi"); header("Joylashuv: ".$adres_sayt."/form_auth.php"); //Skriptdan chiqishni to'xtating(); ) // (3) Parolni qayta ishlash uchun joy

Agar foydalanuvchi elektron pochta manzilini noto'g'ri formatda kiritgan bo'lsa yoki elektron pochta manzili maydoni bo'sh bo'lsa, biz uni avtorizatsiya sahifasiga qaytaramiz, u erda biz bu haqda xabarni ko'rsatamiz.

Parolni tekshirish

Keyingi ishlov beriladigan maydon parol maydonidir. Belgilangan joyga" //(3) Parolni qayta ishlash uchun joy", biz yozamiz:

If(isset($_POST["password"]))( // Satrning boshidan va oxiridan bo'sh joylarni kesib tashlang $password = trim($_POST["password"]); if(!empty($password))( $password = htmlspecialchars($password, ENT_QUOTES); // Parolni shifrlang $password = md5($password."top_secret"); )else( // Xato xabarini sessiyaga saqlang. $_SESSION["error_messages"] . = "

Parolingizni kiriting

"; //Foydalanuvchini roʻyxatdan oʻtish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_auth.php"); //Skriptdan chiqishni toʻxtating(); ) )else ( // Xato xabarini seansga saqlang. $_SESSION["error_messages"] .= "

Parolni kiritish uchun maydon yo'q

"; //Foydalanuvchini roʻyxatdan oʻtish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_auth.php"); //Skriptdan chiqishni toʻxtating(); )

Bu erda md5 () funktsiyasidan foydalanib, biz olingan parolni shifrlaymiz, chunki ma'lumotlar bazasida bizda shifrlangan shaklda parollar mavjud. Shifrlashda qo'shimcha maxfiy so'z, bizning holatlarimizda " eng_sirli" foydalanuvchini ro'yxatdan o'tkazishda foydalanilgan bo'lishi kerak.

Endi siz pochta manzili qabul qilingan pochta manziliga va parol qabul qilingan parolga teng bo'lgan foydalanuvchi tanlovi bo'yicha ma'lumotlar bazasiga so'rov qilishingiz kerak.

//Foydalanuvchining tanlovi bo'yicha ma'lumotlar bazasiga so'rov. $result_query_select = $mysqli->query("SELECT * FROM `users` WHERE email = "".$email."" AND password = "".$parol."""); if(!$result_query_select)( // Xato xabarini seansga saqlang. $_SESSION["error_messages"] .= "

Ma'lumotlar bazasidan foydalanuvchi tanlashda so'rov xatosi

"; //Foydalanuvchini roʻyxatdan oʻtish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy koʻchirildi"); header("Joylashuv: ".$adres_sayt."/form_auth.php"); //Skriptdan chiqishni toʻxtating(); )else( //Ma'lumotlar bazasida bunday ma'lumotlarga ega foydalanuvchi yo'qligini tekshiring, keyin xato xabarini ko'rsating if($result_query_select->num_rows == 1)( // Agar kiritilgan ma'lumotlar ma'lumotlar bazasi ma'lumotlariga mos kelsa, keyin saqlang seans massiviga login va parol. $_SESSION["email"] = $email; $_SESSION["password"] = $password; //Foydalanuvchini asosiy sahifa sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy ko'chirildi" ); header("Joylashuv: ".$adres_sayt ."/index.php"); )else( // Xato xabarini sessiyaga saqlang. $_SESSION["error_messages"] .= "

Noto'g'ri foydalanuvchi nomi va/yoki parol

"; //Foydalanuvchini avtorizatsiya sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy ko'chirildi"); header("Joylashuv: ".$adres_sayt."/form_auth.php"); //Skriptdan chiqishni to'xtating(); ))

Saytdan chiqish

Va biz amalga oshiradigan oxirgi narsa chiqish tartibi. Ayni paytda sarlavhada biz avtorizatsiya sahifasiga va ro'yxatdan o'tish sahifasiga havolalarni ko'rsatamiz.

Sayt sarlavhasida (fayl header.php), sessiyadan foydalanib, foydalanuvchi allaqachon tizimga kirganligini tekshiramiz. Agar yo'q bo'lsa, biz ro'yxatdan o'tish va avtorizatsiya havolalarini ko'rsatamiz, aks holda (agar u avtorizatsiya qilingan bo'lsa), ro'yxatdan o'tish va avtorizatsiya havolalari o'rniga havolani ko'rsatamiz. Chiqish.

Fayldan o'zgartirilgan kod qismi header.php:

Roʻyxatdan oʻtish

Chiqish

Saytdan chiqish havolasini bosganingizda, biz faylga kiramiz logout.php, bu erda biz oddiygina seansdan elektron pochta manzili va parol bilan hujayralarni yo'q qilamiz. Shundan so'ng, biz foydalanuvchini havola bosilgan sahifaga qaytaramiz Chiqish.

Fayl kodi logout.php:

Ana xolos. Endi qanday qilib ro'yxatga olish va ruxsat berish shakllarini amalga oshirish va qayta ishlash saytingizdagi foydalanuvchi. Ushbu shakllar deyarli har bir saytda topilgan, shuning uchun har bir dasturchi ularni qanday yaratishni bilishi kerak.

Shuningdek, biz kiritilgan ma'lumotlarni mijoz tomonida (brauzerda, JavaScript, jQuery yordamida) va server tomonida (PHP tilidan foydalangan holda) qanday tekshirishni o'rgandik. Biz ham o'rgandik chiqish tartibini amalga oshirish.

Barcha skriptlar sinovdan o'tgan va ishlaydi. Ushbu kichik saytning fayllari bilan arxivni ushbu havoladan yuklab olishingiz mumkin.

Kelajakda men tasvirlaydigan maqola yozaman. Va men ham tushuntirib beradigan maqola yozishni rejalashtirmoqdaman (sahifani qayta yuklamasdan). Shunday qilib, yangi maqolalar chiqishidan xabardor bo'lish uchun siz mening saytimga obuna bo'lishingiz mumkin.

Agar sizda biron bir savol bo'lsa, iltimos, bog'laning, shuningdek, maqolada biron bir xatoni sezsangiz, menga xabar bering.

Dars rejasi (5-qism):

  1. Avtorizatsiya formasi uchun HTML tuzilmasini yaratish
  2. Qabul qilingan ma'lumotlarni qayta ishlaymiz
  3. Biz sayt sarlavhasida foydalanuvchi salomini ko'rsatamiz

Maqola yoqdimi?

Reg.ru: domenlar va xosting

Rossiyadagi eng yirik registrator va xosting provayderi.

Xizmatda 2 milliondan ortiq domen nomlari.

Rag'batlantirish, domen uchun pochta, biznes uchun echimlar.

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

*Oʻtishni toʻxtatib turish uchun sichqonchani 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, ro'yxatdan o'tishni tasdiqlovchi elektron pochta xabarini yuboradigan, forma maydonlarining qolgan qismini tasdiqlaydigan va boshqa ko'p narsalarni yozadigan kod yozishingiz kerak.

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

Ushbu qo'llanmada biz parollarni umuman talab qilmaydigan yoki saqlamaydigan juda oddiy login tizimini yaratamiz! Natijani o'zgartirish va allaqachon 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 manzilini kiritish uchun maydon va ro'yxatdan o'tish tugmasi bo'ladi;
- Maydonni elektron pochta manzili bilan 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, ma'lum bir tasodifiy noyob belgilar to'plami (token) yaratiladi, u foydalanuvchi tomonidan ko'rsatilgan pochtaga 10 daqiqa davomida tegishli bo'lgan havola ko'rinishida yuboriladi;
- Havolani bosish orqali foydalanuvchi bizning veb-saytimizga o'tadi. Tizim token mavjudligini aniqlaydi va foydalanuvchiga ruxsat beradi;

Ushbu yondashuvning afzalliklari:

Parollarni saqlash va maydonlarni tekshirish kerak emas;
- Parolni tiklash, maxfiy savollar va boshqalarga ehtiyoj 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 holatlarda yoki ma'lumotlarni uzatish uchun HTTPS dan foydalanmaydigan har qanday avtorizatsiya tizimida (login / parol);
- Pochta serverini kerak bo'lganda sozlagan ekansiz, 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 taklif etiladi.

Ushbu tizimdan qanday foydalanish kerak

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

Darsga biriktirilgan manba fayllarni yuklab olishingiz kerak
- Arxivdagi faylni toping tables.sql phpMyAdmin-dagi import opsiyasidan foydalanib, uni ma'lumotlar bazasiga import qiling. Muqobil usul: ushbu faylni matn muharriri bilan oching, SQL so'rovini nusxalash va uni ishga tushirish;
- Ochiq o'z ichiga oladi/main.php va ma'lumotlar bazasiga ulanish sozlamalarini to'ldiring (ma'lumotlar bazasiga ulanish uchun foydalanuvchi va parolni, shuningdek, ma'lumotlar bazasining 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 formada xostning boshqaruv panelidan yaratilgan haqiqiy elektron pochta manzili ko'rsatilmaguncha chiquvchi elektron pochta xabarlarini bloklaydi, shuning uchun haqiqiy manzilni kiriting;
- Barcha fayllarni yuklab oling index.php, protected.php va aktivlar va hostingizga FTP orqali papkalarni o'z ichiga oladi;
- Avtorizatsiya 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 faylda joylashgan index.php. Ushbu faylda, shuningdek, ariza ma'lumotlari va avtorizatsiya tizimining boshqa foydali xususiyatlari bilan ishlaydigan PHP kodi mavjud. Quyidagi PHP kodini ko'rib chiqish bo'limida bu haqda ko'proq ma'lumot olishingiz mumkin.

index.php

Qo'llanma: PHP va MySQL bilan juda oddiy ro'yxatga olish tizimi

Kirish yoki Ro'yxatdan o'tish

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

Bosh qismida (teglar orasida va) Men asosiy uslublarni kiritdim (ular ushbu qo‘llanmada tahlil qilinmagan, shuning uchun ularni o‘zingiz ko‘rishingiz mumkin. Assets/css/style.css papkasi). Yopish belgisidan oldin Men jQuery kutubxonasini va script.js faylini qo'shdim, biz ularni quyida yozamiz va tahlil qilamiz.


JavaScript

jQuery funksiyasi bilan “Ro‘yxatdan o‘tish/Kirish” tugmasi holatini kuzatib boradi e.preventDefault() va AJAX so'rovlarini yuboradi. Serverning javobiga qarab, ma'lum bir xabarni ko'rsatadi va keyingi harakatlarni belgilaydi /

assets/js/script.js

$(function()( var form = $("#login-register"); form.on("submit", function(e)( if(form.is(".loading, .loggedIn"))( return false ; ) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (elektron pochta: email), funksiya (m)( if(m.error)( form.addClass("xato"); messageHolder.text(m.message); ) else(form.removeClass("xato").addClass("loggedIn"); messageHolder. text(m.message); ))) )); )); $(hujjat).ajaxStart(funksiya()(form.addClass("yuklash"); )); $(hujjat).ajaxComplete(funksiya()( shakl. removeClass("yuklash"); ); ));

AJAX so'rovining joriy holatini ko'rsatish uchun shaklga qo'shildi (bu usullar tufayli mumkin bo'ldi ajaxStart()) va ajaxComplete(), uni faylning oxirida topishingiz mumkin).

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

Ma'lumotlar bazasi sxemasi

Bizning ajoyib oddiy jurnal tizimi 2 ta MySQL jadvalidan foydalanadi (SQL kodi faylda mavjud) tables.sql). Birinchisi foydalanuvchi hisoblari haqidagi ma'lumotlarni saqlaydi. Ikkinchisi kirishga urinishlar soni haqidagi ma'lumotlarni saqlaydi.


Foydalanuvchi jadvali sxemasi.

Tizim parollardan foydalanmaydi, buni diagrammada ko'rish mumkin. Unda siz ustunni ko'rishingiz mumkin token ustunga ulashgan tokenlar bilan token_validity. Token foydalanuvchi tizimga ulanishi, elektron pochta manzilini xabar yuborish uchun sozlashi bilanoq o'rnatiladi (keyingi blokda bu haqda bir oz ko'proq). Spiker token_validity vaqtni 10 daqiqadan keyin o'rnatadi, shundan so'ng token endi haqiqiy emas.


Avtorizatsiyaga urinishlar sonini hisoblaydigan jadval sxemasi.

Ikkala jadvalda IP-manzil ip2long funksiyasidan foydalangan holda qayta ishlangan shaklda butun son maydonida saqlanadi.

Endi biz PHP kodini yozishimiz mumkin. Tizimning asosiy funksionalligi sinfga tayinlangan user.class.php 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 tekshirish bilan shug'ullanadi. Bu oddiy interfeys bo'lib, 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. Faqat yaroqli tokenlar hisobga olinadi. Token yaratilgan paytdan boshlab faqat 10 daqiqa davomida hosil boʻladi * @param string $token Bu siz izlayotgan tokendir * @return User. Foydalanuvchi funksiyasining qiymatini qaytaring */ 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; ) yangi User($result); ) /** * Foydalanuvchini avtorizatsiya qilish yoki ro‘yxatdan o‘tkazish * @param string $email.Userning email manzili * @return User */ umumiy statik funksiya loginOrRegister($email)( // Agar shunday foydalanuvchi bo‘lsa allaqachon mavjud bo'lsa, ma'lumotlar bazasida saqlangan ko'rsatilgan elektron pochta manzilidan Foydalanuvchi funksiyasining qiymatini qaytaring, if(User::exists($email))( return new User($email); ) // Aks holda, yangi foydalanuvchi yarating tel ma'lumotlar bazasida va ko'rsatilgan elektron pochtadan User::create funksiyasining qiymatini qaytaring User::create($email); ) /** * Yangi foydalanuvchi yarating va maʼlumotlar bazasiga saqlang * @param string $email. Foydalanuvchining elektron pochta manzili * @return User */ private static function create($email)( // Yangi foydalanuvchini roʻyxatdan oʻtkazing va ushbu qiymatlardan foydalanuvchi funksiyasi natijasini qaytaring $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Maʼlumotlar bazasida shunday foydalanuvchi mavjudligini tekshiring va boolean qiymatini qaytaring. o'zgaruvchisi * @param string $email. Foydalanuvchi elektron pochta manzili * @return boolean */ umumiy statik funksiya mavjud($email)( // Foydalanuvchi maʼlumotlar bazasida bormi? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Yangi foydalanuvchi obyektini yarating * @param instance $param ORM , id, email yoki 0 * @return User */ public function __construct($param = null) ( if($param instanceof ORM)( // ORM tekshiruvi oʻtkazildi $this->orm = $param; ) else if(is_string($param))( // Elektron pochta tekshiruvidan oʻtdi $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // foydalanuvchi identifikatori $ qiymatini o'tkazdi. param o'zgaruvchisi $id = $param; ) else if(isset($_SESSION["loginid"]))( // Aks holda $id = $_SESSION["loginid"]; seansiga qarang) $this->orm = ORM:: for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Yangi SHA1 avtorizatsiya tokenini yarating, deb yozadi ma'lumotlar bazasiga va uning qiymatini qaytaradi * @return string */ public function generateToken()( // Ruxsat etilgan foydalanuvchi uchun token yarating va uni ma'lumotlar bazasiga saqlang $token = sha1($this->email.time().rand (0, 1000000 )); // Tokenni ma'lumotlar bazasida saqlang // Va uni faqat keyingi 10 daqiqa davomida 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 qaytarish; ) /** * Foydalanuvchiga ruxsat berish * @return void */ umumiy funktsiya login()( // Foydalanuvchini tizimga kirgan deb belgilash $_SESSION["loginid"] = $this->orm->id; // Qiymatni yangilash last_login ma'lumotlar bazasi maydonining $this->orm->set_expr("so'nggi_login", "NOW()"); $this->orm->save(); ) /** * Seansni yo'q qiling va foydalanuvchini tizimdan chiqing * @return void */ umumiy funktsiyadan chiqish ()( $_SESSION = array(); unset($_SESSION); ) /** * Foydalanuvchi tizimga kirganligini tekshiring * @return boolean */ public function loggedIn()( return isset($) this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Foydalanuvchining administrator ekanligini tekshiring * @return boolean */ umumiy funktsiya isAdmin() ( return $this->rank() = = "administrator"; ) /** * Foydalanuvchi turini toping, administrator yoki oddiy boʻlishi mumkin * @return string */ public function rank()( if($this->orm- >rank == 1)( "administrator"ni qaytaring; ) "muntazam"ni qaytaring; ) /** * Shaxsiy ma'lumotlarni olish imkonini beruvchi usul * Foydalanuvchi obyektining xossalari sifatida * @param string $key Kiritilgan xususiyat nomi * @return mixed */ umumiy funksiya __get($key)( if(isset($this->orm->$key)) ($this->orm->$kalitni qaytaring; ) nullni qaytarish; ))

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

Token tekshirish protsedurasidan o'tganda, biz tokenga token_validity ustunida saqlangan muddati tugamagan tokenlarni ko'rib chiqayotganimizni to'g'ridan-to'g'ri aytamiz.

E'tibor bering, men sehrli usuldan foydalanaman __olmoq Foydalanuvchi ob'ektining xususiyatlariga kirishni to'xtatish uchun fayl oxiridagi docs kutubxonasi.

Buning yordamida ma'lumotlar bazasida saqlangan ma'lumotlarga xususiyatlar tufayli kirish mumkin bo'ladi $user->email, $user->token va hokazo. Quyidagi kod parchasida ushbu sinflardan qanday foydalanishni misol qilib olaylik.


Himoyalangan sahifa

Foydali va kerakli funksiyalarni saqlaydigan yana bir fayl bu fayldir functions.php. Bu erda bir nechta yordamchilar mavjud - boshqa fayllarda toza va o'qilishi mumkin bo'lgan kod yaratish imkonini beruvchi yordamchi funktsiyalar.

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 ); ) funksiya get_page_url()( // PHP fayl URL manzilini oling $url = "http".(bo'sh($_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; ) funksiya rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Ushbu IP-manzilda oxirgi bir soat ichida kirishga urinishlar soni $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 kirishga urinishlar soni $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprint f("%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 hisoblash $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("Joylashuv: $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. Bu funksiyalar forma ma’lumotlari qayta ishlanayotganda va yuborilayotganda chaqiriladi, buni quyidagi kod parchasidan ko‘rishingiz mumkin.

Quyidagi kod fayldan olingan index.php va u shaklni yuborish bilan shug'ullanadi. Bu faylda jQuery tomonidan qayta ishlanadigan JSON javobini qaytaradi assets/js/script.js biz allaqachon muhokama qilganmiz.

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 oching("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"]); // Kirish urinishini yozib oling rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Foydalanuvchiga elektron pochta xabarini yuboring $message = ""; $email = $_POST["email"]; $subject = "Kirish havolangiz"; if(!User:: exists($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 = Foydalanuvchi ::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["elektron pochta"], $mavzu, $xabar); 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 avtorizatsiya/roʻyxatdan oʻtgandan soʻng yuqoridagi kod foydalanuvchiga avtorizatsiya uchun havola yuboradi. Token mavjud bo'ladi, chunki usul bilan hosil qilingan havolada o'zgaruvchi sifatida uzatiladi $_GET marker bilan tkn

index.php

If(isset($_GET["tkn"]))( // Bu token avtorizatsiya uchun amal qiladimi? $user = User::findByToken($_GET["tkn"]); if($user)( // Ha , Himoyalangan sahifaga yo'naltirish $user->login(); redirect("protected.php"); ) // Yo'q, token noto'g'ri. Login/ro'yxatdan o'tish formasi bilan sahifaga yo'naltirish redirect("index. php ");)

$user->login()

seans uchun kerakli o'zgaruvchilarni yaratadi, shunda foydalanuvchi saytning keyingi sahifalarini ko'rib, doimo avtorizatsiyaga ega bo'lib qoladi.

Xuddi shunday tizimdan chiqish funksiyasini qayta ishlash ham tartibga solinadi.

index.php

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

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

Bizning fayl index.php qo'shimcha talab qiladi himoya - biz tizimga hech qachon 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"); )

Nihoyat, bu yerda sizning saytingiz sahifalarini himoya qilish va uni faqat avtorizatsiyadan so'ng foydalanish imkonini beruvchi 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 yerda ishlatiladi, chunki raqamlar odatda ma'lumotlar bazasida saqlanadi (oddiy foydalanuvchi uchun 0, administrator uchun 1) va biz bu ma'lumotlarni ular tegishli bo'lgan statuslarga 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. Administrator maqomi hech qanday imtiyozlar bermaydi, bu misolda sahifa sizning administrator ekanligingizni ko'rsatadi - va bu.

Lekin u bilan nima qilish kerak - bu sizning ixtiyoringizda qoladi, siz ma'murlar uchun ma'lum imtiyozlar va imkoniyatlarni o'rnatadigan kodni o'zingiz yozishingiz va yozishingiz mumkin.

Biz tugatdik!

Ushbu ajoyib super kvazi oddiy shakl bilan biz tugatdik! Siz uni PHP saytlarida ishlatishingiz mumkin, bu juda oddiy. Bundan tashqari, uni o'zingiz uchun o'zgartirishingiz va xohlaganingizcha qilishingiz mumkin.

Material Denis Malyshok tomonidan sayt sayti uchun maxsus tayyorlangan

P.S. PHP va OOP tillarini o'zlashtirishda oldinga siljishni xohlaysizmi? Veb-sayt yaratishning turli jihatlari, jumladan, PHP dasturlash bo‘yicha premium darsliklarni, shuningdek OOP yordamida PHP CMS tizimini noldan yaratish bo‘yicha bepul kursni ko‘rib chiqing:

Material yoqdimi va rahmat aytmoqchimisiz?
Faqat do'stlaringiz va hamkasblaringiz bilan baham ko'ring!


Bugun biz oktyabr oyi oxirida Internetda portlagan mashhur Joomla CMS-ning 1 kunlik muhim zaifligidan foydalanishni ko'rib chiqamiz. Biz raqamlar bilan zaifliklar haqida gaplashamiz CVE-2016-8869, CVE-2016-8870 va CVE-2016-9081. Uchalasi ham bir xil kod bo'lagidan kelib chiqqan bo'lib, besh yil davomida ramkaning ichagida qolib, qanotlarida ozod bo'lishni va tartibsizlikni, buzilgan saytlarni va ushbu Joomla-ning begunoh foydalanuvchilarining ko'z yoshlarini olib kelishni kutmoqda. Ko'zlari monitorlar nuridan qizarib ketgan va klaviaturalari non bo'laklari bilan to'ldirilgan eng jasur va jasur ishlab chiquvchilargina g'azablangan yovuz ruhlarga qarshi turishga va boshlarini tuzatish qurbongohiga qo'yishga muvaffaq bo'lishdi.

OGOHLANTIRISH

Barcha ma'lumotlar faqat ma'lumot olish uchun taqdim etiladi. Na muharrirlar, na muallif ushbu maqola materiallaridan kelib chiqishi mumkin bo'lgan har qanday zarar uchun javobgar emas.

Hammasi qanday boshlandi

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 register() foydalanuvchilarni ro‘yxatdan o‘tkazishning ikkita usuli bor? Birinchisi UsersControllerRegistration boshqaruvchisida, ikkinchisi esa UsersControllerUser da. Damis qayerdadir UsersControllerUser::register() usuli qo‘llanilmoqdami yoki bu eski mantiqdan qolgan evolyutsion anaxronizmmi, bilishni xohladi. U bu usul hech qanday ko'rinish tomonidan qo'llanilmasa ham, uni yaratilgan so'rov bilan chaqirish mumkinligidan xavotirda edi. Bunga men ishlab chiqaruvchidan itoctopus taxallusi ostida javob oldim, u muammo haqiqatan ham mavjudligini tasdiqladi. Va Joomla dasturchilariga hisobot yubordi.

Keyingi voqealar eng tez rivojlandi. 18-oktabr kuni Joomla ishlab chiquvchilari Damisning hisobotini qabul qiladilar, u o‘sha paytga qadar foydalanuvchini ro‘yxatdan o‘tkazish imkonini beruvchi PoC loyihasini ishlab chiqqan edi. U o'z veb-saytida eslatmani e'lon qildi, unda u topilgan muammo va bu boradagi fikrlari haqida umumiy ma'noda gapirdi. Shu kuni Joomla 3.6.3 ning yangi versiyasi chiqdi, unda hali ham zaif kod mavjud.

Shundan so'ng Davide Tampellini xatoni oddiy foydalanuvchini emas, balki ma'murni ro'yxatdan o'tkazish holatiga aylantiradi. 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-oktabr kuni Joomla Security Strike Team Damis tomonidan topilgan kod qismi tomonidan yaratilgan so‘nggi muammoni topdi. Keyin, 21-oktabrdan boshlab Prepare 3.6.4 Stabil Release nomli ko‘rinmas nomga ega bo‘lgan majburiyat rasmiy Joomla omborining asosiy bo‘limiga yuboriladi, bu noxush xatoni tuzatadi.

Bu paydo bo'lgandan so'ng, ko'plab manfaatdor shaxslar ishlab chiquvchilar kabinasiga qo'shilishadi - ular zaiflikni aylantira boshlaydilar va sploitlarni tayyorlaydilar.

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

Tafsilotlar

Xo'sh, tarixdan oldingi davr tugadi, keling, eng qiziqarlisiga - zaiflikni tahlil qilishga o'taylik. Eksperimental versiya sifatida men Joomla 3.6.3 ni o'rnatdim, shuning uchun barcha qator raqamlari ushbu versiya uchun tegishli bo'ladi. Va siz keyingi ko'rgan fayllarga olib boradigan barcha yo'llar o'rnatilgan CMS ildiziga nisbatan ko'rsatiladi.

Damis Palmaning topilmasi 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) /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: // Shakl ma'lumotlarini oling. 301: $data = $this->input->post->get("user", array(), "array"); . .. 315: $return = $model->validate($form, $data); 316: 317: // Xatolarni tekshiring 318: 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'yxatdan o'tish paytida nima sodir bo'lishini aniqlaylik: qanday ma'lumotlar yuboriladi va ular qanday qayta ishlanadi. Agar sozlamalarda foydalanuvchini ro'yxatdan o'tkazish yoqilgan bo'lsa, shaklni http://joomla.local/index.php/component/users/?view=registration manzilida 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.

Papkadagi skript nomlari kontrollerlar chaqirilgan kontrollerlarning nomlarini moslang. Bizning so'rovimizda hozir $controller = "registration" mavjud bo'lgani uchun fayl chaqiriladi register.php va uning registr() usuli.

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. Va zaif boshqaruvchi qayerda? To'g'ri, faylda user.php. Ma'lum bo'lishicha, $controller = "user" . Hammasini birlashtirib, biz vazifani olamiz = user.register . 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 deb nomlangan massivni kutadi, unda biz ro'yxatdan o'tish uchun ma'lumotlarni o'tkazamiz - ism, login, parol, pochta (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");

Farzandimiz ushbu ma'lumotlarni foydalanuvchi nomli 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 xeshga o'xshaydi va siz uni, masalan, /index.php/component/users/?view=login saytidagi avtorizatsiya shaklidan olishingiz mumkin.


Endi siz kerakli usul orqali foydalanuvchilarni yaratishingiz mumkin. Agar hamma narsa muvaffaqiyatli bo'lsa, tabriklaymiz - siz zaiflikdan foydalangansiz CVE-2016-8870"Yangi foydalanuvchilarni ro'yxatdan o'tkazish uchun ruxsatnoma tekshiruvi etishmayapti."

UsersControllerRegistration kontrolleridagi "ishchi" registr() usulida u quyidagicha 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:

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

Ha, yo'q.

Ikkinchi, ancha jiddiy muammoni tushunish uchun biz shakllantirgan so'rovni yuboramiz va kodning turli qismlarida qanday bajarilishini ko'rib chiqamiz. Ishchi usulida foydalanuvchi tomonidan taqdim etilgan ma'lumotlarni tekshirish uchun mas'ul bo'lgan qism:

Davomi faqat aʼzolar uchun mavjud

Variant 1. Saytdagi barcha materiallarni o'qish uchun "sayt" jamoasiga qo'shiling

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

Oxirgi marta 2019-yil 23-iyulda Vinsi tomonidan o‘zgartirilgan.

Foydalanuvchini ro'yxatdan o'tkazish yoki ro'yxatdan o'tish ko'plab veb-ilovalarning ajralmas qismidir va dasturning muvaffaqiyati uchun uni to'g'ri qabul qilish juda muhimdir. Bu sizning ilovangiz bilan foydalanuvchi ishtirokining boshlang'ich nuqtasidir.

Bu eng yaxshi UI / UX bilan iloji boricha sodda bo'lishi kerak. PHP yordamida foydalanuvchini ro'yxatdan o'tkazish funksiyasini amalga oshirish oddiy vazifadir va men sizga ushbu maqoladagi misol bilan qadamlar orqali o'taman.

Ichida nima bor?

Ushbu PHP foydalanuvchisini ro'yxatdan o'tkazish misoli qanday ishlaydi?

Ushbu misol kodini 3 qismga ajratish mumkin.

  1. HTML formasi orqali foydalanuvchi ma'lumotlarini olish.
  2. Shaklni yuborishda foydalanuvchi tomonidan taqdim etilgan ma'lumotlar tasdiqlanmoqda.
  3. Ro'yxatdan o'tgan foydalanuvchini tekshirishdan keyin ma'lumotlar bazasiga saqlash uchun ma'lumotlar bazasi bilan ishlash.

Uchinchi qadam foydalanuvchi allaqachon qo'shilmaganligiga ishonch hosil qilgandan so'ng amalga oshiriladi. Ushbu ma'lumotlarning yagonaligini tekshirish ular kiritgan elektron pochta va foydalanuvchi nomi asosida amalga oshiriladi.

Ro'yxatdan o'tish paytida biz odatda ilovamizda ro'yxatdan o'tishga tayyor bo'lgan foydalanuvchi ma'lumotlarini yig'amiz. Ulardan ba'zilari majburiy, ba'zilari esa ixtiyoriy bo'ladi.

Shunday qilib, ushbu funktsiya foydalanuvchi ma'lumotlarining bo'sh emasligi va formatini ta'minlash uchun tekshirish qismini ham o'z ichiga olishi mumkin. Tasdiqlash mijoz yoki server tomonida amalga oshirilishi mumkin.

Server tomonida tekshirish har doim yaxshiroqdir. Foydalanuvchilarga qulaylik yaratish uchun uni mijoz tomonida ham tanlashingiz mumkin. Ammo server tomonida bo'lish ixtiyoriy emas va minimal talab.

fayl tuzilishi

Foydalanuvchi ro'yxatdan o'tishga ruxsat berish uchun HTML shakli

Ushbu misolda ro'yxatdan o'tish formasi foydalanuvchi nomi, Ism (ko'rsatish nomi), Parol va elektron pochta maydonlarini o'z ichiga oladi. Shuningdek, foydalanuvchi tasdiqlash uchun parolni qayta kiritishiga ruxsat beruvchi Parolni tasdiqlash maydoniga ega. Bu ikki parol keyinroq bir vaqtda solishtiriladi.

Ushbu shaklni yuborish orqali foydalanuvchi shartlar va shartlarga rozi bo'lishi kutiladi. Shunday qilib, uni ta'minlash uchun Ro'yxatdan o'tish tugmasi oldiga tasdiqlash qutisi maydoni qo'shiladi.

PHP foydalanuvchi ro'yxatdan o'tish shakli

Ro'yxatdan o'tish
"; } ?>
">
">
">
Men shart va shartlarni qabul qilaman

Va uslublar

Asosiy (shrift oilasi: Arial; rang: #333; shrift o‘lchami: 0,95em; ) .form-head (rang: #191919; shrift og‘irligi: normal; shrift og‘irligi: 400; cheti: 0; matnni tekislash : markaz; shrift oʻlchami: 1.8em; ) .xato xabari (toʻldirish: 7px 10px; fon: #fff1f2; chegara: #ffd5da 1px qattiq; rang: #d6001c; chegara radiusi: 4px; hoshiya: 30px 0px 10px 0px ; ) .success-xabar ( to‘ldirish: 7px 10px; fon: #cae0c4; hoshiya: #c3d0b5 1px qattiq; rang: #027506; chegara radiusi: 4px; hoshiya: 30px 0px 10px 0px; ) .demo-jadval ( fon: #ffffff; chegara oralig'i: boshlang'ich; hoshiya: 15 piksel avtomatik; so'zni buzish: so'zni buzish; jadval tartibi: avtomatik; chiziq balandligi: 1,8 em; rang: # 333; chegara radiusi: 4 piksel; to'ldirish: 20 piksel 40 piksel ;kenglik: 380px;chegara: 1px qattiq;border-rang: #e5e6e9 #dfe0e4 #d0d1d5; ) .demo-jadval .label (rang: #888888; ) .demo-jadval .field-ustun ( toʻldirish: 15px 0px;) .demo-input-box ( to‘ldirish: 13px; chegara: #CCC 1px qattiq; chegara radiusi: 4px; kenglik: 100%; ) .btnRegister ( to‘ldirish: 13px; fon rangi: #5d9cec; rang: #f5f7fa; kursor: ko'rsatgich; chegara radiusi: 4px kengligi: 100% chegara: #5791da 1px qattiq; shrift o'lchami: 1,1em ) .response-text (maksimal kenglik: 380px; shrift oʻlchami: 1,5em; matnni tekislash: markaz; fon: #fff3de; toʻldirish: 42px; chegara radiusi: 3px; chegara: #f5e9d4 1px qattiq; shrift-oilasi : arial; chiziq balandligi: 34px; chekka: 15px avtomatik; ) .terms (chet-pastki: 5px; )

Shaklni yuborishda foydalanuvchi ma'lumotlarini qanday tekshirish mumkin

Foydalanuvchi ro'yxatga olish ma'lumotlarini tekshirish uchun ushbu misolga server tomonidagi shaklni tekshirish skripti qo'shilgan. Ushbu PHP tasdiqlash skripti ro'yxatdan o'tish formasini topshirishda chaqiriladi.

Ushbu skript har bir maydon uchun bo'sh emasligini tekshirish uchun barcha shakl maydonlarini tasdiqlaydi. Keyin u PHP ning filter_var() funksiyasi yordamida foydalanuvchi elektron pochta formatini tasdiqlaydi.

Ro'yxatdan o'tish parolni tasdiqlash xususiyatini o'z ichiga olganligi sababli, parolni taqqoslash ushbu misolning ushbu qismida amalga oshiriladi.

Nihoyat, tasdiqlash skripti foydalanuvchi shakldagi tegishli katakchani belgilash orqali shart va shartni qabul qiladimi yoki yo'qligini tekshiradi.

Boolean true qiymatini qaytarish orqali barcha tekshirish tugallangandan so'ng, haqiqiy ro'yxatga olish jarayoni sodir bo'ladi.

ValidateMember() funksiyasi ( $valid = true; $errorMessage = array(); foreach ($_POST sifatida $key => $value) (agar (boʻsh($_POST[$kalit))) ( $valid = false; ) ) if($valid == true) (if ($_POST["parol"] != $_POST["confirm_password"]) ( $errorMessage = "Parollar bir xil bo‘lishi kerak."; $valid = false; ) agar (! isset ($error_message)) (if (! filter_var($_POST["userEmail"], FILTER_VALIDATE_EMAIL)) ( $errorMessage = "Yaroqsiz elektron pochta manzili."; $valid = false; ) ) agar (! isset($) error_message)) ( if (! isset($_POST["shartlar"])) ( $errorMessage = "Shartlar va shartlarni qabul qilaman."; $valid = false; ) ) ) else ( $errorMessage = "Barcha maydonlar talab qilinadi." ; ) agar ( $valid == false) ( return $errorMessage; ) return; )

Ro'yxatdan o'tgan foydalanuvchini saqlash uchun ma'lumotlar bazasiga kirish uchun PHP MySQL kodi

Server tomonida foydalanuvchi shaklini tekshirish

Bu formani tekshirish uchun server tomonidagi barcha skriptlarni boshqarish va tekshirish natijasi asosida ma'lumotlar bazasi operatsiyalarini boshqarish uchun PHP kirish nuqtasidir.

validateMember($username, $displayName, $parol, $email); agar (empty($errorMessage)) ( $memberCount = $member->isMemberExists($username, $email); if ($memberCount == 0) ( $insertId = $member->insertMemberRecord($username, $displayName, $) parol, $email); if (! empty($insertId)) ( header("Joylashuv: Thankyou.php"); ) ) else ( $errorMessage = "Foydalanuvchi allaqachon mavjud."; ) ) ) ?>

Foydalanuvchi allaqachon mavjudligini tekshiring

isMemberExists() funksiyasi foydalanuvchi maʼlumotlarining oʻziga xosligini ularning elektron pochtasi va foydalanuvchi nomi asosida tekshirish uchun ishlatiladi. Agar kiritilgan foydalanuvchi nomi yoki elektron pochta foydalanuvchi ma'lumotlar bazasida mavjud bo'lsa, ro'yxatdan o'tish jarayoni qaytib kelish va tasdiqlash bilan to'xtatiladi.

Ushbu tasdiq "foydalanuvchi allaqachon mavjudligi" haqida xabar beradi. kod bu,

Funktsiya isMemberExists($username, $email) ( $query = "FROM registered_users QERDA foydalanuvchi_nomi = ? OR email = ?"; $paramType = "ss"; $paramArray = array($username, $email); $memberCount = $this->ds->numRows($query, $paramType, $paramArray); return $memberCount; )

Ma'lumotlar bazasiga a'zolar ma'lumotlarini kiriting

Agar u 0 ni qaytarsa, bu elektron pochta yoki kiritilgan foydalanuvchi nomi bilan bunday foydalanuvchilar mavjud emasligini anglatadi. Shunday qilib, ro'yxatga olish ma'lumotlari ma'lumotlar bazasiga kiritiladi. Quyidagi kod a'zolarni kiritish usulini ko'rsatadi.

Funktsiya insertMemberRecord($username, $displayName, $password, $email) ( $passwordHash = md5($password); $query = "Ro'yxatdan o'tgan_foydalanuvchilarga (foydalanuvchi_nomi, displey_nomi, parol, elektron pochta) QIYMATLAR (?, ?, ?, ? )"; $paramType = "ssss"; $paramArray = massiv ($username, $displayName, $passwordHash, $email); $insertId = $this->ds->insert ($query, $paramType, $paramArray); $insertId ni qaytaring;)

DataSource.php

Bu ma'lumotlar bazasi operatsiyalarini bajarish uchun PHPdagi umumiy ma'lumotlar manbai sinfidir. U ma'lumotlar bazasini ulash va ma'lumotlar bazasi natijalarini olish uchun turli so'rovlarni bajarish, qatorlar soni, qo'shishni bajarish va boshqalarni o'z ichiga oladi.

Ushbu ma'lumotlar manbai klassi umumiy bo'lib, iloji boricha soddalashtirilgan. Bu samarali va men uni ko'pgina mikro loyihalar va darsliklarimda ishlataman. Siz uni bepul yuklab olishingiz va ishlatishingiz mumkin.

muhim narsa Tayyorlangan bayonotlardan foydalanishni hech qachon unutmang. Bu sizga SQL in'ektsion hujumlaridan himoyalanishga yordam beradi va bu veb-ilovada xavfsizlikni amalga oshirish nuqtai nazaridan birinchi qadamdir.

conn = $this->getConnection(); ) /** * Agar ulanish ob'ekti kerak bo'lsa, ushbu usuldan foydalaning va unga kirish huquqini oling. * Aks holda, kiritish / yangilash / h.k. uchun quyidagi usullardan foydalaning. * * @return \mysqli */ umumiy funksiya getConnection() ( $conn = new \mysqli(self::HOST, self::USERNAME, self::PASSWORD, self::DATABASENAME); agar (mysqli_connect_errno()) ( trigger_error ("Ma'lumotlar bazasiga ulanishda muammo."); ) $conn->set_charset("utf8"); return $conn; ) /** * Ma'lumotlar bazasi natijalarini olish uchun * @param string $query * @param string $paramType * @ param massivi $paramArray * @return massivi */ umumiy funktsiyani tanlang($query, $paramType="", $paramArray=array()) ( $stmt = $this->conn->prepare($query); if(! empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($sql, $paramType, $paramArray); ) $stmt->execute(); $result = $stmt->get_result(); agar ($natija->qatorlar_soni > 0) ( while ($satr = $natija->fetch_assoc()) ( $resultset = $satr; ) ) agar (! empty($resultset)) ($resultset; ) ) / ** * kiritish uchun * @param string $query * @param string $paramType * @param array $paramArray * @return int */ public function insert($query, $paramType, $p) aramArray) ( $so'rovni chop etish; $stmt = $this->conn->tayyorlash($query); $this->bindQueryParams($stmt, $paramType, $paramArray); $stmt->execute(); $insertId = $stmt->insert_id; $insertIdni qaytarish; ) /** * Soʻrovni bajarish uchun * @param string $query * @param string $paramType * @param array $paramArray */ public function execute($query, $paramType="", $paramArray=array()) ( $ stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($stmt, $paramType="", $paramArray= array()); ) $stmt->execute(); ) /** * 1. Parametrlarni bog‘lashni tayyorlaydi * 2. Prametrlarni sql operatoriga bog‘lash * @param string $stmt * @param string $paramType * @param array $ paramArray */ umumiy funktsiya bindQueryParams($stmt, $paramType, $paramArray=array()) ($paramValueReference = & $paramType; ($i = 0; $i) uchun< count($paramArray); $i ++) { $paramValueReference = & $paramArray[$i]; } call_user_func_array(array($stmt, "bind_param"), $paramValueReference); } /** * To get database results * @param string $query * @param string $paramType * @param array $paramArray * @return array */ public function numRows($query, $paramType="", $paramArray=array()) { $stmt = $this->conn->tayyorlash($query); if(!empty($paramType) && !empty($paramArray)) ( $this->bindQueryParams($stmt, $paramType, $paramArray); ) $stmt->execute(); $stmt->store_result(); $recordCount = $stmt->qator_son; $recordCountni qaytarish; ))

Ma'lumotlar bazasi skripti

Ushbu ma'lumotlar bazasi skriptida registered_users jadvali uchun yaratish bayonoti mavjud. Ushbu kodni ishga tushirish uchun ushbu skriptni ishlab chiqish muhitiga import qiling.

`ro`yxatdan o`tgan_foydalanuvchilar` jadvali uchun jadval tuzilmasi -- AGAR MAVJUD BO`LSA JADVAL YARATING `registered_users` (`id` int(8) NO NULL AUTO_INCREMENT, `user_name` varchar(255) NOT NULL, `first_name` varchar(255)` familiya_nomi` varchar(255) NO NULL, `parol` varchar(25) NO NULL, `email` varchar(55) NO NULL, `jins` varchar(20) NULL EMAS, ASOSIY KEY (`id`));

Agar ro'yxatdan o'tish shaklini tekshirish muvaffaqiyatsiz tugasa, foydalanuvchiga quyidagi kabi xato xabari ko'rsatiladi.

"MySQL ma'lumotlar bazasi bilan PHP foydalanuvchisini ro'yxatdan o'tkazish shakli (ro'yxatdan o'tish)" ga sharhlar

    Salom Vinsi, men ro'yxatga olish kodini ishga tushirishda quyidagi xatolarni olaman, iltimos yordam bering.

    Roʻyxatdan oʻtgan_foydalanuvchilar (foydalanuvchi_nomi, koʻrsatilgan_nom, parol, elektron pochta) QIYMATLARGA KIRISH (?, ​​?, ?, ?)
    Ogohlantirish: call_user_func_array() 1-parametrni yaroqli qayta qo‘ng‘iroq qilishini kutadi, birinchi massiv a’zosi 136-qatordagi C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php da yaroqli sinf nomi yoki obyekti emas.

    Muhim xato: Qo‘lga kiritilmagan xato: C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php:99 da mantiqiy ma'noda execute() a'zo funktsiyasiga qo'ng'iroq qilish: #0 C:\xampp\htdocs\PHP\JAMII -CASH\Member.php(83): Phppot\DataSource->insert('INSERT INTO reg…', 'ssss', Massiv) #1 C:\xampp\htdocs\PHP\JAMII-CASH\index.php(20) ): Phppot\Member->insertMemberRecord('chuki10', 'Ray', '202020', ' [elektron pochta himoyalangan]…’) №2 (asosiy) 99-qatorda C:\xampp\htdocs\PHP\JAMII-CASH\DataSource.php-ga tashlangan