int setcookie (string nomi [, string qiymati [, int expire [, string path [, string domain [, int security]]]]])

Setcookie() boshqa sarlavha ma'lumotlari bilan birga yuboriladigan cookie-faylni belgilaydi. Cookie-fayllar yuborilishi kerak oldin har qanday boshqa sarlavhalar (bu PHP emas, balki cookie cheklovi). Buning uchun siz ushbu funktsiyaga yoki teglaridan oldin qo'ng'iroq qilishingizni talab qiladi. Ismdan tashqari barcha argumentlar ixtiyoriy. Agar faqat nom argumenti taqdim etilsa, bu nomga ega cookie masofaviy mijozdan oʻchiriladi. Shuningdek, ushbu argumentni oʻtkazib yuborish uchun istalgan argumentni boʻsh qator (“”) bilan almashtirishingiz mumkin. Muddati tugaydi va xavfsiz argumentlar butun / tamsayı bo'lib, ularni bo'sh qatordan foydalanib o'tkazib bo'lmaydi. Ularda nol (0) dan foydalaning. Muddati tugashi argumenti time() yoki mktime() tomonidan qaytarilgan oddiy Unix vaqt butun sonidir. Xavfsiz argument bu cookie fayli faqat xavfsiz HTTPS ulanishi orqali yuborilishi kerakligini bildiradi. Cookie-fayllar o'rnatilgandan so'ng, keyingi sahifani yuklashda ularga $_COOKIE massivi (4.1.0 dan oldingi PHP versiyalarida $HTTP_COOKIE_VARS deb ataladi) orqali kirish mumkin. Umumiy tuzoqlar: keyingi sahifa yuklanmaguncha cookie-fayllar ko‘rinmaydi.Cookie-fayllar o‘rnatilgan sozlamalar bilan o‘chirilishi kerak. PHP 3 da bir xil skriptdagi setcookie() ga bir nechta qo'ng'iroqlar teskari tartibda amalga oshirilishi mumkin. Agar siz bitta cookie-faylni boshqasini qo'yishdan oldin o'chirmoqchi bo'lsangiz, uni o'chirishdan oldin kiritishingiz kerak. PHP 4 da setcookie() ga bir nechta qo'ng'iroqlar chaqirilgan tartibda amalga oshiriladi. Quyida kukilarni yuborish misollari keltirilgan:
Esda tutingki, cookie fayli yuborilganda uning qiymat qismi avtomatik ravishda urlenkodlanadi va qabul qilinganda u avtomatik ravishda dekodlanadi va cookie nomi bilan bir xil nomdagi o‘zgaruvchiga tayinlanadi. Test cookie-faylimiz tarkibini skriptda ko‘rish uchun quyidagi misollardan birini ishlatish kifoya: Cookie-fayllar haqida qo‘shimcha ma’lumot olish uchun Netscape spetsifikatsiyasiga qarang: http://www.netscape.com/newsref/std/cookie_spec.html. 1-xizmat to'plami bilan Microsoft Internet Explorer 4 yo'l parametrlari o'rnatilgan cookie-fayllar bilan to'g'ri ishlamaydi. Netscape Communicator 4.05 va Microsoft Internet Explorer 3.x, agar yo'l va vaqt o'rnatilmagan bo'lsa, cookie-fayllarni to'g'ri qayta ishlamaydi.

Oxirgi yangilanish: 11/1/2015

Cookie-fayllar - bu veb-sayt foydalanuvchining kompyuterida istalgan ma'lumotni saqlashi mumkin bo'lgan kichik ma'lumotlar to'plami (4 kbaytdan ko'p bo'lmagan). Cookie-fayllardan foydalanib, siz saytdagi foydalanuvchi faoliyatini kuzatishingiz mumkin: foydalanuvchi saytga kirganmi yoki yo'qmi, uning tashriflari tarixini kuzatib boring va hokazo.

Cookie fayllarni saqlash

Cookie-fayllarni foydalanuvchi kompyuterida saqlash uchun funksiyadan foydalaning setcookie(). U quyidagi ta'rifga ega:

Bool setcookie(string $name, string $value, int $expire, string $path, string $domain, bool $secure, bool $httponly);

setcookie() funksiyasi quyidagi parametrlarni qabul qilishi mumkin:

    nom: uning qiymatiga kirish uchun foydalaniladigan cookie faylining nomi

    qiymat: cookie-faylning qiymati yoki mazmuni - 4 kByte dan katta bo'lmagan har qanday alfanumerik matn

    muddati tugaydi (ixtiyoriy): Cookie fayllari yo'q qilinadigan amal qilish muddati. Agar ushbu parametr o'rnatilmagan yoki 0 ga teng bo'lsa, u holda cookie brauzerni yopgandan so'ng yo'q qilinadi.

    yo'l (ixtiyoriy): cookie-fayllar mavjud bo'lgan serverdagi katalogga yo'l. Agar siz "/" ni belgilasangiz, cookie-fayllar butun saytda mavjud bo'ladi. Agar siz, masalan, "/mydir/" ni o'rnatsangiz, cookie-fayllarga faqat katalogdan kirish mumkin bo'ladi /mydir/" va uning barcha pastki kataloglari. Standart qiymat cookie-fayllar o'rnatilgan joriy katalogdir.

    domen (ixtiyoriy): Cookie-fayllar mavjud bo'lgan domenni belgilaydi. Agar u ikkinchi darajali domen bo'lsa, masalan, localhost.com, keyin cookie-fayllar butun localhost.com sayti, jumladan uning subdomenlari uchun mavjud blog.localhost.com.

    Agar subdomen ko'rsatilgan bo'lsa blog.localhost.com, u holda cookie fayllari faqat shu subdomen ichida mavjud.

    xavfsiz (ixtiyoriy): Cookie qiymati HTTPS orqali yuborilishi kerakligini bildiradi. Agar rost ga o'rnatilgan bo'lsa, mijozdan cookie faqat xavfsiz ulanish o'rnatilgan bo'lsa serverga yuboriladi. Birlamchi qiymatlar noto'g'ri.

    Faqat http (ixtiyoriy): agar rost bo'lsa, cookie-fayllarga faqat http protokoli orqali kirish mumkin bo'ladi. Ya'ni, bu holda cookie fayllari skript tillarida, masalan, JavaScript-da mavjud bo'lmaydi. Odatiy bo'lib, parametr noto'g'ri

Cookie-fayllarni saqlaymiz:

$value1 = "Singapur"; $value2 = "xitoycha"; setcookie("shahar", $1 qiymati); setcookie("til", $value2, time()+3600); // amal qilish muddati 1 soat

Bu erda ikkita cookie o'rnatilgan: "shahar" va "til". Birinchi cookie brauzer yopilgandan keyin, ikkinchisi esa 3600 soniyadan keyin, ya'ni bir soatdan keyin yo'q qilinadi.

Cookie fayllarini qabul qilish

Cookie faylini olish uchun siz global assotsiativ massivdan foydalanishingiz mumkin $_COOKIE, masalan, $_COOKIE["shahar"] . Shunday qilib, biz avval saqlangan cookie-fayllarni olamiz:

Agar (isset($_COOKIE["city"]) aks-sado "Shahar: " . $_COOKIE["shahar"] . "
"; if (isset($_COOKIE["language"])) echo "Til: " . $_COOKIE["til"];

Cookie fayllarida massivlarni saqlash

Massivlarni cookie-fayllarda saqlash o'ziga xos xususiyatlarga ega. Masalan, quyidagi massivni saqlaymiz:

Setcookie("lan", "PHP"); setcookie("lan", "C#"); setcookie("lan", "Java");

Endi biz uni olamiz va uni sahifada ko'rsatamiz:

Agar (isset($_COOKIE["lan"])) (foreach ($_COOKIE["lan"] $name => $value sifatida) ($name = htmlspecialchars($name); $value = htmlspecialchars($value) ); echo "$name. $qiymat
"; } }

Cookie-fayllarni olib tashlash

Cookie faylini oʻchirish uchun amal qilish muddati sifatida oʻtgan vaqtni koʻrsatish kifoya:

Setcookie("shahar", "", time() - 3600);

Biz veb-dasturlashning asosiy tamoyillari bilan tanishishda davom etamiz. Bugun biz deb atalmish haqida gaplashamiz kukilar(cookie). Cookie - bu veb-server tomonidan mijozga yuboriladigan va mijoz tomonida saqlanadigan ma'lumotlar.

Har qanday veb-skript, masalan, PHP skripti odatda bir soniya ichida ishlaydi va keyingi jo'natish uchun ma'lumotni veb-serverga qaytaradi. Skript tugagandan so'ng, uning ishlashi davomida RAMda yaratilgan barcha ma'lumotlar yo'q qilinadi. Ba'zan bu ma'lumotlarni yo'qotib bo'lmaydi. Aytaylik, saytning asosiy sahifasida sizdan afzal ko'rgan fon rangini tanlashingizni so'ragan HTML formasi mavjud. Keyinchalik, barcha sahifalar foydalanuvchi tanlagan rangdan foydalanadi. Rang qiymati - bu cookie fayli yordamida berilgan vazifa kontekstida saqlanishi mumkin bo'lgan narsa.

PHP-da cookie-fayl mexanizmining ishlashini batafsilroq tushunish uchun siz "PHP Interpreter. Asoslari, ishlash tamoyillari" maqolasini o'qib chiqishingiz kerak, xususan, "birinchi chiqish" deb ataladigan tushunchaga to'g'ri keladi. Shunday qilib, siz so'rovga HTTP javobini yaratish bosqichida mexanizmdan foydalanishingiz mumkin. Veb-mijozga ba'zi parametrlarni saqlashni buyurish uchun HTTP javobiga sarlavha qo'shiladi shakl qiymati bilan ism = qiymat(parametr nomi, parametr qiymati), masalan:

Set-Cookie: mening ismim = Jon

Agar bir nechta parametrlarni saqlash kerak bo'lsa, bunday sarlavhalar bir nechta bo'lishi mumkin. HTTP javobini olayotganda, veb-brauzer Set-Cookie sarlavhalari mavjudligini tekshiradi va agar mavjud bo'lsa, ularning qiymatlarini ichki xizmat fayllarida saqlaydi. Cookie fayllari sukut bo'yicha sayt domeniga bog'langan. HTTP so'rovini tayyorlashda veb-brauzer so'rov yuborilayotgan domen bilan bog'langan cookie-fayllarni saqlaganligini tekshiradi. Agar mavjud bo'lsa, HTTP so'roviga sarlavha qo'shiladi

Cookie: ism = qiymat

topilgan har bir saqlangan parametr uchun. Shunday qilib, veb-mijozga ma'lum parametrlarni cookie fayli sifatida saqlashni buyurgan veb-server ushbu mijozdan keyingi barcha HTTP so'rovlarida ushbu parametrlarni qaytarib oladi. Brauzerni yopganingizda saqlangan cookie fayllari o'chiriladi.

Cookie-da cookie-faylning ishlash muddatini belgilashingiz mumkin. Buning uchun maxsus atribut qo'shiladi muddati tugaydi quyida bayon qilinganidek:

Set-cookie: nom=qiymat; muddati = sana

Brauzer ushbu cookie-faylni o'chirishi kerak bo'lgan sana va vaqt qaerda, masalan:

Muddati tugaydi atributining formatiga e'tibor bering.

Atributdan foydalanish yo'l Cookie-fayllar doirasini cheklashingiz mumkin. Odatiy bo'lib, cookie-fayllar qiymatga mos keladigan berilgan domen uchun barcha so'rovlarga qo'llaniladi yo'l=/. Agar, masalan, biz o'rnatamiz yo'l=/doc/, u holda cookie fayllari faqat /doc/ katalogiga, shuningdek, uning barcha quyi kataloglari va hujjatlariga, masalan, /doc/images/ so'rovlariga qo'llaniladi. Yo'l atributiga misol:

Bundan tashqari, atribut yordamida domen ulanishini bekor qilishingiz mumkin domen. Odatiy bo'lib, cookie so'rovi cookie faylini yaratishni boshlagan hujjatning domeniga bog'langan. Belgilasangiz .domain.ru, keyin cookie fayli domain.ru domeniga, shuningdek, uning barcha subdomenlariga bo'lgan so'rovlarga qo'llaniladi. Siz harakatni ma'lum bir subdomen bilan cheklashingiz mumkin, masalan, www.domain.ru. Amal qilish muddati, yo'l va domen atributlaridan foydalanishga misol:

PHP da cookie-fayllar bilan qanday ishlashni aniqlash vaqti keldi. Cookie fayllarini o'rnatish uchun PHP setcookie funktsiyasi mavjud:

Bool ( string $name [ , string $value [ , int $expire = 0 [ , string $path [ , string $domain [ , bool $secure = false [ , bool $httponly = false ] ] ] ] ] )

Ko'pgina funktsiya parametrlari ixtiyoriydir. Haqiqiy misolni ko'rib chiqaylik (oldindan tavsiya etilgan fon rangini tanlash bilan sahifa):

"#090" , "ko'k" => "#009" , "qizil" => // Standart fon rangi (oq). Tegishli cookie mavjud bo'lsa, rang cookie faylidan olinadi (keyinroq amalga oshiriladi) ?>
">
Istalgan fon:

Ushbu misolda cookie mexanizmi hali faollashtirilmagan, faqat sahifa ramkasi yaratilgan. Agar siz avvalgi maqolalar va darslarni o'qigan bo'lsangiz, unda siz ushbu kodni tushunishingiz kerak. Massiv mumkin bo'lgan ranglar ro'yxatini saqlaydi (siz o'zingizni qo'shishingiz mumkin), ranglar ochiladigan ro'yxat sifatida HTML shaklida ko'rsatiladi. Endi siz formadan ma'lumotlar ishlovchisi yozishingiz kerak. An'anaga ko'ra, ma'lumotlarni e'lon qilgandan so'ng, biz uni yuqori qismga joylashtiramiz:

"#090" , "ko'k" => "#009" , "qizil" => "#900" ); $bgcolor = "#fff" ; // Standart fon rangi (oq). Agar tegishli cookie mavjud bo'lsa, rang cookie faylidan olinadi (quyidagi misolda amalga oshiriladi) //--Fon rangi qiymatini cookie faylida saqlang. Tafsilotlar quyida maqolada } ?>

Ishlovchi foydalanuvchi tanlagan rang qiymatini oladi va PHP setcookie funksiyasidan foydalanib uni cookie faylida saqlaydi. Setcookie funksiyasi yaratilgan HTTP javobiga cookie-faylimizdan Set-Cookie sarlavhasini qo'shadi. U, sarlavha funktsiyasi kabi, faqat chiqishdan oldin, ya'ni kodda iloji boricha yuqoriroqda ishlatilishi mumkin.

Ajoyib, biz kukilarni saqladik. Endi biz ulardan foydalanishimiz kerak. Ishlovchining tepasida, agar u yerda saqlangan bo'lsa, cookie-fayldan fon rangi qiymatini olish uchun kodni qo'shing:

if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ], $colors ) ) ( $bgcolor = [ "bgcolor" ]; )

Hammasi juda oddiy. Agar biron-bir cookie fayli skript soʻrovi bilan birga yuborilgan boʻlsa, PHP ularni global $_COOKIE massiviga joylashtiradi. Shunday qilib, qabul qilingan cookie-fayllar bilan ishlash, aytaylik, qabul qilingan GET yoki POST parametrlari bilan ishlashdan farq qilmaydi. To'liq skript ro'yxati:

"#090" , "ko'k" => "#009" , "qizil" => "#900" ); $bgcolor = "#fff" ; // Standart fon rangi (oq) //--bgcolor allaqachon cookie-fayllarda saqlanganligini tekshiring (biz to'g'riligini ham tekshiramiz, chunki cookie-fayllarni almashtirish oson) if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $colors ) ) ( //--Agar mavjud bo'lsa, saqlangan qiymatdan foydalaning$bgcolor = [ "bgcolor" ] ; ) //--GET parametri bgcolor uzatilganligini va uning massivimizda mavjudligini tekshiring. Aks holda, bilasizmi, ular sizni kim biladi, sizga topshirishlari mumkin, keyin biz buni hal qilishimiz kerak;) if ( isset ($_GET [ "bgcolor" ] ) && in_array ($_GET [ "bgcolor" ], $colors ) ) ( $bgcolor = $_GET [ "bgcolor" ] ; //--Bu bizning sahifamiz uchun yangi fon bo'ladi("bgcolor" , $bgcolor ); ) ?> Sahifa fonini tanlash imkoniyati
">
Istalgan fon:

Skript qanday ishlashini ko'rib chiqing; agar sizda biron bir savol bo'lsa, sharhlaringizni qoldiring. Fon rangi deb ataladigan joyda saqlanadi vaqtinchalik cookie, brauzerni yopganingizda o'chiriladi. Doimiy cookie faylidan foydalanamiz.Buni amalga oshirish uchun setcookie funksiyasida uchinchi parametr – cookie-fayllarni o‘chirish vaqtini aniqlashimiz kerak, u Set-Cookie HTTP sarlavhasining tugash atributiga aylantiriladi. Parametr Unix formatidagi vaqt tamg'asini belgilaydi. Ko'pincha bunday belgini yaratish uchun PHP time() funksiyasidan foydalaniladi, u joriy vaqtni Unix formatida qaytaradi va unga cookie o'chirilishi kerak bo'lgan soniyalar sonini qo'shadi. Masalan, time()+3600- bir soatdan keyin cookie-fayllarni o'chirib tashlang. Keling, cookie-faylimizni bir hafta davomida faol qilaylik:

("bgcolor" , $bgcolor , vaqt () + 3600 * 24 * 7 ); //--Fon rangi qiymatini cookie faylida saqlang

Mana, endi sayt brauzerni yopgandan keyin ham tanlangan fon rangini "eslab qoladi". Aytgancha, cookie-fayllarni o'chirish uchun o'tgan sanani, masalan, amal qilish muddatini belgilang vaqt () -3600. Misollarni sinab ko'rishda HTTP sarlavhalariga qarashni unutmang.

Xavfsizlik har bir veb-sayt muvaffaqiyatining muhim qismidir. Biroq, xavfsizlikni noto'g'ri yaxshilash xarajatlarning oshishiga va foydalanuvchining umumiy bezovtalanishiga olib kelishi mumkin. Ushbu qo'llanmada biz seans fayllari va cookie-fayllar bilan ishlashda tez-tez uchraydigan muammolarni ko'rib chiqamiz.

Cookie-fayllar

Cookie-fayllar foydalanuvchini sayt orqali aniqlash usullaridir. Masalan, sayt "sevimli_rang" nomi va qiymati "qizil" bilan cookie yaratadi. Bundan buyon siz saytga har safar tashrif buyurganingizda cookie fayli yuklab olinadi va sizning sevimli rangingiz qizil boʻlishi oʻrnatiladi (“sevimli_rang” “qizil”). Bu juda qulay, chunki foydalanuvchi har safar saytga tashrif buyurganida tizimda ro'yxatdan o'tishi shart emas. Ushbu usul ko'plab saytlarda joylashgan "Meni eslab qolish" variantida ham qo'llaniladi. Biroq, bu usul saytning xavfsizlik tizimida jiddiy teshiklarni ham yaratishi mumkin.

Bir misol, qaysi cookie-fayllar saytingizga qaytarilishini tasdiqlamaydi. Oddiy qidiruvdan so'ng men foydalanuvchi paneli skripti bilan veb-sayt topdim. Ushbu skript mening barcha kirish ma'lumotlarimni cookie-fayllarda chiqardi va har bir amal bajarilganda qiymatlarni yukladi. Misol uchun, agar men sharh qoldirgan bo'lsam, tizim cookie nomlari o'zgaruvchisidan mening har qanday ismimni qaytaradi. Keyinchalik, firebug kengaytmasi va bir nechta boshqa qurilmalardan foydalanib, men nafaqat ushbu fayllarni ko'rish, balki ularni tahrirlash ham mumkin edi. Shunday qilib, men o'z ismimni o'z ichiga olgan cookie-faylni tahrir qilganimda, sayt ismning to'g'riligini tasdiqlamadi, balki ma'lumotlarni ko'rsatdi. Men IDni ham o'zgartirishim mumkin edi. Oxir-oqibat men administrator identifikatorini (001) topdim va administratorga ruxsat oldim.

Seanslar

Seanslar serveringizda saqlangan foydalanuvchi identifikatsiya o'zgaruvchilari. Cookie-fayllardan farqli o'laroq, foydalanuvchilar ularni to'g'ridan-to'g'ri o'zgartira olmaydi, lekin shu bilan birga, xavf hali ham mavjud. Seanslar uchun ikkita asosiy tahdid mavjud: sessiyani o'rnatish va sessiyani o'g'irlash.

Seansni yozib olish

Seans fiksatsiyasi foydalanuvchilar allaqachon o'rnatilgan seansga ulanganda va o'z ma'lumotlarini u erga yuklaganda sodir bo'ladi. O'rnatilgan seansga kirish orqali tajovuzkor ushbu seansga tashrif buyurishi va foydalanuvchilar tomonidan kiritilgan ma'lumotlarni olishi mumkin. Oddiy misol, allaqachon o'rnatilgan sessiya identifikatoriga ega veb-saytga havolani kuzatishdir. Masalan, http://www.example.com/?PHPSESSID=1234. Buzg'unchi endi ma'lumotlaringizni ko'rish uchun bir xil PHPSESSID dan foydalanadi.

Seansni o'g'irlash

Sessiyani o'g'irlash hujumning ikkinchi turi bo'lib, undan himoyalanish ancha qiyin. Bunday holda, tajovuzkor paket (ma'lumotlar) tahlili va boshqa turli usullar orqali seans identifikatoringizni egallashi mumkin. Misol uchun, tarmoqqa ulangan buzg'unchi routeringizga yuborilgan barcha ma'lumotlarni filtrlashi mumkin. Seans identifikatoringizni olganingizdan so'ng, tajovuzkor barcha ma'lumotlaringizga kirish uchun ushbu identifikatorga tashrif buyurishi mumkin.

Seanslardan samarali foydalanish

Ushbu qo'llanma ro'yxatga olish skriptini kodlash jarayonini qamrab olmaydi. Biroq, joriy kirish skriptingizni qanday qilib xavfsizroq qilish kerakligini ko'rsatishga harakat qilaman.

Umuman olganda, seanslardan foydalanish cookie-fayllardan ko'ra xavfsizroqdir. Buning sababi, foydalanuvchilar seans qiymatlarini cookie-fayllarni o'zgartirishi kabi osonlik bilan o'zgartira olmaydi. Shuning uchun men barcha foydalanuvchi o'zgaruvchilarini sessiya o'zgaruvchilarida saqlashni yaxshi ko'raman. Yana bir muhim jihat shundaki, foydalanuvchi kiritishiga hech qachon ishonmaslik. Har doim foydalanuvchi ma'lumotlarini MYSQL ma'lumotlar bazasidagi qiymatlar bilan tekshiring va keyin seansga mos ravishda chiqaring. Roʻyxatdan oʻtish funksiyasiga quyidagi oʻzgartirishlar kiritishni koʻrib chiqing:

funktsiya login ($username, $password)
$sql = mysql_query("ID, user_level FROM foydalanuvchilar FROM password = "" . $parol . "" VA foydalanuvchi nomi = "" . $foydalanuvchi nomi. "" LIMIT 1");
// Agar mos kelmasa, foydalanuvchi nomi va parol mos kelmaydi
if($sql === noto'g'ri)
{
yolg'onni qaytarish;
}
boshqa
{
while($u = mysql_fetch_array($sql))
{
session_regenerate_id (rost);
$session_id = $u;
$session_username = $username;
$session_level = $u;

$_SESSION["user_id"] = $session_id;
$_SESSION["user_level"] = $session_level;
$_SESSION["user_name"] = $session_username;
$_SESSION["user_lastactive"] = vaqt();
haqiqatni qaytarish;
}
}

Keling, ushbu kodni tahlil qilaylik. U foydalanuvchi nomi va parolni so'raydi va ushbu ikkala mezonga mos keladigan foydalanuvchi bor-yo'qligini tekshiradi. Natija bo'lmasa, noto'g'ri foydalanuvchi nomi/parol birikmasi yaratiladi va xatolik yuzaga keladi. Aks holda, sessiya o'zgaruvchilari yaratiladi: user_id, user_level, user_name va user_lastactive. Ushbu qiymatlar MySQL ro'yxatidagi ma'lumotlar bilan to'ldirilgan.

“session_regenerate_id(true)” funksiyasi nimani anglatishini qiziqtirgandirsiz. Avvalroq biz sessiyani fiksatsiya qilish haqida gapirgan edik. Ushbu yechim ushbu turdagi hujumdan himoya qilish uchun mo'ljallangan. Funktsiya foydalanuvchi har safar tizimga kirganida yangi seans identifikatorini yaratadi. Shunday qilib, agar foydalanuvchi sessiya qiymati oʻrnatilgan havolani bossa, yangi seans identifikatori yaratiladi va foydalanuvchi maʼlumotlari eski seansga emas, balki yangi seansga qoʻshiladi. Ushbu funktsiya orqali to'g'ri parametr (haqiqiy) o'tkazilganda, u eski seansni o'chiradi va barcha ma'lumotlarni o'chiradi.

"Meni eslab qolish" funksiyasini yozish

Cookie fayllari yoki sessiya fayllari foydalanuvchi parollarini o'z ichiga olmaydi. Bu juda muhim, chunki seans fayli yoki cookie-fayl ushlanib qolsa, tajovuzkor barcha hisoblar ustidan toʻliq nazoratni qoʻlga kiritishi mumkin. Ma'lumki, ko'plab foydalanuvchilar turli akkauntlarda bir xil paroldan foydalanadilar va bu tajovuzkorga boshqa saytlardagi foydalanuvchi hisoblarini nazorat qilish imkonini beradi. Qanday qilib biz bu qiyin vaziyatdan chiqa olamiz?

Ushbu muammoni hal qilish kirish avtorizatsiya kalitidir (auth_key). Kirish avtorizatsiya kaliti birlashtirilgan va shifrlangan foydalanuvchi nomi, parol va tasodifiy belgilar to'plamining kombinatsiyasi bo'lishi mumkin. Har bir foydalanuvchi o'zining noyob kirish avtorizatsiya kalitiga ega bo'lishi kerak. Shunday qilib, cookie fayli o'rnatilganda, qiymat kirish avtorizatsiya kalitiga o'rnatiladi. Shundan so'ng, kirish avtorizatsiya kalitining qiymati siz qo'shgan MySQL ro'yxatidagi qiymat bilan taqqoslanadi. Keling, foydalanuvchining kirish xususiyati qanday o'zgarishini ko'rib chiqaylik.

account_active = rost; // Foydalanuvchi cookie-faylda qayd saqlanishini xohlashini tekshiring if($remember) ( // Har bir tizimga kirish uchun yangi autentifikatsiya kalitini yarating (shuning uchun, agar // cookie-fayl o'g'irlangan bo'lsa, eski autentifikatsiya kaliti bir necha marta ishlatilmaydi) $cookie_auth= rand_string(10) . $username; $auth_key = session_encrypt($cookie_auth); $auth_query = mysql_query("Yangilanish foydalanuvchilar SET auth_key = "" . $auth_key . "" WHERE username = "" . $username . """); setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7, "/", "example.com", false, true) ) // Session_regenerate_id(true)ga oʻzgaruvchilarni tayinlash; $session_id = $u; $session_username = $username; $session_level = $u; $_SESSION["user_id"] = $session_id; $_SESSION["user_level"] = $session_level; $_SESSION["user_name"] = $session_username; $_SESSION["user_lastactive"] = vaqt(); haqiqatni qaytarish; ))) ?>

Endi u "true" parametri login funksiyasining eslab qolish parametridan o'tganligini tekshiradi. Ha bo'lsa, kirish avtorizatsiya kaliti uchun cookie fayli o'rnatiladi. Rand_string funktsiyasi u orqali o'tgan belgilar soniga ega satr hosil qiladi. Session_encrypt funktsiyasi zanjirga ixtiyoriy ma'lumotlarni qo'shadi va md5 yordamida barcha ma'lumotlarni shifrlaydi. Bu zanjir noyobdir, chunki u har bir foydalanuvchi uchun noyob foydalanuvchi nomidan foydalanadi. Mysql ro'yxatidagi kirish avtorizatsiya kaliti keyin cookie-faylga kiritilgan qiymatga o'rnatiladi. Biroq, bu himoya saytingiz uchun etarli bo'lmasligi mumkin. Bir nechta kirish avtorizatsiya kalitlari va bir nechta cookie fayllarini qo'shishni o'ylab ko'ring. Shunga qaramay, bu funktsiya "meni eslab qolish" funktsiyasi talablariga javob bermaydi. Bundan tashqari, ishga tushirish funktsiyasini qo'shishingiz kerak.

Ushbu funktsiyaga har bir sahifada kirish kerak. Uning maqsadi cookie-fayllarga kirish avtorizatsiya kalitini (“auth_key”) tekshirishdir. Agar cookie isset funksiyasidan foydalansa, tegishli foydalanuvchi paydo bo'ladi. Yana bir bor, ushbu funktsiyaga har bir sahifada kirish kerak.

Bu kod isset funksiyasidan foydalanilganligini tekshiradi. Agar ushbu funktsiya cookie fayli tomonidan ishlatilsa, kirish avtorizatsiya kaliti foydalanuvchi bilan mos kelishi tekshiriladi. Agar mos keladigan bo'lsa, fayl kerakli ma'lumotlarni chiqaradi va foydalanuvchini ro'yxatdan o'tkazadi. Aks holda, cookie fayli oʻchiriladi, chunki u yaroqsiz.

Boshqa xususiyatlar

= $currenttime)( // Yangi foydalanuvchining oxirgi faol vaqtini o'rnating $_SESSION["user_lastactive"] = $currenttime; ) else ( // Agar sessiya juda uzoq vaqt davomida faol bo'lmagan bo'lsa tizimdan chiqish(); ) ) ) ) ?>

Chiqish xususiyati o'z-o'zidan tushunarli. Bu funksiya barcha seans oʻzgaruvchilari va cookie-fayllarni oʻchirib tashlaydi va foydalanuvchining kirish avtorizatsiya kalitini 0 ga oʻrnatadi. Shundan soʻng kirish avtorizatsiya kalitidan endi foydalanib boʻlmaydi. Shuni ta'kidlash kerakki, foydalanuvchi o'z cookie-faylini 0 ga o'rnatishi va hali ham foydalanuvchi nomi bilan tizimga kirishi mumkin. Buni tuzatish uchun cookie-fayllardan olingan barcha ma'lumotlarni tekshiring. Regexp funksiyasidan foydalanib, satrda toʻgʻri sonli belgilar borligiga ishonch hosil qiling, toʻgʻri belgilar bor va hokazo. Keepalive() funksiyasi sessiyani jonli ushlab turadi. Ushbu funktsiya har bir sahifada bo'lishi kerak.

Xulosa va sessiyani o'g'irlash

Sessiyani o'g'irlashdan himoya qilish juda qiyin. Siz identifikatsiya teglarini yaratish uchun foydalanuvchining IP manzili yoki User Agent jarayoni kombinatsiyasidan foydalanish bo'yicha ba'zi maslahatlarni o'qigan bo'lishingiz mumkin. Biroq, bu sizning haqiqiy foydalanuvchilaringiz uchun samarali emas. Foydalanuvchining IP manzillari doimiy ravishda o'zgarib turadi. AOL kabi yirik Internet-provayderlar ularni bir necha daqiqada o'zgartiradilar. Bu katta muammo yaratadi. Foydalanuvchi agenti jarayonlari ham o'zgaradi - IE7 foydalanuvchi agentlari vaqti-vaqti bilan o'zgarib turishini aniqladi. Tutib qolishdan himoya qilishning eng yaxshi usuli tayoqcha tizimini yaratishdir. Ushbu tizim har bir yuklash sahifasida cookie faylini chiqaradi va bu qiymatni MySQL ro'yxatida saqlaydi. Keyin cookie qiymati MySQL jadval qiymati bilan taqqoslanadi. Agar ular boshqacha bo'lsa, sessiya bekor bo'ladi.

Bular seans fayllari va cookie-fayllar bilan ishlash uchun asosiy funksiyalardir. Albatta, xavfsizlikni yaxshilash uchun ma'lumotlarning haqiqiyligini tekshirish uchun ko'proq cookie-fayllarni qo'shish kerak. Ushbu himoya darajasi nozik ma'lumotlarni himoya qilish uchun etarli emas, lekin siz biron bir joydan boshlashingiz kerak! Va xulosa qilib:

Iltimos, cookie-fayllar qiymatlari haqiqiy ekanligiga ishonch hosil qiling.
Hech qachon sessiya parolini yoki cookie o'zgaruvchisini chiqarmang.

Seans fiksatsiyasini oldini olish uchun identifikatordan foydalaning
session_regenerate_id.

Keyingi darslargacha!

P.S. Koddagi sharhlarni 24 soat ichida tarjima qilaman :)

Bugungi darsimizda PHP da cookie-fayllar bilan ishlash haqida gaplashamiz. Keling, bu nima, nima uchun kerak va nima uchun birinchi navbatda paydo bo'lganidan boshlaylik.

Cookie-fayllar nima uchun ishlatiladi?

Siz va men allaqachon bilganimizdek, PHP da biz GET va POST so'rovlari bilan ishlashimiz mumkin. Ular kodning ishlashiga qandaydir tarzda ta'sir qilish uchun bizga ma'lumotlarni serverga uzatishga imkon beradi. Biz skriptga login va parolni berishimiz mumkin, u ularni tekshiradi va bizga har qanday ma'lumotga kirish imkonini beradi. Biroq, bu biz va server o'rtasida seans yaratishga imkon bermaydi. Ya'ni, server bizni "eslab qololmaydi" va har safar biz bu biz ekanligimizni aytmoqchi bo'lsak, login va parol bilan alohida yangi so'rov yuborishimiz kerak bo'ladi.

Cookie fayllari yechim sifatida ixtiro qilingan. Bular PHPdagi massiv kabi kalit-qiymat turiga ega yozuvlardir, lekin ular sayt foydalanuvchisi brauzerida saqlanadi. Cookie fayllari har bir sayt uchun alohida saqlanadi. Har safar foydalanuvchi saytga so'rov yuborganida, brauzer ushbu sayt uchun ushbu yozuvlar mavjudligini tekshiradi. Va agar ular mavjud bo'lsa, ularni har bir so'rovning sarlavhasida ushbu saytga yuboradi.

Cookie-fayllar qayerdan keladi?

Cookie-fayllar serverning "so'rovi" bo'yicha brauzerda yaratiladi. Bir nuqtada, biz tashrif buyuruvchi brauzerida qandaydir qiymatga ega bo'lgan cookie faylini yaratishimiz kerak deb qaror qildik. Buning uchun server mijozga javobda ushbu sayt uchun brauzerda qanday yozuvni yaratish kerakligini ko'rsatadigan maxsus sarlavhani yuborishi kerak.

Bularning barchasi fonda sodir bo'ladi va foydalanuvchi uchun sezilmaydi. Har qanday veb-saytda avtorizatsiya ushbu tamoyilga muvofiq ishlaydi. Eng oddiy holatda, saytga login va parolingizni kiritganingizdan so'ng, server ularning to'g'riligini tekshiradi. Va agar shunday bo'lsa, server brauzerdan ushbu ma'lumotlarni cookie-faylda saqlashni va har bir so'rov bilan uni yuborishni so'rashi mumkin.

Ya'ni, server taxminan shunday deydi: "Hey, brauzer, men uchun "login" kaliti va "admin" qiymati bilan va "parol" kaliti va "123" qiymati bilan boshqa yozuv yarating. Shundan so'ng, brauzer qo'shimcha ma'lumotlarni yuborishni boshlaydi, masalan:

Login: admin paroli: 123

Shundan so'ng, avtorizatsiya talab qilinadigan saytning boshqa joylarida foydalanuvchini formani qayta to'ldirishga majburlamasdan, ushbu ma'lumotlarni cookie-fayllardan tekshirish mumkin bo'ladi. Va agar ular to'g'ri login va parol bo'lsa, foydalanuvchiga biror narsaga kirish huquqini bering.

Hayot vaqti haqida

Shu bilan birga, cookie faylida TTL (Yashash vaqti) mavjud. Ya'ni, bu yozuvlar vaqtinchalik bo'lishi mumkin. Brauzerda cookie fayli o'rnatilganda bu xizmat muddati server tomonidan ham ko'rsatiladi. Buning yordamida siz sessiyani yarim soat davom ettirishingiz mumkin. Va bu vaqtdan keyin foydalanuvchi yana tizimga kirishi kerak bo'ladi. Siz buni ko'plab veb-saytlarda amalda payqagandirsiz.

PHP da cookie-fayllar bilan qanday ishlash kerak

Shunday qilib, biz cookie fayllari qanday ishlashi haqida asosiy tushunchaga egamiz. Keling, PHP da ular bilan qanday ishlashingiz mumkinligini ko'rib chiqamiz.

Loyihamizda viewCookies.php nomli fayl yarataylik. Unga quyidagi kodni joylashtiramiz.

Siz allaqachon taxmin qilganingizdek, $_COOKIE PHPda massivlarga o'xshash yana bir global massivdir $_GET Va $_POST. Faqat u joriy so'rovning bir qismi sifatida brauzer tomonidan yuborilgan barcha cookie fayllarini saqlaydi.

Brauzerda sahifani ochish orqali ushbu skript qanday ishlashini ko'rib chiqamiz: http://myproject.loc/viewCookies.php

Ko'rib turganimizdek, bu massiv hozirda bo'sh. Keling, to'ldiramiz :) Buning uchun brauzerda qandaydir cookie faylini o'rnatishimiz kerak. PHP da bu funksiyadan foydalaniladi setcookie($name, $value, $ttl, $path)

O'tkazilgan parametrlar:

  • $name - kuki nomi
  • $ qiymat - uning qiymati
  • $ttl - umr bo'yi. Agar siz 0 ni belgilasangiz, cookie abadiy o'rnatiladi (u o'chirilgunga qadar).
  • $path - manzillar panelidagi yo'l. Agar siz "/" ni belgilasangiz, cookie-fayllar saytdagi barcha kataloglardan mavjud bo'ladi. Masalan, http://myproject.loc/ va http://myproject.loc/posts/ da. Agar siz “/posts/” ni o‘rnatsangiz, cookie-fayllarga faqat http://myproject.loc/posts/ katalogidan va uning barcha quyi kataloglaridan (masalan, http://myproject.loc/posts/new/) kirish mumkin bo‘ladi. Standart qiymat cookie fayli o'rnatilgan joriy katalogdir. Agar biz cookie fayli butun sayt bo'ylab mavjud bo'lishini istasak, bu qiymatni "/" ga o'rnatishimiz kerak.

Yana bir nechta parametrlar mavjud, ular haqida rasmiy hujjatlarda o'qishingiz mumkin.

Keling, ushbu funktsiyani amalda sinab ko'raylik. Keling, setCookies.php nomli fayl yaratamiz va unga quyidagi kodni yozamiz:

Shundan so'ng, http://myproject.loc/setCookies.php saytiga o'ting, u erda biz bo'sh sahifani ko'ramiz. Yuqorida aytib o'tganimizdek, cookie-fayllar bilan ishlash foydalanuvchiga ko'rinmaydi.

Biroq, bu ishni har doim Google Chrome dasturchi konsolida ko'rish mumkin. Keling, uni ochamiz (F12 tugmachasini bosib), Tarmoq yorlig'iga o'tamiz, brauzerda sahifani yangilaymiz va uni yuklab olingan ma'lumotlar ro'yxatidan topamiz (u erda yagona).

Ushbu yozuvni bosing va o'ng tomonda ochilgan oynada Sarlavhalar yorlig'ini tanlang. Bu erda, Javob sarlavhalari bo'limida biz ko'rsatgan ma'lumotlar bilan Set-Cookie sarlavhasini ko'rishimiz mumkin.

Shunday qilib, cookie-fayllar brauzerda muvaffaqiyatli o'rnatildi. Keling, $_COOKIE massivini ko'rsatadigan sahifamizga o'tamiz - http://myproject.loc/viewCookies.php

Ko'rib turganimizdek, brauzerda avval o'rnatilgan cookie fayllari endi serverga yuboriladi. Shuningdek, ularni dasturchi konsolidagi So‘rov sarlavhalari bo‘limiga qarab so‘rovda ko‘rishingiz mumkin.

Agar ma'lum bir sayt uchun brauzerda mavjud bo'lgan barcha cookie-fayllarni ko'rishingiz kerak bo'lsa, ularni xuddi shu Google Chrome dasturchi konsolida ko'rishingiz mumkin. Buning uchun "Ilova" yorlig'iga o'ting, chap ro'yxatdagi "Cookie" bandini va uning ichida bizning saytimizni tanlang.

Barcha cookie fayllari qulay ro'yxatda taqdim etiladi.

Cookie-fayllar haqida yana nimani bilishingiz kerak

Ushbu darsni yakunlash uchun biz cookie fayllari HTTP orqali server javobida sarlavha yordamida o'rnatilishini qo'shishimiz kerak. HTTP protokoli shunday yaratilganki, sarlavha har doim ma'lumotlardan oldin bo'lishi kerak va boshqa hech narsa yo'q. Shuning uchun, setcookie funktsiyasi va HTTP javobidagi sarlavhani o'zgartiradigan PHP-dagi boshqa har qanday funksiyalar har qanday chiqish chiqishidan oldin chaqirilishi kerak.

Siz avval cookie faylini o'rnatishingiz va keyin matnni ko'rsatishingiz mumkin.

Hammasi ajoyib bo'ladi.

Lekin siz matnni (HTTP javobining asosiy qismi) chop eta olmaysiz va keyin cookie-faylni o'rnatishga urinib ko'ring.

Ko'rib turganimizdek, bu xatoga olib keladi. HTTP protokoli shunday ishlaydi. Birinchidan - sarlavha, keyin - tana. Faqat shu yo'l va boshqa yo'l yo'q.

Bir nechta cookie-fayllarni sozlash

Bir nechta cookie-fayllarni o'rnatishdan osonroq narsa yo'q. Buning uchun setcookie funksiyasini bir necha marta chaqirish kifoya.

Ular mijozga muvaffaqiyatli o'tkaziladi.

Biz keyingi darsda cookie-fayllar orqali foydalanuvchilarning to'liq o'zaro aloqasi misolini ko'rib chiqamiz. Bu orada uy vazifamizni bajaramiz.