PHP register_globals parametrini yoqish nima uchun xavfli? PHP va MySQL Impersonal index php registrida oddiy foydalanuvchi ro'yxatga olish tizimini yaratish

Salom! Endi biz PHP + MySQL yordamida saytda eng oddiy ro'yxatdan o'tishni amalga oshirishga harakat qilamiz. 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. Tarkibiga ega reg.php faylini yarating (barcha izohlar ichidagi):



Roʻyxatdan oʻtish


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! Keyinchalik, allaqachon ro'yxatdan o'tgan foydalanuvchilar uchun saytga kirish uchun "eshik" yaratishingiz kerak. index.php (ichki sharhlar):




Bosh sahifa


Bosh sahifa


Sizning login:


Sizning parolingiz:






Roʻyxatdan oʻtish



OK, endi hammasi tugadi! 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!

Men hamma narsani tekshirdim, u to'g'ri ishlaydi!

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 shaklida 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 darsni qismlarga ajratishni xohlamasangiz, quyidagilarni qilishingiz kerak:

Darsga biriktirilgan manbalarni yuklab olishingiz kerak
- Arxivdan tables.sql faylini toping, uni phpMyAdmin-dagi import opsiyasidan foydalanib ma'lumotlar bazasiga import qiling. Shu bilan bir qatorda: ushbu faylni matn muharriri orqali oching, SQL so'rovini nusxalang va uni bajaring;
- include/main.php ni oching va ma'lumotlar bazasi bilan ulanish sozlamalarini to'ldiring (ma'lumotlar bazasi bilan 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 foydalanib, "Ro'yxatdan o'tish/Kirish" tugmasi holatini kuzatib boradi e.preventDefault() va AJAX so'rovlarini yuboradi. Server javobiga qarab, u u yoki bu xabarni ko'rsatadi va keyingi harakatlarni belgilaydi/

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"); e.preventDefault(); $.post(this.action, (elektron pochta: email), funktsiya (m)( if(m.error)( form.addClass("xato"); messageHolder.text(m.message); ) else(form.removeClass("xato").addClass("loggedIn"); messageHolder .matn(m.xabar); ))) )); $(hujjat).ajaxStart(funksiya())(form.addClass("yuklash"); )); $(hujjat).ajaxComplete(funksiya()) (forma. 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 faylini ko'rsatadi (go'yo bizga so'rov qayta ishlanayotganiga ishora qiladi) va shuningdek, formaning qayta yuborilishiga yo'l qo'ymaslik 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). 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 butun son tipidagi maydonda ip2long funksiyasidan foydalangan holda qayta ishlangan shaklda saqlanadi.

Endi biz PHP kodini yozishimiz mumkin. Tizimning asosiy funksionalligi User.class.php sinfiga tayinlangan, 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'yxatdan o'tish 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 Foydalanuvchi funksiyasining qiymatini qaytarish */ umumiy statik funksiya findByToken($token)( // maʼlumotlar bazasida tokenni toping va toʻgʻri vaqt tamgʻasi oʻrnatilganligiga ishonch hosil qiling $result = ORM::for_table("reg_users") ->qaerda ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) return 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 boʻlsa 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, maʼlumotlar bazasida yangi foydalanuvchi yarating. 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 foydalanuvchi yozing 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 bunday foydalanuvchi mavjudligini tekshiring va mantiqiy 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))( // $param o'zgaruvchisining qiymati foydalanuvchi identifikatoriga uzatildi $id = $param; ) else if(isset($_SESSION["loginid"]))( // Aks holda, $id = $_SESSION["loginid"]; seansga qarang; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Yangi SHA1 avtorizatsiya tokenini yarating, uni ma'lumotlar bazasiga yozadi va uning qiymatini qaytaradi * @return string */ public function generateToken( )( // Ruxsat etilgan foydalanuvchi uchun token yaratish va uni maʼlumotlar bazasiga saqlash $token = sha1($this->email.time().rand(0, 1000000)); // Tokenni ma'lumotlar bazasida saqlang // Va uni shunday belgilangki, u faqat keyingi 10 daqiqa davomida amal qiladi $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 belgilang $_SESSION["loginid"] = $this->orm->id; // Yangilash last_login ma'lumotlar bazasi maydonining qiymati $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 */ umumiy funksiya loggedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Foydalanuvchining administrator ekanligini tekshiradi * @return boolean */ public function isAdmin())( return $this->rank() = = "administrator"; ) /** * Foydalanuvchi turini toping, administrator yoki oddiy bo'lishi mumkin * @return string */ public function rank())( agar ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Foydalanuvchining shaxsiy ma'lumotlarini Foydalanuvchi obyektining * xususiyatlari sifatida olish imkonini beruvchi usul * @ param string $key kirish huquqiga ega boʻlgan xususiyat nomi * @return mixed */ umumiy funksiya __get($key)( if(isset($this->orm->$key))( return $this->orm-> $key; ) nullni qaytarish; ))

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.

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 $user->email, $user->token va boshqalar xossalari tufayli kirish mumkin bo'ladi. Keyingi kod fragmentida biz ushbu sinflardan qanday foydalanishni misol sifatida ko'rib chiqamiz. .


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 bir nechta yordamchilar - yordamchi funktsiyalar 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 ); ) funksiya 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; ) funksiya rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Ushbu IP manzilga oxirgi soatda 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", 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 u 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("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. Quyidagi kod parchasidan ko'rinib turganidek, bu funksiyalar forma ma'lumotlariga ishlov berilganda va yuborilganda chaqiriladi.

Quyidagi kod index.php faylidan olingan va u shaklni yuborish bilan shug'ullanadi. U JSON javobini qaytaradi, bu esa o'z navbatida jQuery tomonidan biz avval ko'rib chiqqan assets/js/script.js faylida qayta ishlanadi.

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"]); // Ushbu tizimga kirishga urinish 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 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["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 jildini 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 yoʻnaltirish $user->login(); redirect("protected.php"); ) // Yoʻq, token yaroqsiz. Avtorizatsiya/roʻyxatdan oʻtish shakli boʻlgan sahifaga yoʻnaltirish redirect("index. php ");)

$user->login()

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

Tizimdan chiqish funksiyasini qayta ishlash ham xuddi shunday tartibga solingan.

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'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 (oddiy 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. Administrator maqomi hech qanday imtiyozlar bermaydi, bu misolda sahifa sizning administrator ekanligingizni ko'rsatadi - va bu.

Ammo bu bilan nima qilish sizning ixtiyoringizda, siz administratorlar uchun ma'lum imtiyozlar va imkoniyatlarni o'rnatadigan kodni o'zingiz 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 xohlaganingizcha qilishingiz mumkin.

Material Denis Malyshok tomonidan veb-sayt 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?
Faqat do'stlaringiz va hamkasblaringiz bilan baham ko'ring!


Global o'zgaruvchilar va register_globals direktivasini o'chirish bilan bog'liq muammolar haqida tez-tez savollar paydo bo'lishi sababli, biz ushbu maqolada ushbu mavzuni biroz yoritishga harakat qilamiz.

Birinchidan, tashqi o'zgaruvchilar nima ekanligini aniqlaymiz. Bu dasturga tashqaridan kiradigan har qanday o'zgaruvchilar, ya'ni. dasturning o'zida aniqlanmagan. PHP skripti uchun brauzer qatori yoki forma orqali o'tiladigan barcha o'zgaruvchilar tashqidir.
Keling, ular qanday yaratilganligini ko'rib chiqaylik.

Agar serverda register_globals = On direktivasi yoqilgan bo'lsa (php.ini da), u holda o'zgaruvchilarni forma yoki brauzer qatori orqali o'tkazishda ushbu o'zgaruvchilar mo'ljallangan skriptda ular avtomatik ravishda yaratiladi. Bular. Agar brauzeringiz qatorida quyidagilar yozilgan bo'lsa: www.server.ru/index.php?var=1, u holda qiymati 1 ga teng bo'lgan $var o'zgaruvchisi avtomatik ravishda index.php skriptida yaratiladi.

Izoh

Ushbu direktiva PHP tilidagi eng munozarali nuqtalardan biridir. Bir tomondan, undan foydalanish haqiqatan ham PHP skriptlarini himoya qilishda haqiqiy muammolarni keltirib chiqarishi mumkin, agar mumkin bo'lgan xatolik holatlari to'g'ri hisobga olinmasa va ko'plab ishlab chiquvchilar global o'zgaruvchilardan foydalanmasdan skriptlarni yozish skriptlarning zaifligini kamaytirishini haqli ravishda ta'kidlashadi. 90% ga har xil turdagi hujumlar. Boshqa tomondan, PHP paydo bo'lishining boshida mingdan ortiq foydalanuvchilar tilni ishlab chiquvchilarga ishonishgan (PHP 4.3 ga qadar bu direktiva sukut bo'yicha yoqilgan edi), shu sababli hozirda global o'zgaruvchilar yordamida yozilgan millionlab amalda ishlaydigan skriptlar mavjud (Bu Shuni ta'kidlash kerakki, ta'lim maqsadlarida ba'zan global o'zgaruvchilardan foydalangan holda skriptlarni yozish to'liq arziydi, chunki ularni superglobal massivlar bilan almashtirish kodning o'qish qobiliyatini sezilarli darajada yomonlashtiradi).

Hozirda ko'pchilik xost-provayderlar ushbu direktiva yoqilgan va ehtimol uzoq vaqt davomida faol bo'lib qoladi, chunki aks holda u kod uzluksizligini buzishi mumkin.

Register_globals direktivasi o'chirilgan bo'lsa, bunday o'zgaruvchilarga kirish ikki yo'l bilan mumkin:

  • HTTP_***_VARS (HTTP_POST_VARS va boshqalar) assotsiativ massivlari orqali
  • superglobal massivlar orqali ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES va boshqalar)

Superglobal massivlar har qanday miqyosda mavjud. PHP ishlab chiquvchilari serverda register_globals direktivasini o‘chirib qo‘yishni va superglobal massivlar orqali o‘zgaruvchilar bilan ishlashni tavsiya qiladi. Ushbu tavsiya register_globals direktivasi yoqilganda paydo boʻlishi mumkin boʻlgan xavfsizlik muammolari bilan bogʻliq.

Garchi yaqin vaqtgacha register_globals direktivasi hosting saytlarida yoqilgan edi. Vaziyat PHP 5 ning chiqarilishi bilan o'zgara boshladi, bu erda ushbu direktiv sukut bo'yicha o'chirilgan va hosterlar uni yoqishga shoshilmayaptilar (ehtimol shunday).

Xo'sh, o'zgaruvchilarni olish uchun nima qilish kerak?Ularni superglobal massivlardan olishingiz kerak. Masalan, o'zgaruvchilarni brauzer qatoridan o'tkazish uchun $_GET massividan foydalaning. Aytaylik, brauzer satrida www.server.ru/index.php?var=1 deb yoziladi.Unda index.php da o‘zgaruvchini olish uchun quyidagilarni yozish kerak:

$var=$_GET["var"];

Va, masalan, POST usuli yordamida shakldan uzatilgan o'zgaruvchilarni qabul qilish uchun forma ishlov beruvchisi skriptiga quyidagilarni yozishingiz kerak:

$var=$_POST["var"];

Ushbu maqolada siz HTML, JavaScript, PHP va MySql-dan foydalangan holda ro'yxatdan o'tish va kirish formasini qanday yaratishni o'rganasiz. Bunday shakllar turidan qat'i nazar, deyarli har bir veb-saytda qo'llaniladi. Ular forum, onlayn-do'kon, ijtimoiy tarmoqlar (masalan, Facebook, Twitter, Odnoklassniki) va boshqa ko'plab turdagi saytlar uchun yaratilgan.

Agar sizning mahalliy kompyuteringizda veb-saytingiz bo'lsa, umid qilamanki, sizda allaqachon mahalliy server o'rnatilgan va ishlayapti. Busiz hech narsa ishlamaydi.

Ma'lumotlar bazasida jadval yaratish

Foydalanuvchilarni ro'yxatga olishni amalga oshirish uchun, 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 (MB deb qisqartiriladi), endi biz jadval yaratishimiz kerak foydalanuvchilar unda biz ro'yxatdan o'tgan foydalanuvchilarimizni qo'shamiz.

Maqolada ma'lumotlar bazasida jadvalni qanday yaratishni ham tushuntirdim. Jadvalni yaratishdan oldin uning qanday maydonlarni o'z ichiga olishini aniqlashimiz kerak. Ushbu maydonlar ro'yxatdan o'tish shaklidagi maydonlarga mos keladi.

Shunday qilib, formamiz qanday maydonlarga ega bo'lishini o'yladik, tasavvur qildik va jadval yaratdik foydalanuvchilar bu maydonlar bilan:

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


Agar roʻyxatdan oʻtish formangizda boshqa 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. PHP kengaytmasi MySQLi yordamida ulanamiz.

Saytimiz papkasida nomli fayl yarating dbconnect.php, va unga quyidagi skriptni yozing:

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

O'zgaruvchiga e'tibor bering $address_site, bu erda men ishlayotgan test saytim nomini ko'rsatdim. Iltimos, saytingiz nomini mos ravishda ko'rsating.

Sayt tuzilishi

Endi saytimizning HTML tuzilishini ko'rib chiqamiz.

Biz saytning sarlavhasi va altbilgisini alohida fayllarga o'tkazamiz, header.php Va footer.php. Biz ularni barcha sahifalarga joylashtiramiz. Ya'ni asosiy sahifada (fayl index.php), ro'yxatdan o'tish shakli (fayl form_register.php) va avtorizatsiya shakli (fayl form_auth.php).

Bizning havolalarimiz bilan bloklash, ro'yxatga olish Va ruxsat, barcha sahifalarda ko'rsatilishi uchun ularni sayt sarlavhasiga qo'shing. Bitta havola ro'yxatdan o'tish shakli bilan sahifaga kiradi (fayl form_register.php) va ikkinchisini avtorizatsiya shakli (fayl form_auth.php).

header.php faylining tarkibi:

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.

Ma'lumotlar bazasiga o'ting (phpMyAdmin-da), jadval tuzilishini oching foydalanuvchilar va bizga qaysi sohalar kerakligini ko'rib chiqing. Bu bizga ism va familiyani kiritish uchun maydonlar, pochta manzilini (elektron pochta) kiritish uchun maydon va parolni kiritish uchun maydon kerakligini anglatadi. Va xavfsizlik maqsadida biz captcha kiritish uchun maydon 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 muvaffaqiyatsiz tugashini tushunish uchun ushbu xatolar haqida xabarlarni ko'rsatish kerak.

Shaklni ko'rsatishdan oldin, sessiyadagi xato xabarlarini ko'rsatish uchun blok qo'shing.

Va yana bir narsa, agar foydalanuvchi allaqachon avtorizatsiya qilingan bo'lsa va u qiziquvchanligi sababli brauzerning manzil satriga yozish orqali to'g'ridan-to'g'ri ro'yxatdan o'tish sahifasiga o'tadi. site_address/form_register.php, keyin bu holda, ro'yxatdan o'tish shakli o'rniga, biz allaqachon ro'yxatdan o'tganligini ko'rsatadigan sarlavhani ko'rsatamiz.

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

Siz allaqachon ro'yxatdan o'tgansiz

Brauzerda ro'yxatdan o'tish shakli bo'lgan sahifa quyidagicha ko'rinadi:


Kerakli atributdan foydalanib, biz barcha maydonlarni majburiy qilib qo'ydik.

Captcha ko'rsatilgan ro'yxatdan o'tish shaklining kodiga e'tibor bering:


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 sharhlangan, 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 joylashtiring 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 pochtaning haqiqiyligini tekshirish

Har qanday shakl mijoz tomonidan (JavaScript, jQuery yordamida) va server tomonida kiritilgan ma'lumotlarning haqiqiyligini tekshirishi kerak.

Elektron pochta maydoniga alohida e'tibor qaratishimiz kerak. Kiritilgan 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 biz atribut qiymatini osongina o'zgartirishimiz mumkin turi Bilan elektron pochta yoqilgan matn, va bu, 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 darhol elektron pochtani tekshirish kodini qo'shamiz. Bu erda biz kiritilgan parol uzunligini tekshirish uchun kod qo'shamiz. Uning uzunligi kamida 6 ta belgidan iborat bo'lishi kerak.

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

Shunday qilib, biz mijoz tomonidan shaklni tekshirishni 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 qayta ishlash uchun faylga yuboramiz register.php, POST usuli orqali. Ushbu ishlov beruvchi faylining nomi atribut qiymatida ko'rsatilgan harakat. Va jo'natish 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 avval yaratilgan faylni ulash dbconnect.php(Ushbu faylda biz ma'lumotlar bazasiga ulanishni amalga oshirdik). Va shuningdek, darhol hujayralarni e'lon qilaylik xato_xabarlar Va muvaffaqiyat_xabarlari global sessiya massivida. IN xato_xabarlar biz shaklni qayta ishlash jarayonida yuzaga keladigan barcha xato xabarlarni yozib olamiz va ichida muvaffaqiyatli_xabarlar, biz quvonchli xabarlarni yozib olamiz.

Davom etishdan oldin, forma umuman yuborilganligini tekshirishimiz kerak. Tajovuzkor atribut 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 fikriga ega bo'lishi mumkin: http://site_address/register.php

Shunday qilib, global POST massivida formadagi "Ro'yxatdan o'tish" tugmachamiz nomiga mos keladigan katakchani 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, ular xato xabarini oladi. Eslatib oʻtamiz, $address_site oʻzgaruvchisi sayt nomini oʻz ichiga oladi va u faylda eʼlon qilingan. dbconnect.php.

Seansdagi captcha qiymati faylda yaratilganda qo'shilgan captcha.php. Eslatib o'tamiz, men sizga fayldagi ushbu kod qismini yana ko'rsataman captcha.php, bu erda captcha qiymati sessiyaga qo'shiladi:

Endi tekshirishning o'ziga o'taylik. Fayl ichida register.php, if blokining ichida, biz "Ro'yxatdan o'tish" tugmasi bosilganligini yoki to'g'rirog'i " izoh " ko'rsatilganligini tekshiramiz. // (1) Keyingi kod qismi uchun bo'sh joy"Biz yozamiz:

//Qabul qilingan captcha-ni tekshiring //Qatorning 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, biz foydalanuvchini ro'yxatdan o'tish 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 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 shakli bilan sahifaga qayta yo'naltiramiz.

Keyinchalik, bo'shliqlarni qisqartirganimizdan so'ng, biz o'zgaruvchiga qatorni qo'shamiz va bu o'zgaruvchining bo'shligini tekshiramiz; agar u bo'sh bo'lmasa, biz davom etamiz, aks holda biz foydalanuvchini ro'yxatdan o'tish shakli bilan sahifaga qayta yo'naltiramiz.

Ushbu kodni belgilangan joyga qo'ying" // (2) Keyingi kod qismi uchun bo'sh joy".

/* $_POST global massivida formadan yuborilgan ma’lumotlar mavjudligini tekshiring va yuborilgan ma’lumotlarni oddiy o‘zgaruvchilarga o‘rang.*/ if(isset($_POST["first_name"]))( //Bo‘shliqlarni boshidan qisqartiring. va satr oxiri $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"]))( //Satr 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"] .= "

Iltimos, 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"] .= "

Familiya maydoni yo‘q

"; //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"]))( //Satr boshidan va oxiridan bo'sh joylarni kesish $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 joylashuvi )alse( // 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"]))( //String 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 uning ma'lumotlar bazasida o'ziga xosligini tekshirishimiz kerak. Ya'ni, allaqachon ro'yxatdan o'tgan bir xil elektron pochta manziliga ega foydalanuvchi bormi?

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

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

Siz noto‘g‘ri 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(); ) // Biz ma'lumotlar bazasida bunday manzil mavjudligini tekshiramiz. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email.""); / /Agar qabul qilinganlar soni aynan bitta qator boʻlsa, demak, ushbu elektron pochta manziliga ega foydalanuvchi allaqachon roʻyxatdan oʻtgan if($result_query->num_rows == 1)( //Agar olingan 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'yxatdan o'tish sahifasi sarlavhasiga qaytaring("HTTP/1.1 301 Doimiy ko'chirildi"); header("Joylashuv: ".$adres_sayt."/form_register.php"); ) /* tanlovni yopish */ $ result_query-> close(); //Skriptdan chiqishni toʻxtating(); ) /* tanlovni yopish */ $result_query->close();

Shunday qilib, biz barcha tekshiruvlarni tugatdik, 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ʻrovida xato

"; //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 avtorizatsiya 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 bazasiga ulanishni yopish $mysqli->close();

Agar foydalanuvchini ma'lumotlar bazasiga qo'shish so'rovida xatolik yuz bergan bo'lsa, 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 safar bu yanada yoqimli, ya'ni foydalanuvchiga ro'yxatdan o'tish muvaffaqiyatli bo'lganligini aytamiz. Va biz uni avtorizatsiya shakli bilan sahifaga yo'naltiramiz.

Elektron pochta manzili formati va parol uzunligini tekshirish uchun skript faylda mavjud header.php, shuning uchun u ushbu shakldagi maydonlarga ham tegishli bo'ladi.

Seans ham faylda boshlanadi header.php, shuning uchun faylda form_auth.php Seansni boshlashning hojati yo'q, chunki biz xatoga yo'l qo'yamiz.


Aytganimdek, elektron pochta manzili formati 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 serverga yuborishi mumkin bo'ladi va u erda qayta ishlanadi.

Foydalanuvchi avtorizatsiyasi

Atribut qiymati uchun harakat avtorizatsiya nogironligida ko'rsatilgan fayl mavjud auth.php, bu shakl ushbu faylda qayta ishlanishini bildiradi.

Shunday qilib, faylni oching auth.php va avtorizatsiya formasini qayta ishlash uchun kod yozing. Siz qilishingiz kerak bo'lgan birinchi narsa - seansni boshlash va faylni ulash dbconnect.php ma'lumotlar bazasiga ulanish uchun.

Saytdan chiqish havolasini bosganingizda, biz faylga o'tamiz 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 siz o'zingizning veb-saytingizda foydalanuvchini ro'yxatdan o'tkazish va avtorizatsiya shakllarini qanday amalga oshirish va qayta ishlashni bilasiz. Ushbu shakllar deyarli har bir veb-saytda mavjud, 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 yordamida) qanday tekshirishni o'rgandik. Shuningdek, biz saytni tark etish tartibini qanday amalga oshirishni bilib oldik.

Barcha skriptlar sinovdan o'tgan va ishlamoqda. 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 chiqishi haqida xabardor bo'lish uchun siz mening veb-saytimga obuna bo'lishingiz mumkin.

Agar sizda biron bir savol bo'lsa, iltimos, men bilan bog'laning va agar siz maqolada biron bir xatolikni sezsangiz, menga xabar bering.

Dars rejasi (5-qism):

  • Avtorizatsiya shakli uchun HTML strukturasini yaratish
  • Qabul qilingan ma'lumotlarni qayta ishlaymiz
  • Biz sayt sarlavhasida foydalanuvchi salomini ko'rsatamiz
  • Sizga maqola yoqdimi?

    Nega... yo'q, men nima uchun register_globals direktivasini faollashtira olmasligingizni bilaman, lekin nima uchun adabiyotda, qoida tariqasida, bu haqda hech narsa aytilmaganini bilmayman.

    Ushbu maqolada men unda o'tirganlarning hammasini tankdan olib chiqishga va nima ekanligini tushuntirishga harakat qilaman (ayniqsa zirhli poezdda bo'lganlar uchun - muharrir eslatmasi). Ba'zi hosterlar ushbu ko'rsatmani o'chirib qo'yishlari bejiz emas. Shunday qilib…

    U qanday ishlaydi

    PHP sozlamalarida (php.ini fayli) shunday register_globals direktivasi mavjud. Uning ma'nosi shundan iboratki, agar u yoqilgan bo'lsa (register_globals = yoqilgan), GET va POST orqali o'tgan barcha o'zgaruvchilar avtomatik ravishda global sifatida ro'yxatga olinadi. Bu nima degani?

    Misol uchun, biz GET usulini index.php skriptiga ba'zi sahifa qiymatini o'tkazamiz: index.php?page=2. O'tkazilgan qiymat GET massivida saqlanadi va skriptda $_GET["sahifa"] sifatida ishlatilishi mumkin. Biroq, agar bizda register_globals yoqilgan bo'lsa, o'tkazilgan qiymat uchun $page o'zgaruvchisi yaratiladi, bu index.php skriptining istalgan qismida mavjud bo'ladi.

    Kichik xulosa va qo'shimcha. Register_globals yoqilganda, o'zgaruvchining uchta nusxasi yaratiladi: GET massivida, GLOBALS massivida va oddiygina o'zgaruvchining o'zi ($_GET["page"], $GLOBALS["page"], $page), shu bilan birga register_globals o'chirilgan bo'lsa, o'tkazilgan qiymatga faqat GET massivi ($_GET["sahifa"]) orqali kirish mumkin. Eslab qoling.

    Foydalanish xavfi

    Bizni nima kutayotganini tushunish uchun oddiy misolni ko'rib chiqaylik (3 yoshdan 5 yoshgacha - muharrir eslatmasi). Buni osonlashtirish uchun darhol aytamanki, $login va $password GET/POST usuli bilan uzatiladigan o'zgaruvchilardir.

    Skript nima qilishi haqida qisqacha:

      2-qator. Biz foydalanuvchi tomonidan kiritilgan login uchun haqiqiy parolni chiqarish uchun ma'lumotlar bazasiga so'rov yuboramiz.

      3-qator. Biz ushbu parolni olamiz va uni $real_pass o'zgaruvchisiga tayinlaymiz.

      4-qator. Haqiqiy va kiritilgan parolni solishtiramiz va agar ular mos keladigan bo'lsa, $check o'zgaruvchisi true bo'ladi.

      5-8 qatorlar. Agar $check rost bo'lsa, biz avtorizatsiya muvaffaqiyatli bo'lganligini yozamiz va hokazo.

    Tavsiya etilgan stsenariy, ta'rifiga ko'ra, dunyodagi eng oqadigan stsenariydir va endi men sizga bu teshiklarni ko'rsataman. Shart: register_globals yoqilgan.

    Aytaylik, uzatish GET usuli yordamida amalga oshiriladi. Keyin url quyidagicha ko'rinadi:
    www.site.com/index.php?login =admin&parol =qwerty
    $login va $password global o'zgaruvchilari darhol yaratilishi aniq. Endi skriptga qarang. U $check o'zgaruvchisini o'z ichiga oladi. Agar uni URL orqali uzatsangiz nima bo'ladi?

    www.site.com/index.php?login =admin&parol =qwerty&check =1
    Keyin parolni moslashtirish tekshiruvi chetlab o'tiladi va foydalanuvchi darhol avtorizatsiya qilinadi (oxir-oqibat, 1 rost va 0 noto'g'ri ekanligini eslaysizmi?). Agar biz yozsak, xuddi shunday natija bo'ladi www.sayt.com/indeks.php?tekshirish =1 . Va agar siz POST usulidan foydalansangiz ham, bunday firibgarliklar baribir ishlaydi, chunki register_globals yoqilganda, qaysi usuldan foydalanishingiz muhim emas - GET yoki POST.

    Menimcha, kimdir savolga ega, kraker chek o'zgaruvchisi haqida qayerdan biladi, u hamma narsa uchun javobgardir? Agar siz skriptni hech kimga ko'rsatmagan bo'lsangiz, ular buni bilishi dargumon. Biroq, har bir kishi o'z skriptlarini, CMS va boshqalarni ishlatmaydi, lekin tarmoqda mavjud bo'lgan narsalarni ishlatadi. Bunday hollarda, masalan, kraker CMS kodini o'rganishi va uning yordami bilan yaratilgan saytlarga hujum qilishi mumkin.

    Biroq, hamma hosterlar register_globals-ni o'chirib qo'ymaydi va hatto sizning skriptlaringiz register_globals yoqilmagan bo'lsa ham, kraker ushbu direktivaning zaifligidan foydalanib, skriptingizni buzishi mumkin.

    Keling, o'zimizni misol qilib olaylik. Agar satrdan keyin register_globals yoqilgan bo'lsa, uni himoya qilish uchun agar ($parol ==$haqiqiy_o'tish) $tekshiring =rost; quyidagilarni qo'shing: boshqa $tekshiring =yolg'on;. Bunday holda, agar bittaga teng bo'lgan tekshirish o'zgaruvchisi GET usuli bilan uzatilsa ham, parol noto'g'ri bo'lsa, skript $check=false ni o'rnatadi.

    Ha, shuni ham e'tiboringizga qaratmoqchimanki, agar siz register_globals-ni o'chirib qo'ysangiz, bizning misolimiz ishlamaydi. Va u ishlashi uchun siz $login = $_POST["login"] yozishingiz kerak; $parol = $_POST["parol"];

    Keling, xulosa qilaylik ...

    va ikkita asosiy xulosa chiqaring:

    1) Register_globals yoqilgan bo'lsa, siz turli xil o'zgaruvchilarni o'tkazishingiz mumkin, ularning qiymatlari GET yoki POST orqali qabul qilinishi hisoblanmagan.

    2) Register_globals ning o'zi egri yozilgan skript kabi xavfli emas.

    Bugun hammasi shu! Sizning sharhlaringizni, mulohazalaringizni, takliflaringizni va shunchaki fikr-mulohazalaringizni ko'rishdan juda xursand bo'laman. Shuning uchun yozing, uyalmang!

    Muvaffaqiyatli hafta tilab,
    Aleksandr SHUYSKIY