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"]))) Salom ($ _SERVER ["PHP_AUTH_USER"]). Siz parolni kiritdingiz ($ _SERVER ["PHP_AUTH_PW"]).
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"
aks sado "
}
?>
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")) || Xush kelibsiz: ($ _SERVER ["PHP_AUTH_USER"])
($ _POST ["SeenBefore"] \u003d\u003d 1 && $ _POST ["OldAuth"] \u003d\u003d $ _SERVER ["PHP_AUTH_USER"]))))
autentifikatsiya qilish ();
}
boshqa (
aks sado"
"
aks sado "Oldingi kirish: ($ _REQUEST [" OldAuth "])";
aks sado ";
aks sado "\\ n ";
aks sado "\\ n ";
aks sado "\\ n ";
aks sado "
}
?>
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"]) || Xush kelibsiz: "
($ _POST ["SeenBefore"] \u003d\u003d 1 && $ _POST ["OldAuth"] \u003d\u003d $ _SERVER ["PHP_AUTH_USER"]))))
autentifikatsiya ();
) boshqa (
aks sado "
"
;
aks sado "Oldingi kirish:"... htmlspecialchars ($ _REQUEST ["OldAuth"]);
aks sado ";
aks sado "\\ n ";
aks sado "... htmlspecialchars ($ _SERVER ["PHP_AUTH_USER"]). "\\" /\u003e \\ n ";
aks sado "\\ n ";
aks sado "
}
?>
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:
- O'zgaruvchilardan foydalangan holda parolni himoya qilish (login / parol) $ _SERVER ["PHP_AUTH_USER"] va $ _SERVER ["PHP_AUTH_PW"].
- Himoyalash IP o'zgaruvchidan foydalangan holda mijoz manzili $ _SERVER ["REMOTE_ADDR"].
- 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;);?\u003eUshbu 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.