HTTP MySQL va PHP yordamida sahifa himoyasini sozlash. HTTP MySQL va PHP Php oddiy dvigatellari yordamida autentifikatsiya orqali sahifa xavfsizligini sozlash

Mijozning brauzeriga "Autentifikatsiya talab qilinadi" xabarini yuborish uchun, bu o'z navbatida foydalanuvchi nomi va parolni kiritish uchun dialog oynasiga olib keladi. Mijoz o'zining foydalanuvchi nomi va parolini kiritgandan so'ng, skript yana chaqiriladi, ammo bu safar oldindan belgilangan PHP_AUTH_USER, PHP_AUTH_PW va AUTH_TYPE o'zgaruvchilari, ular foydalanuvchi nomi, parol va autentifikatsiya turini o'z ichiga oladi. Ushbu o'zgaruvchilarni $ _SERVER va $ HTTP_SERVER_VARS qatorlarida topish mumkin. Hozirda faqat "Asosiy" autentifikatsiya qo'llab-quvvatlanadi. Shuningdek, funktsiyaning batafsil tavsifini ko'rishingiz mumkin sarlavha () .

Mijozni sahifani ko'rish uchun tizimga kirishga majbur qiladigan skript qismining misoli:

HTTP autentifikatsiyasi misoli

agar (! isset ($ _ SERVER ["PHP_AUTH_USER"])))
sarlavha ( "WWW-Authenticate: Basic realm \u003d" Mening soham "");

aks sado "Tadbirda yuborilgan matn
agar foydalanuvchi Bekor qilish tugmachasini bosgan bo'lsa "
;
Chiqish;
) boshqa (
aks sado
"

Salom ($ _SERVER ["PHP_AUTH_USER"]).

" ;
aks sado "

Siz parolni kiritdingiz ($ _SERVER ["PHP_AUTH_PW"]).

"
;
}
?>

Muvofiqlik haqida eslatma:HTTP sarlavhalarini ko'rsatishda ayniqsa ehtiyot bo'ling. Iloji boricha ko'proq turli xil mijozlar bilan maksimal darajada muvofiqligini kafolatlash uchun "Basic" so'zi "B" katta harf bilan yozilishi, mintaqa (maydon) ikkilangan (bitta emas!) Tirnoq bilan keltirilishi va kod oldida to'liq bitta bo'sh joy bo'lishi kerak 401 sarlavhada HTTP / 1.0 401 .

PHP_AUTH_USER va PHP_AUTH_PW o'zgaruvchilarini ekranda aks ettirish o'rniga, ularning to'g'riligini tekshirishingiz mumkin. Buning uchun ma'lumotlar bazasi so'rovidan foydalaning yoki dbm faylida foydalanuvchini qidiring.

Internet Explorer brauzerining o'ziga xos xususiyatlarini kuzatishingiz mumkin. O'tkazilgan sarlavhalar parametri haqida juda ehtiyotkorlik bilan. Sarlavhani ko'rsatish WWW-autentifikatsiya HTTP / 1.0 401 holatini yuborishdan oldin biroz hiyla-nayrang.

PHP 4.3.0-dan boshlab, tashqi autentifikatsiyadan foydalanadigan sahifa uchun parolni ochadigan skriptni yozishni kimdir oldini olish uchun, agar sahifada tashqi autentifikatsiya ishlatilsa va xavfsiz rejim o'rnatilgan bo'lsa, PHP_AUTH o'zgaruvchilari o'rnatilmaydi. REMOTE_USER o'zgaruvchisidan qat'i nazar, tashqi autentifikatsiya qilingan foydalanuvchi autentifikatsiyasi uchun ishlatilishi mumkin. Shunday qilib, har doim $ _SERVER ["REMOTE_USER"] o'zgaruvchisidan foydalanishingiz mumkin.

Eslatma:PHP tashqi autentifikatsiya ishlatilishi yoki ishlatilmasligini ko'rsatish uchun AuthType direktivasidan foydalanadi.

Shuni ta'kidlash kerakki, yuqorida aytib o'tilganlarning hammasi bitta serverda joylashgan ruxsatsiz sahifalarni boshqaradigan har kim tomonidan avtorizatsiyani talab qiladigan sahifalar uchun parollarni o'g'irlashni oldini olmaydi.

Netscape Navigator va Internet Explorer ikkalasi ham serverdan qabul qilinganda belgilangan maydon uchun joriy oynaning autentifikatsiya keshini tozalaydi. Bu foydalanuvchidan majburiy chiqishni amalga oshirish va foydalanuvchi nomi va parolni kiritish uchun dialog oynasini qayta ko'rsatish uchun ishlatilishi mumkin. Ba'zi dasturchilar avtorizatsiyani vaqt bo'yicha cheklash yoki chiqish tugmachasini taqdim etish uchun bundan foydalanadilar.

Yangi foydalanuvchi nomi / parol juftligini majburiy kiritish bilan HTTP autentifikatsiyasining misoli

funktsiyani tasdiqlash () {
sarlavha ( "WWW-Authenticate: Basic realm \u003d" Sinovlarni tasdiqlash tizimi "");
sarlavha ("HTTP / 1.0 401 Ruxsatsiz");
aks sado "Resursga kirish uchun foydalanuvchi nomi va parolni to'g'ri kiritishingiz kerak \\ n";
Chiqish;
}

Agar (! Isset ($ _ SERVER ["PHP_AUTH_USER")) ||
($ _POST ["SeenBefore"] \u003d\u003d 1 && $ _POST ["OldAuth"] \u003d\u003d $ _SERVER ["PHP_AUTH_USER"]))))
autentifikatsiya qilish ();
}
boshqa (
aks sado
"

Xush kelibsiz: ($ _SERVER ["PHP_AUTH_USER"])
" ;
aks sado "Oldingi kirish: ($ _REQUEST [" OldAuth "])";
aks sado "

\\ n ";
aks sado "\\ n ";
aks sado "\\ n ";
aks sado "\\ n ";
aks sado "

\\ n ";
}
?>

Ushbu xatti-harakatlar HTTP asosiy autentifikatsiya standartlari tomonidan tartibga solinmagan, shuning uchun siz unga bog'liq bo'lmasligingiz kerak. Sinovlar ko'rsatganidek, Lynx brauzeri serverdan 401 maqomini olganida avtorizatsiya keshini o'chirmaydi va "Orqaga" va keyin "Oldinga" tugmachasini bosish orqali kerakli avtorizatsiya atributlari o'zgarmagan holda ochish mumkin. Ammo foydalanuvchi autentifikatsiya keshini tozalash uchun "_" tugmachasini bosishi mumkin.

Shuni ham ta'kidlash kerakki, PHP 4.3.3 dan oldin, ba'zi bir IIS cheklovlari tufayli PHP CGI moduli sifatida o'rnatilgan bo'lsa, Microsoft IIS ishlaydigan serverlarda HTTP autentifikatsiyasi ishlamagan. PHP 4.3.3+ da to'g'ri ishlashi uchun "Katalog xavfsizligi" deb nomlangan IIS konfiguratsiya sozlamalarini tahrirlashingiz kerak. "Tartibga solish" tugmachasini bosing va "Anonim kirish" parametrini o'rnating, boshqa barcha maydonlar belgilanmagan bo'lishi kerak.

Agar siz ISAPI orqali IIS dan foydalanayotgan bo'lsangiz, yana bir cheklov: PHP_AUTH_ * o'zgaruvchilari aniqlanmagan, ammo shu bilan birga HTTP_AUTHORIZATION o'zgaruvchisi mavjud. Siz foydalanishingiz mumkin bo'lgan misol kodi: list ($ user, $ pw) \u003d explode (":", base64_decode (substr ($ _ SERVER ["HTTP_AUTHORIZATION"], 6)));

IIS bo'yicha eslatma ::IIS-da HTTP autentifikatsiyasi to'g'ri ishlashi uchun PHP konfiguratsiyasidagi cgi.rfc2616_headers opsiyasi 0 ga o'rnatilishi kerak (standart).

Diqqat:Agar himoyalangan rejim ishlatilsa, WWW-Authenticate sarlavhasining sohadagi qismiga joriy skriptning UID qo'shiladi.



<<< Назад Tarkib Oldinga \u003e\u003e\u003e
Agar siz hali ham savollaringiz bo'lsa yoki biror narsa aniq bo'lmasa - biznikiga xush kelibsiz

Funktsiyadan foydalanish mumkin sarlavha () xabar yuborish "Autentifikatsiya talab qilinadi" brauzer, foydalanuvchi nomi va parolni kiritish uchun oynani ko'rsatishga majbur qiladi. Foydalanuvchi foydalanuvchi nomi va parolni to'ldirishi bilanoq PHP-skriptni o'z ichiga olgan bog'lanish, avval belgilangan PHP_AUTH_USER, PHP_AUTH_PW va AUTH_TYPE o'zgaruvchilari mos ravishda login, parol va autentifikatsiya turiga o'rnatiladi. Ushbu oldindan belgilangan o'zgaruvchilar $ _SERVER va $ HTTP_SERVER_VARS qatorlarida saqlanadi. Ikkala tur ham qo'llab-quvvatlanadi: "Asosiy" va "Digest" (PHP 5.1.0 dan beri). Tafsilotlar uchun funktsiyani ko'ring sarlavha ().

Mijozni sahifani ko'rish uchun tizimga kirishga majbur qiladigan skript qismining misoli:

Misol # 1 Asosiy HTTP autentifikatsiyasi misoli

agar (! isset ($ _ SERVER ["PHP_AUTH_USER"])))
sarlavha ( "WWW-Authenticate: Basic realm \u003d" Mening soham "");

aks sado "Tadbirda yuborilgan matn
agar foydalanuvchi Bekor qilish tugmachasini bosgan bo'lsa "
;
Chiqish;
) boshqa (
aks sado
"

Salom ($ _SERVER ["PHP_AUTH_USER"]).

" ;
aks sado "

Siz parolingizni kiritdingiz($ _SERVER ["PHP_AUTH_PW"]).

" ;
}
?>

Misol # 2 Digest HTTP autentifikatsiyasi misoli

Bu oddiy Digest HTTP autentifikatsiya skriptining namunaviy tadbiri. Tafsilotlar uchun RFC 2617-ga qarang.

$ realm \u003d "Cheklangan hudud";

// user \u003d\u003e parol
$ users \u003d array ("admin" \u003d\u003e "mypass", "guest" \u003d\u003e "guest");

agar (bo'sh ($ _ SERVER ["PHP_AUTH_DIGEST"])))
sarlavha ("HTTP / 1.1 401 Ruxsatsiz");
sarlavha ( "WWW-Authenticate: Digest realm \u003d" "... $ shohligi.
"", qop \u003d "auth", nonce \u003d "". uniqid (). "", shaffof bo'lmagan \u003d "". md5 ($ realm). "" ");

Die ( "Foydalanuvchi Bekor qilish tugmasini bosganda yuborilgan matn");
}

// PHP_AUTH_DIGEST o'zgaruvchisini tahlil qiling
agar (! ($ data \u003d http_digest_parse ($ _SERVER ["PHP_AUTH_DIGEST"]))) ||
! isset ($ user [$ data ["username"]]))
o'lmoq ( "Noto'g'ri ma'lumotlar!");

// to'g'ri javobni yarating
$ A1 \u003d md5 ($ data ["username"]. ":". $ Realm. ":". $ Users [$ data ["username"]]);
$ A2 \u003d md5 ($ _SERVER ["REQUEST_METHOD"]. ":". $ Data ["uri"]);
$ valid_response \u003d md5 ($ A1. ":". $ data ["nonce"]. ":". $ data ["nc"]. ":". $ data ["cnonce"]. ":". $ data ["qop"]. ":". $ A2);

if ($ data ["response"]! \u003d $ valid_response)
o'lmoq ( "Noto'g'ri ma'lumotlar!");

// ok, login va parol to'g'ri
echo "Siz quyidagicha tizimga kirgansiz:". $ data ["username"];

http auth sarlavhasini tahlil qilish uchun // funktsiyasi
http_digest_parse funktsiyasi ($ txt)
{
// etishmayotgan ma'lumotlardan himoya qilish
$ need_parts \u003d array ("nonce" \u003d\u003e 1, "nc" \u003d\u003e 1, "cnonce" \u003d\u003e 1, "qop" \u003d\u003e 1, "username" \u003d\u003e 1, "uri" \u003d\u003e 1, "response" \u003d\u003e 1);
$ data \u003d array ();
$ keys \u003d implode ("|", array_keys ($ need_parts));

Preg_match_all ("@ (". $ Keys. ") \u003d (?: ([\\" "]) ([^ \\ 2] +?) \\ 2 | ([^ \\ s,] +)) @", $ txt, $ match, PREG_SET_ORDER);

Foreach ($ $ m bilan mos keladi) (
$ data [$ m [1]] \u003d $ m [3]? $ m [3]: $ m [4];
o'rnatilmagan ($ need_parts [$ m [1]]);
}

$ Need_parts qaytariladimi? false: $ ma'lumotlar;
}
?>

Izoh: Muvofiqlik to'g'risidagi eslatma

HTTP sarlavhalarini ko'rsatishda ayniqsa ehtiyot bo'ling. Iloji boricha ko'proq turli xil mijozlar bilan maksimal darajada muvofiqligini kafolatlash uchun "Basic" so'zi "B" katta harf bilan yozilishi kerak, maydon ikki marta (bitta emas!) Kotirovka bilan yozilishi kerak va kod oldida to'liq bitta bo'sh joy bo'lishi kerak 401 sarlavhada HTTP / 1.0 401... Autentifikatsiya parametrlari yuqoridagi Digest autentifikatsiya misolida ko'rsatilgandek vergul bilan ajratilishi kerak.

PHP_AUTH_USER va PHP_AUTH_PW o'zgaruvchilarini ekranda aks ettirish o'rniga, ularning to'g'riligini tekshirishingiz mumkin. Buning uchun ma'lumotlar bazasi so'rovidan foydalaning yoki dbm faylida foydalanuvchini qidiring.

Internet Explorer brauzerining xususiyatlarini kuzatishingiz mumkin. O'tkazilgan sarlavhalar parametri haqida juda ehtiyotkorlik bilan. Sarlavha hiyla-nayrang WWW-autentifikatsiya holatini yuborishdan oldin HTTP / 1.0 401 hozircha u uchun ishlaydi.

Kimdir tashqi autentifikatsiyadan foydalanadigan sahifa uchun parolni ochadigan skript yozishiga yo'l qo'ymaslik uchun, agar sahifada tashqi autentifikatsiya ishlatilsa va xavfsiz rejim o'rnatilgan bo'lsa, PHP_AUTH o'zgaruvchilari o'rnatilmaydi. REMOTE_USER o'zgaruvchisidan qat'i nazar, tashqi autentifikatsiya qilingan foydalanuvchi autentifikatsiyasi uchun ishlatilishi mumkin. Shunday qilib, har doim $ _SERVER ["REMOTE_USER"] o'zgaruvchisidan foydalanishingiz mumkin.

Izoh: Konfiguratsiya eslatmasi

PHP direktiv spetsifikatsiyadan foydalanadi AuthType tashqi autentifikatsiya ishlatilishini yoki ishlatilmasligini ko'rsatish uchun.

Shuni ta'kidlash kerakki, yuqorida aytib o'tilganlarning hammasi bitta serverda joylashgan ruxsatsiz sahifalarni boshqaradigan shaxs tomonidan avtorizatsiyani talab qiladigan sahifalar uchun parollarni o'g'irlashning oldini olmaydi.

Netscape Navigator ham, Internet Explorer ham serverdan 401 maqomini olishda ko'rsatilgan mintaqa (maydon) uchun joriy oynaning autentifikatsiya keshini tozalaydi. Bu foydalanuvchini majburan chiqarib yuborish va foydalanuvchi nomi va parol bilan aloqa oynasini qayta ko'rsatish uchun ishlatilishi mumkin. Ba'zi dasturchilar avtorizatsiyani vaqt bo'yicha cheklash yoki tizimdan chiqish tugmachasini taqdim etish uchun bundan foydalanadilar.

Misol # 3 Yangi foydalanuvchi nomi / parol juftligini majburiy kiritish bilan HTTP autentifikatsiyasining misoli

funktsiyani tasdiqlash () {
sarlavha ( "WWW-Authenticate: Basic realm \u003d" Sinovlarni tasdiqlash tizimi "");
sarlavha ("HTTP / 1.0 401 Ruxsatsiz");
aks sado "Resursga kirish uchun foydalanuvchi nomi va parolni to'g'ri kiritishingiz kerak \\ n";
Chiqish;
}

if (! isset ($ _ SERVER ["PHP_AUTH_USER"]) ||
($ _POST ["SeenBefore"] \u003d\u003d 1 && $ _POST ["OldAuth"] \u003d\u003d $ _SERVER ["PHP_AUTH_USER"]))))
autentifikatsiya ();
) boshqa (
aks sado "

Xush kelibsiz: "... htmlspecialchars ($ _SERVER ["PHP_AUTH_USER"]). "
" ;
aks sado "Oldingi kirish:"... htmlspecialchars ($ _REQUEST ["OldAuth"]);
aks sado "

\\ n ";
aks sado "\\ n ";
aks sado "... htmlspecialchars ($ _SERVER ["PHP_AUTH_USER"]). "\\" /\u003e \\ n ";
aks sado "\\ n ";
aks sado "

\\ n ";
}
?>

Ushbu xatti-harakatlar standartlar bilan tartibga solinmagan HTTP Basic- autentifikatsiya, shuning uchun siz unga bog'liq bo'lmasligingiz kerak. Brauzerni sinovdan o'tkazish Lynx buni ko'rsatdi Lynx serverdan 401 holatini olayotganda avtorizatsiya keshini o'chirmaydi va "Orqaga" va keyin "Oldinga" tugmachasini bosish orqali kerakli avtorizatsiya atributlari o'zgarmagan bo'lsa, bunday sahifani ochish mumkin. Biroq, foydalanuvchi tugmachani bosishi mumkin "_" autentifikatsiya keshini tozalash uchun.

PHP-ning CGI-versiyasiga ega bo'lgan IIS-serverda HTTP autentifikatsiyasini to'g'ri ishlashi uchun "" deb nomlangan IIS konfiguratsiya sozlamasini tahrirlashingiz kerak. Katalog xavfsizligi". Yozuvni bosing" Tahrirlash"va parametrni o'rnating" Anonim kirish", boshqa barcha maydonlar belgilanmasdan qoldirilishi kerak.

Izoh: IIS eslatmasi:
IIS-da HTTP autentifikatsiyasi to'g'ri ishlashi uchun PHP konfiguratsiyasidagi cgi.rfc2616_headers opsiyasi o'rnatilishi kerak 0 (standart).

Izoh:

Agar xavfsiz rejim ishlatilsa, joriy skriptning UID-ga qo'shiladi shohlik- bosh qismi WWW-autentifikatsiya.

Ba'zan uni ruxsatsiz kirishdan yopish kerak bo'ladi PHP saytning yopiq maydonini yaratayotgan bo'lsangiz, sahifa. Bu sizning mijozlaringiz yoki saytga tashrif buyuruvchilar uchun qandaydir maxfiy ma'lumotlar, siz uchun administrator interfeysi va boshqalar bo'lishi mumkin. Siz kirishni cheklashni talab qiladigan yuzlab turli xil vazifalar haqida o'ylashingiz mumkin.

Siz bunday sahifani bir nechta qo'shimcha usullar bilan yopishingiz mumkin:

  1. O'zgaruvchilardan foydalangan holda parolni himoya qilish (login / parol) $ _SERVER ["PHP_AUTH_USER"] va $ _SERVER ["PHP_AUTH_PW"].
  2. Himoyalash IP o'zgaruvchidan foydalangan holda mijoz manzili $ _SERVER ["REMOTE_ADDR"].
  3. Himoyalash MAC mahalliy tarmoqlardagi manzil (tomonidan himoya qilishdan tashqari IP).

Keling, birinchi navbatda asosiy bo'lgan birinchi usulni tahlil qilaylik. Bu sizga kirish va parol orqali sahifaga kirishni yopishga imkon beradi, shuning uchun faqat kirish va parolni biladigan odamlar kirish huquqiga ega bo'lishadi. Bundan tashqari, ular ushbu xususiyatga ko'ra bo'linishi mumkin va har biri uchun mos ravishda har xil ma'lumot beradi. Protokol sarlavhasida maxsus maydonlarni berish orqali amalga oshiriladi HTTP... Keling, funktsiyani yarataylik auth_send ():

" ,"

Haqiqiylikni tekshirishda xatolik yuz berdi

" ,"

Kirish va parolingizni olish uchun administratoringizga murojaat qiling.

"," "; chiqish;);?\u003e

Ushbu funktsiya brauzerga kirish uchun kirish va parol bilan avtorizatsiya qilish kerakligini aytadi. Va u shuningdek sahifani beradi HTML foydalanuvchi uchun.

" ,"

Xush kelibsiz!

" ,"

Siz ", $ auth_user" va "parol", $ auth_pass, "tizimiga kirgansiz.

" ,"

"; ?>

Kirish va parolni tasdiqlash kodi bu holatda juda murakkab emas, chunki u bir kishi uchun amalga oshiriladi. Agar o'zgaruvchi bo'lmasa, mantiq oddiy $ _SERVER ["PHP_AUTH_USER"] va $ _SERVER ["PHP_AUTH_PW"] yoki ularning qiymatlari talab qilinganlarga mos kelmasa, funktsiyani chaqiring auth_send ()... Oxirida qo'ng'iroq qilishini unutmang chiqish, shuning uchun dastur tugatiladi.

Himoyaning keyingi bosqichi filtrlash orqali amalga oshiriladi IP ulanuvchi mijozning manzillari. Albatta, Internetda ko'plab provayderlar muammolarni hal qilishadi IP bir muncha vaqt uchun manzillar va bu himoya qilish foydasiz, lekin agar biz korporativ mahalliy tarmoqlar haqida gapiradigan bo'lsak, unda ushbu chek qo'shimcha himoya qiladi.

Sizning IP-manzilingiz topilmadi !!! "; chiqish;);?\u003e

Mana qatorda $ ruxsat berilgan_ips bo'sh joy bilan ko'rsatilgan IP kirish uchun ruxsat berilgan manzillar. Keyinchalik, biz qatorni ishlatamiz portlash () va mijozning manzilini qidirib toping $ _SERVER ["REMOTE_ADDR"]... Qidirish uchun funktsiyadan foydalandim array_search (), chunki uning C kodida kiritilgan noto'g'ri kodi biz yozishimizga qaraganda tezroq ishlaydi PHP ko'chadan foydalanish uchun yoki har biriga... Ammo bu erda asosiy narsa tezlik emas :)

Himoyaning so'nggi bosqichi - bu tekshiruv MAC manzillar. Bu paranoid toifasiga kiradi va agar siz mahalliy tarmoqdan kirish imkoniga ega bo'lsangiz va uni himoya qilayotgan ma'lumotlar juda muhim bo'lsa, uni ishlatishga arziydi. Hozircha men ushbu tekshiruvni faqat tizimda amalga oshirdim Linux, amalga oshirishning nisbatan qulayligi tufayli. Ammo uni boshqa har qanday platformada amalga oshirishga urinib ko'rishingiz mumkin. Biz funktsiyani yozamiz:

Linux foydalanuvchilari allaqachon tushunganidek, unga asoslanadi ARP fayl yordamida kirish mumkin bo'lgan tizim jadvali / proc / net / arp... Funktsiya kerakli chiziqlarni qidiradi IP manzilini qaytarib beradi MAC manzil:

Sizning IP \u003d 192.168.10.15 va MAC \u003d 00: 04: 31: E4: F8: 37

Tizimda Windows balki olishning ba'zi usullari ham bor MAC oddiyroq, lekin aslida ishlaydiganlardan, bu xulosa ARP buyruq bilan tizim jadvallari:

C: \\ WINDOWS \\\u003e arp -a interfeysi: 192.168.10.15 interfeysida 0x1000003 IP-manzil Jismoniy manzil turi 192.168.10.1 00-50-22-b0-6a-aa dinamik 192.168.10.2 00-0f-38-68-e9- e8 dinamik 192.168.10.3 00-04-61-9e-26-09 dinamik 192.168.10.5 00-0f-38-6a-b1-18 dinamik

Agar sizga, albatta, kerak bo'lsa, ushbu manzil asosida himoya qilishni o'zingiz amalga oshirishingiz mumkin :) Ammo shuni yodda tutingki, agar sizning tarmog'ingizda majburiy ulanish imkoniyatisiz boshqarilmagan uskunalar mavjud bo'lsa MAC portga yuboriladigan manzillar, ushbu himoya ishlamasligi mumkin, chunki siz himoya qilish uchun foydalaniladigan barcha identifikatsiya ma'lumotlarini (login, parol, IP va MAC-manzil) soxtalashtirishingiz mumkin.



Xayrli kun do'stlar! Keling, PHP-da foydalanuvchining ro'yxatdan o'tishini ko'rib chiqaylik. Birinchidan, foydalanuvchini ro'yxatdan o'tkazish shartlarini aniqlaylik:

  • Biz algoritm yordamida parolni shifrlaymiz MD5
  • Parol "tuzlangan" bo'ladi
  • Kirish bandligini tekshiring
  • Foydalanuvchini xat bilan faollashtirish.
  • Ma'lumotlarni yozish va saqlash MySQL ma'lumotlar bazalari

Ushbu skriptni yozish uchun foydalanuvchini ro'yxatdan o'tkazish nima ekanligini tushunishimiz kerak. Foydalanuvchilarni ro'yxatdan o'tkazish - bu haqiqiy foydalanuvchidan ma'lumotlarni qabul qilish, ma'lumotlarni qayta ishlash va saqlash.

Oddiy so'zlar bilan tushuntirish uchun, ro'yxatdan o'tish - bu bizning foydalanuvchimizga avtorizatsiya qilishimiz mumkin bo'lgan ba'zi ma'lumotlarni yozib olish va saqlashdir, bu Kirish va Parol.

Avtorizatsiya - bu muayyan shaxsga yoki shaxslar guruhiga muayyan harakatlarni amalga oshirish huquqini berish, shuningdek ushbu harakatlarni amalga oshirishga urinish paytida ushbu huquqlarni tekshirish jarayoni. Sodda qilib aytganda, avtorizatsiya yordamida biz veb-saytimizdagi u yoki bu tarkibga kirishni farqlay olamiz.

Ro'yxatdan o'tishni avtorizatsiya bilan amalga oshirish uchun skript kataloglarining tuzilishini ko'rib chiqamiz. Biz skriptlarni mantiqiy tarkibiy qismlarga ajratishimiz kerak. Ro'yxatdan o'tish va avtorizatsiya modullarini alohida katalogga joylashtirdik. Shuningdek, ma'lumotlar bazasiga ulanishni alohida kataloglarga joylashtiramiz. MySQL, maxsus funktsiyalari bo'lgan fayl, uslublar fayli CSS va bizning shablonimiz HTML... Ushbu tuzilma ssenariylarni tezda boshqarishga imkon beradi. Tasavvur qiling, sizda bir nechta modulli va hokazo katta sayt mavjud. agar buyurtma bo'lmasa, bunday tartibsizlikda biror narsani topish juda qiyin bo'ladi.

Biz barcha ma'lumotlarni saqlaymiz MySQL ma'lumotlar bazalari, keyin ro'yxatdan o'tish ma'lumotlarini saqlaydigan kichik jadval yarataylik.

Avval ma'lumotlar bazasida jadval yaratishingiz kerak. Jadval chaqiriladi bez_reg Qaerda bez jadval prefiksi va reg jadval nomi.

Jadval tarkibi: bez_reg

- - Jadval tuzilishi `bez_reg` - JADVALNI YO'Q BO'LSA BO'LADI bez_reg` (` id` int (11) NULL AUTO_INCREMENT, `login` varchar (200) NULL emas,` pass` varchar (32) NULL emas , `salt` varchar (32) NOT NULL,` active_hex` varchar (32) NOT NULL, `status` int (1) NOT NULL, PRIMARY KEY (` id`)) ENGINE \u003d MyISAM DEFAULT CHARSET \u003d utf8 AUTO_INCREMENT \u003d 1;

Endi keyingi ish uchun asosiy skriptlarni yarataylik.

INDEX.PHP fayli

CONFIG.PHP fayli

"); ?>

404.html fayli

Xato 404

Xato 404

Sahifada 404 xatolik yuz berdi

Qaytarmoq


BD.PHP fayli

INDEX.HTML fayli

PHP MySQL foydalanuvchini elektron pochta orqali ro'yxatdan o'tkazish



FUNCT.PHP fayli

"." \\ n "; if (is_array ($ data)) (foreach ($ data as $ val) $ err. \u003d"

  • ". $ val."
  • "." \\ n ";) else $ err. \u003d"
  • ". $ ma'lumotlar."
  • "." \\ n "; $ err. \u003d""." \\ n "; return $ err;) / ** MySQL so'rovlari uchun oddiy o'rash * @param string $ sql * / function mysqlQuery ($ sql) ($ res \u003d mysql_query ($ sql); / * natijani tekshirish MySQL-ga yuborilgan haqiqiy so'rovni va xatoni ham ko'rsatadi. Nosozliklarni tuzatish uchun qulay. * / if (! $ res) ($ message \u003d "Noto'g'ri so'rov:". mysql_error (). "\\ n"; $ xabar. \u003d "So'rov to'liq" : ". $ sql; die ($ message);) return $ res;) / ** oddiy tuz generatori * @param string $ sql * / function salt () ($ salt \u003d substr (md5 (uniqid ()), - 8); $ tuzni qaytaring;)

    Yozishni ro'yxatdan o'tkazishga o'tamiz. Birinchidan, foydalanuvchi o'z ma'lumotlarini qayta ishlash uchun kiritishi uchun biz ro'yxatdan o'tish formasini shablonini yaratishimiz kerak. Keyinchalik, biz foydalanuvchi tomonidan kiritilgan ma'lumotlarning to'g'riligini tekshiradigan shaklni ishlov beruvchini o'zi yozishimiz kerak bo'ladi. Ma'lumotlar muvaffaqiyatli tekshirilgandan so'ng, biz ularni ma'lumotlar bazasiga yozamiz va foydalanuvchiga uning hisobini faollashtirish uchun xat yuboramiz.

    REG.PHP fayli

    Siz muvaffaqiyatli ro'yxatdan o'tdingiz! Iltimos, hisobingizni faollashtiring !!"; // Hisobni faollashtiring, agar (isset ($ _ GET [" tugma "])) (// $ sql \u003d" SELECT * FROM "tugmachasini tekshiring. BEZ_DBPREFIX." Reg` WHERE` active_hex` \u003d "". Escape_str ( $ _GET ["key"]). "" "; $ Res \u003d mysqlQuery ($ sql); if (mysql_num_rows ($ res) \u003d\u003d 0) $ err \u003d" Faollashtirish kaliti to'g'ri emas! "; // Xatolarni tekshiring va agar foydalanuvchiga ko'rsatish (count ($ err)\u003e 0) echo showErrorMessage ($ err); else (// foydalanuvchining manzilini olish $ row \u003d mysql_fetch_assoc ($ res); $ email \u003d $ row ["login"]; // hisobni faollashtirish user $ sql \u003d "UPDATE`". BEZ_DBPREFIX. "reg` SET` status` \u003d 1 WHERE` login` \u003d "". $ email. "" "; $ res \u003d mysqlQuery ($ sql); // faollashtirish uchun elektron pochta xabarini yuboring. $ title \u003d "(! LANG: http: // saytidagi hisobingiz muvaffaqiyatli faollashtirildi"; $message = "Поздравляю Вас, Ваш аккаунт на http://сайт успешно активирован"; sendMessageMail($email, BEZ_MAIL_AUTOR, $title, $message); /*Перенаправляем пользователя на нужную нам страницу*/ header("Location:". BEZ_HOST ."less/reg/?mode=reg&active=ok"); exit; } } /*Если нажата кнопка на регистрацию, начинаем проверку*/ if(isset($_POST["submit"])) { //Утюжим пришедшие данные if(empty($_POST["email"])) $err = "Поле Email не может быть пустым!"; else { if(!preg_match("/^!} [elektron pochta bilan himoyalangan](+ \\.) + (2,6) $ / i ", $ _POST [" elektron pochta "])) $ err \u003d" Elektron pochta noto'g'ri kiritilgan "." \\ N ";) if (bo'sh ($ _ POST [ "pass"])) $ err \u003d "Parol maydoni bo'sh bo'lishi mumkin emas"; agar (bo'sh ($ _ POST ["pass2"])) $ err \u003d "Parolni tasdiqlash maydoni bo'sh bo'lishi mumkin emas"; // Xatolarni tekshiring va agar foydalanuvchiga ko'rsatish (count ($ err)\u003e 0) echo showErrorMessage ($ err); else (/ * Kiritilgan ma'lumotlarni tekshirishni davom eting Parollarni mos kelishini tekshiring * / if ($ _ POST ["pass"]! \u003d $ _POST ["pass2") ]) $ err \u003d "Parollar mos kelmaydi"; // Xatolarni tekshiring va foydalanuvchiga ko'rsating, agar (count ($ err)\u003e 0) echo showErrorMessage ($ err); else (/ * Ma'lumotlar bazasida bizda shunday foydalanuvchi mavjudligini tekshiring * / $ sql \u003d "SELECT` login` FROM`". BEZ_DBPREFIX. "reg` WHERE` login` \u003d" ". escape_str ($ _ POST [" email "])." ""; $ res \u003d mysqlQuery ($ sql); if (mysql_num_rows ($ res)\u003e 0) $ err \u003d "Kechirasiz kirish: ". $ _POST [" elektron pochta "]." band! "; // Xatolarni tekshiring va agar (count ($ err)\u003e 0) echo showErrorMessage ($ err); else (// tuzning HASH-ni oling $ salt \u003d salt (); // parolni tuzlang $ pass \u003d) md5 (md5 ($ _ POST ["o'tish"]). $ tuz); / * Agar barchasi yaxshi bo'lsa, ma'lumotlarni ma'lumotlar bazasiga yozing * / $ sql \u003d "INSERT INTO`". BEZ_DBPREFIX. "reg` VALUES (" "," " . escape_str ($ _ POST ["elektron pochta"]). "", "". $ o'tish. "", "". $ tuz. "", "". md5 ($ tuz). "", 0) "; $ res \u003d mysqlQuery ($ sql); // $ url \u003d BEZ_HOST-ni faollashtirish uchun elektron pochta xabarini yuborish. "less / reg /? mode \u003d reg & key \u003d". md5 ($ salt); $ title \u003d "(! LANG: http: / da ro'yxatdan o'tish / veb-sayt"; $message = "Для активации Вашего акаунта пройдите по ссылке ". $url .""; sendMessageMail($_POST["email"], BEZ_MAIL_AUTOR, $title, $message); //Сбрасываем параметры header("Location:". BEZ_HOST ."less/reg/?mode=reg&status=ok"); exit; } } } } ?>!}

    REG_FORM.HTML fayli

    PHP MySQL foydalanuvchini elektron pochta orqali ro'yxatdan o'tkazish

    Elektron pochta *:
    Parol *:
    Parolni tasdiqlash *:

    Belgisi bo'lgan maydonlar * talab qilinadi

    Biz foydalanuvchilarni ro'yxatdan o'tkazishga tayyormiz, avtorizatsiya yozish vaqti keldi. Keling, foydalanuvchi avtorizatsiyasi uchun forma yarataylik, so'ngra avtorizatsiya formasini ishlov beruvchisini yozamiz va nihoyat skriptni tuzamiz show.php bu bizga tizimda vakolatli yoki yo'qligimizni ko'rsatib beradi.

    AUTH.PHP fayli

    0) echo showErrorMessage ($ err); else (/ * foydalanuvchining haqiqiyligini tekshirish uchun ma'lumotlar bazasidan * * $ $ sql \u003d "SELECT * FROM`" so'rovini yarating. BEZ_DBPREFIX. "reg` WHERE` login` \u003d "". escape_str ($ _ POST ["email"]) . "" AND `status` \u003d 1"; $ res \u003d mysqlQuery ($ sql); // Agar kirish mos bo'lsa, parolni tekshiring, agar (mysql_num_rows ($ res)\u003e 0) (// Ma'lumotlarni jadvaldan oling $ row \u003d mysql_fetch_assoc ( $ res); if (md5 (md5 ($ _ POST ["pass"]). $ row ["salt"]) \u003d\u003d $ row ["pass"]) ($ _SESSION ["user"] \u003d true; // Parametrlar sarlavhasini tiklash ("Joylashuv:". BEZ_HOST. "Less / reg /? Mode \u003d auth"); chiqish;) else echo showErrorMessage ("Noto'g'ri parol!");) Boshqa echo showErrorMessage ("Kirish ". $ _POST [" elektron pochta "]." topilmadi! ");))?\u003e

    PHP-ning so'nggi versiyasiga ega bo'lganlar uchun men ushbu skriptni foydalanib joylashtiraman PDO beri kengayish MySQL eskirgan va PHP ning yangi versiyasidan olib tashlangan. PHP mysql pdo-ni ro'yxatdan o'tkazish va avtorizatsiyasini yuklab oling

    Arxiv 2015 yil 24 fevralda yangilandi.

    Diqqat: Agar siz ushbu skriptni mahalliy serverda ishlatsangiz DENWER, XAMPP, keyin siz pochta qutingizga xatlarni kutmasligingiz kerak. Xatlar bo'sh joyda sendmail... IN Denver ularni yo'l davomida topishingiz mumkin Z: \\ tmp \\! Sendmail \\ ushbu fayllarni istalgan pochta mijozida ochishingiz mumkin.

    Funktsiyadan foydalanish mumkin sarlavha () xabar yuborish "Autentifikatsiya talab qilinadi" brauzer, foydalanuvchi nomi va parolni kiritish uchun oynani ko'rsatishga majbur qiladi. Foydalanuvchi foydalanuvchi nomi va parolni to'ldirishi bilanoq PHP-skriptni o'z ichiga olgan bog'lanish, avval belgilangan PHP_AUTH_USER, PHP_AUTH_PW va AUTH_TYPE o'zgaruvchilari mos ravishda login, parol va autentifikatsiya turiga o'rnatiladi. Ushbu oldindan belgilangan o'zgaruvchilar $ _SERVER va $ HTTP_SERVER_VARS qatorlarida saqlanadi. Ikkala tur ham qo'llab-quvvatlanadi: "Asosiy" va "Digest" (PHP 5.1.0 dan beri). Tafsilotlar uchun funktsiyani ko'ring sarlavha ().

    Mijozni sahifani ko'rish uchun tizimga kirishga majbur qiladigan skript qismining misoli:

    Misol # 6 Asosiy HTTP autentifikatsiyasi misoli

    agar (! isset ($ _ SERVER ["PHP_AUTH_USER"])))
    sarlavha ( "WWW-Authenticate: Basic realm \u003d" Mening soham "");

    aks sado "Tadbirda yuborilgan matn
    agar foydalanuvchi Bekor qilish tugmachasini bosgan bo'lsa "
    ;
    Chiqish;
    ) boshqa (
    aks sado
    "

    Salom ($ _SERVER ["PHP_AUTH_USER"]).

    " ;
    aks sado "

    Siz parolingizni kiritdingiz($ _SERVER ["PHP_AUTH_PW"]).

    " ;
    }
    ?>

    Misol # 7 Digest HTTP autentifikatsiyasi misoli

    Bu oddiy Digest HTTP autentifikatsiya skriptining namunaviy tadbiri. Tafsilotlar uchun RFC 2617-ga qarang.

    $ realm \u003d "Cheklangan hudud";

    // user \u003d\u003e parol
    $ users \u003d array ("admin" \u003d\u003e "mypass", "guest" \u003d\u003e "guest");

    agar (bo'sh ($ _ SERVER ["PHP_AUTH_DIGEST"])))
    sarlavha ("HTTP / 1.1 401 Ruxsatsiz");
    sarlavha ( "WWW-Authenticate: Digest realm \u003d" "... $ shohligi.
    "", qop \u003d "auth", nonce \u003d "". uniqid (). "", shaffof bo'lmagan \u003d "". md5 ($ realm). "" ");

    Die ( "Agar foydalanuvchi Bekor qilishni bosgan bo'lsa, matn yuborildi");
    }

    // PHP_AUTH_DIGEST o'zgaruvchisini tahlil qiling
    agar (! ($ data \u003d http_digest_parse ($ _SERVER ["PHP_AUTH_DIGEST"]))) ||
    ! isset ($ user [$ data ["username"]]))
    o'lmoq ( "Noto'g'ri ma'lumotlar!");

    // to'g'ri javobni yarating
    $ A1 \u003d md5 ($ data ["username"]. ":". $ Realm. ":". $ Users [$ data ["username"]]);
    $ A2 \u003d md5 ($ _SERVER ["REQUEST_METHOD"]. ":". $ Data ["uri"]);
    $ valid_response \u003d md5 ($ A1. ":". $ data ["nonce"]. ":". $ data ["nc"]. ":". $ data ["cnonce"]. ":". $ data ["qop"]. ":". $ A2);

    if ($ data ["response"]! \u003d $ valid_response)
    o'lmoq ( "Noto'g'ri ma'lumotlar!");

    // ok, login va parol to'g'ri
    echo "Siz quyidagicha tizimga kirgansiz:". $ data ["username"];

    http auth sarlavhasini tahlil qilish uchun // funktsiyasi
    http_digest_parse funktsiyasi ($ txt)
    {
    // etishmayotgan ma'lumotlardan himoya qilish
    $ need_parts \u003d array ("nonce" \u003d\u003e 1, "nc" \u003d\u003e 1, "cnonce" \u003d\u003e 1, "qop" \u003d\u003e 1, "username" \u003d\u003e 1, "uri" \u003d\u003e 1, "response" \u003d\u003e 1);
    $ data \u003d array ();
    $ keys \u003d implode ("|", array_keys ($ need_parts));

    Preg_match_all ("@ (". $ Keys. ") \u003d (?: ([\\" "]) ([^ \\ 2] +?) \\ 2 | ([^ \\ s,] +)) @", $ txt, $ match, PREG_SET_ORDER);

    Foreach ($ $ m bilan mos keladi) (
    $ data [$ m [1]] \u003d $ m [3]? $ m [3]: $ m [4];
    o'rnatilmagan ($ need_parts [$ m [1]]);
    }

    $ Need_parts qaytariladimi? false: $ ma'lumotlar;
    }
    ?>

    Izoh: Muvofiqlik to'g'risidagi eslatma

    HTTP sarlavhalarini ko'rsatishda ayniqsa ehtiyot bo'ling. Iloji boricha ko'proq turli xil mijozlar bilan maksimal darajada muvofiqligini kafolatlash uchun "Basic" so'zi "B" katta harf bilan yozilishi kerak, maydon ikki marta (bitta emas!) Kotirovka bilan yozilishi kerak va kod oldida to'liq bitta bo'sh joy bo'lishi kerak 401 sarlavhada HTTP / 1.0 401... Autentifikatsiya parametrlari yuqoridagi Digest autentifikatsiya misolida ko'rsatilgandek vergul bilan ajratilishi kerak.

    PHP_AUTH_USER va PHP_AUTH_PW o'zgaruvchilarini ekranda aks ettirish o'rniga, ularning to'g'riligini tekshirishingiz mumkin. Buning uchun ma'lumotlar bazasi so'rovidan foydalaning yoki dbm faylida foydalanuvchini qidiring.

    Internet Explorer brauzerining xususiyatlarini kuzatishingiz mumkin. O'tkazilgan sarlavhalar parametri haqida juda ehtiyotkorlik bilan. Sarlavha hiyla-nayrang WWW-autentifikatsiya holatini yuborishdan oldin HTTP / 1.0 401 hozircha u uchun ishlaydi.

    PHP 4.3.0 dan boshlab, tashqi autentifikatsiyadan foydalanadigan sahifa uchun parolni ochish uchun biron bir odam skript yozishiga yo'l qo'ymaslik uchun, agar PHP_AUTH o'zgaruvchilari o'rnatilmagan bo'lsa, agar tashqi autentifikatsiya ishlatilsa va xavfsiz rejim o'rnatilgan bo'lsa. REMOTE_USER o'zgaruvchisidan qat'i nazar, tashqi autentifikatsiya qilingan foydalanuvchi autentifikatsiyasi uchun ishlatilishi mumkin. Shunday qilib, har doim $ _SERVER ["REMOTE_USER"] o'zgaruvchisidan foydalanishingiz mumkin.

    Izoh: Konfiguratsiya eslatmasi

    PHP direktiv spetsifikatsiyadan foydalanadi AuthType tashqi autentifikatsiya ishlatilishini yoki ishlatilmasligini ko'rsatish uchun.

    Shuni ta'kidlash kerakki, yuqorida aytib o'tilganlarning hammasi bitta serverda joylashgan ruxsatsiz sahifalarni boshqaradigan shaxs tomonidan avtorizatsiyani talab qiladigan sahifalar uchun parollarni o'g'irlashning oldini olmaydi.

    Netscape Navigator va Internet Explorer ikkalasi ham serverdan qabul qilinganda ko'rsatilgan mintaqa (hudud) uchun joriy oynaning autentifikatsiya keshini tozalaydi. Buning yordamida foydalanuvchini tizimdan chiqib, foydalanuvchi nomi va parol dialog oynasini qayta ko'rsatishga majbur qilish uchun foydalanish mumkin. Ba'zi dasturchilar avtorizatsiyani vaqt bo'yicha cheklash yoki tizimdan chiqish tugmachasini taqdim etish uchun bundan foydalanadilar.

    Misol # 8 Yangi foydalanuvchi nomi / parol juftligini majburiy kiritish bilan HTTP autentifikatsiyasining misoli

    funktsiyani tasdiqlash () {
    sarlavha ( "WWW-Authenticate: Basic realm \u003d" Sinovlarni tasdiqlash tizimi "");
    sarlavha ("HTTP / 1.0 401 Ruxsatsiz");
    aks sado "Resursga kirish uchun foydalanuvchi nomi va parolni to'g'ri kiritishingiz kerak \\ n";
    Chiqish;
    }

    if (! isset ($ _ SERVER ["PHP_AUTH_USER"]) ||
    ($ _POST ["SeenBefore"] \u003d\u003d 1 && $ _POST ["OldAuth"] \u003d\u003d $ _SERVER ["PHP_AUTH_USER"]))))
    autentifikatsiya ();
    ) boshqa (
    aks sado "

    Xush kelibsiz: "... htmlspecialchars ($ _SERVER ["PHP_AUTH_USER"]). "
    " ;
    aks sado "Oldingi kirish:"... htmlspecialchars ($ _REQUEST ["OldAuth"]);
    aks sado "

    \\ n ";
    aks sado "\\ n ";
    aks sado "... htmlspecialchars ($ _SERVER ["PHP_AUTH_USER"]). "\\" /\u003e \\ n ";
    aks sado "\\ n ";
    aks sado "

    \\ n ";
    }
    ?>

    Ushbu xatti-harakatlar standartlar bilan tartibga solinmagan HTTP Basic- autentifikatsiya, shuning uchun siz unga bog'liq bo'lmasligingiz kerak. Brauzerni sinovdan o'tkazish Lynx buni ko'rsatdi Lynx serverdan 401 holatini olayotganda avtorizatsiya keshini o'chirmaydi va "Orqaga" va keyin "Oldinga" tugmachasini bosish orqali kerakli avtorizatsiya atributlari o'zgarmagan bo'lsa, bunday sahifani ochish mumkin. Biroq, foydalanuvchi tugmachani bosishi mumkin "_" autentifikatsiya keshini tozalash uchun.

    Shuni ham ta'kidlash kerakki, PHP 4.3.3 dan oldin, ba'zi bir IIS cheklovlari tufayli PHP CGI moduli sifatida o'rnatilgan bo'lsa, Microsoft IIS ishlaydigan serverlarda HTTP autentifikatsiyasi ishlamagan. PHP 4.3.3+ da to'g'ri ishlashi uchun "" deb nomlangan IIS konfiguratsiya sozlamalarini tahrirlashingiz kerak. Katalog xavfsizligi". Yozuvni bosing" Tahrirlash"va parametrni o'rnating" Anonim kirish", boshqa barcha maydonlar belgilanmasdan qoldirilishi kerak.

    Agar siz IIS-ni ISAPI va PHP 4 orqali ishlatsangiz, yana bir cheklash: o'zgaruvchilar PHP_AUTH_ * aniqlanmagan, ammo ayni paytda o'zgaruvchan mavjud HTTP_AUTHORIZATION... Siz foydalanishingiz mumkin bo'lgan namunaviy kod: list ($ user, $ pw) \u003d explode (":", base64_decode (substr ($ _ SERVER ["HTTP_AUTHORIZATION"], 6)));

    Izoh: IIS eslatmasi:
    IIS-da HTTP autentifikatsiyasi to'g'ri ishlashi uchun PHP konfiguratsiyasidagi cgi.rfc2616_headers opsiyasi o'rnatilishi kerak 0 (standart).

    Izoh:

    Agar xavfsiz rejim ishlatilsa, joriy skriptning UID-ga qo'shiladi shohlik- bosh qismi WWW-autentifikatsiya.

    Maqola sizga yoqdimi? Do'stlar bilan bo'lishish uchun: