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:

  1. session_start() — server sessiya ochadi va PHPSESSID cookie yuboradi;
  2. brauzer har so’rovda shu cookie’ni avtomatik qaytaradi;
  3. 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

PHP

$_SESSION — oddiy assotsiativ massiv; farqi shundaki, uning mazmuni so’rovlar orasida saqlanadi.

Tizimga kirish

PHP

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

PHP

Savat sessiyada saqlangani uchun foydalanuvchi sahifalar orasida yursa ham yo’qolmaydi.

Flash xabar

Bir marta ko’rsatilib, keyin o’chadigan xabar:

PHP

POST-Redirect-GET dan keyin “Saqlandi” xabarini ko’rsatish uchun ishlatiladi.

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 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

  1. $_SESSION ga uch kalit yozib, o’qing;
  2. ?? bilan mavjud bo’lmagan kalitni xavfsiz o’qing;
  3. password_hash va password_verify ni sinang;
  4. kirganmi() funksiyasini yozing;
  5. savat mantig’ini sessiyada yig’ing;
  6. 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.
  • $_SESSION oddiy massiv, lekin serverda saqlanadi.
  • Parol password_hash/password_verify bilan; ochiq saqlanmaydi.
  • Kirgandan keyin session_regenerate_id(true).
  • header("Location: ...") dan keyin exit majburiy.
  • Cookie brauzerda va o’zgartirilishi mumkin — muhim narsani unda saqlamang.

Keyingi darsda fayllar bilan ishlash — o’qish, yozish va yuklash.

Bu dars foydali bo'ldimi?

marta ko'rildi