PHP sessiya va cookie
Foydalanuvchi tizimga kirdi — keyingi sahifada uni qanday tanib olamiz? HTTP hech narsani eslamaydi: har so’rov mustaqil. Bu muammoni sessiya hal qiladi.
HTTP eslamaydi
Oqim shunday:
session_start()— server sessiya ochadi vaPHPSESSIDcookie yuboradi;- brauzer har so’rovda shu cookie’ni avtomatik qaytaradi;
- server id bo’yicha saqlangan ma’lumotni topadi.
Sessiyani boshlash
<?php
session_start(); // HAR sahifada, chiqishdan OLDIN
$_SESSION["ism"] = "Aziz";
$_SESSION["rol"] = "admin";
Boshqa sahifada:
<?php
session_start();
echo $_SESSION["ism"] ?? "mehmon";
$_SESSION bilan ishlash
$_SESSION — oddiy assotsiativ massiv; farqi shundaki, uning mazmuni
so’rovlar orasida saqlanadi.
Tizimga kirish
Kirganini tekshirish
<?php
session_start();
function kirganmi(): bool
{
return isset($_SESSION["foydalanuvchi_id"]);
}
function talabQil(): void
{
if (!kirganmi()) {
header("Location: /kirish.php");
exit; // exit MAJBURIY
}
}
talabQil(); // himoyalangan sahifa boshida
exit yozilmasa, header() dan keyin kod davom etadi va maxfiy mazmun
baribir yuboriladi.
Tizimdan chiqish
<?php
session_start();
$_SESSION = []; // 1. ma'lumotni tozalash
if (ini_get("session.use_cookies")) { // 2. cookie'ni o'chirish
$p = session_get_cookie_params();
setcookie(session_name(), "", time() - 42000,
$p["path"], $p["domain"], $p["secure"], $p["httponly"]);
}
session_destroy(); // 3. sessiyani yo'q qilish
header("Location: /");
exit;
Uchala qadam ham kerak: faqat session_destroy() cookie’ni brauzerda
qoldiradi.
Amaliy misol — savat
Savat sessiyada saqlangani uchun foydalanuvchi sahifalar orasida yursa ham yo’qolmaydi.
Flash xabar
Bir marta ko’rsatilib, keyin o’chadigan xabar:
POST-Redirect-GET dan keyin “Saqlandi” xabarini ko’rsatish uchun ishlatiladi.
Cookie
Sessiya ma’lumotni serverda saqlaydi; cookie esa — brauzerda:
<?php
// O'rnatish (chiqishdan OLDIN)
setcookie("til", "uz", [
"expires" => time() + 30 * 24 * 3600, // 30 kun
"path" => "/",
"secure" => true, // faqat HTTPS
"httponly" => true, // JavaScript o'qiy olmaydi
"samesite" => "Lax", // CSRF himoyasi
]);
// O'qish (keyingi so'rovda)
$til = $_COOKIE["til"] ?? "uz";
// O'chirish — o'tgan sanani berish
setcookie("til", "", time() - 3600, "/");
Sessiya va cookie farqi
| Sessiya | Cookie | |
|---|---|---|
| Qayerda | Serverda | Brauzerda |
| Hajm | Katta | ~4 KB |
| Xavfsizlik | Ishonchli | O’zgartirilishi mumkin |
| Umri | Brauzer yopilguncha (odatda) | Belgilangan sanagacha |
| Nima uchun | Kirish, savat, huquqlar | Til, mavzu, “meni eslab qol” |
Xavfsizlik sozlamalari
<?php
// session_start() dan OLDIN
ini_set("session.cookie_httponly", "1"); // JS o'qimasin
ini_set("session.cookie_secure", "1"); // faqat HTTPS
ini_set("session.cookie_samesite", "Lax"); // CSRF
ini_set("session.use_strict_mode", "1"); // o'ylab topilgan id rad etilsin
session_start();
Bu to’rt qator ko’p uchraydigan hujumlarni yopadi.
Amaliy mashq
$_SESSIONga uch kalit yozib, o’qing;??bilan mavjud bo’lmagan kalitni xavfsiz o’qing;password_hashvapassword_verifyni sinang;kirganmi()funksiyasini yozing;- savat mantig’ini sessiyada yig’ing;
- flash xabar funksiyasini yozib, ikki marta o’qing.
6-qadam flash xabarning mohiyatini ko’rsatadi.
Qisqacha xulosa
- HTTP holatsiz — sessiya so’rovlar orasida ma’lumot saqlaydi.
session_start()— har sahifada, chiqishdan oldin.$_SESSIONoddiy massiv, lekin serverda saqlanadi.- Parol
password_hash/password_verifybilan; ochiq saqlanmaydi. - Kirgandan keyin
session_regenerate_id(true). header("Location: ...")dan keyinexitmajburiy.- Cookie brauzerda va o’zgartirilishi mumkin — muhim narsani unda saqlamang.
Keyingi darsda fayllar bilan ishlash — o’qish, yozish va yuklash.