PHP / Cookie үндэс

Cookie үндэс

Өмнөх хичээлд session-ийг сурсан — хэрэглэгчийн мэдээллийг серверт хадгалдаг. Cookie бол ялгаатай: хэрэглэгчийн браузерт жижиг өгөгдөл хадгалдаг. Сервер cookie тохируулахад браузер тэр өгөгдлийг хадгаллаж, цаашид тухайн сайт руу хийх хүсэлт бүрт автоматаар дагуулж явуулдаг. "Намайг санаарай" товч, хэлний тохиргоо, сайтад зочилсон тоолуур — эдгээр нь бүгд cookie ашиглан хийгддэг.

Cookie нь session шиг HTML-ийн өмнө тохируулагдах ёстой. setcookie() функц нь браузер руу cookie явуулна:

php
<?php
// Үндсэн хэлбэр: нэр, утга, хугацаа
setcookie('хэл', 'mn', time() + 86400); // 1 хоног (86400 секунд)

// Бүрэн параметртэй хэлбэр
setcookie(
    name:     'хэрэглэгч_нэр',
    value:    'Болд',
    expires:  time() + 30 * 24 * 3600, // 30 хоног
    path:     '/',                      // Бүх замд хүчинтэй
    domain:   'example.mn',            // Зөвхөн энэ домейнд
    secure:   true,                     // Зөвхөн HTTPS-ээр дамжина
    httponly: true                      // JavaScript-ээс харагдахгүй
);

echo "Cookie тохируулагдлаа.\n";
// Cookie нь ДАРААГИЙН хүсэлтээс эхлэн унших боломжтой болно
?>

httponly: true нь XSS халдлагаар JavaScript ашиглан cookie хулгайлахаас хамгаалдаг тул нэвтрэлттэй холбоотой cookie-д үргэлж тохируулах хэрэгтэй.

Cookie-г $_COOKIE superglobal-аар уншдаг. Устгахдаа хугацааг өнгөрсөн рүү тохируулна:

php
<?php
// Cookie байгаа эсэхийг шалгаад уншина
if (isset($_COOKIE['хэл'])) {
    $хэл = $_COOKIE['хэл'];
    echo "Хэл: {$хэл}\n"; // Хэл: mn
} else {
    echo "Cookie байхгүй — анхдагч утга ашиглана.\n";
}

// Бүх cookie-г харах (debugging-д хэрэгтэй)
foreach ($_COOKIE as $нэр => $утга) {
    echo "{$нэр} = {$утга}\n";
}

// Cookie устгах — хугацааг өнгөрсөн болгоно
setcookie('хэл', '', time() - 3600);
setcookie('хэрэглэгч_нэр', '', time() - 3600, '/');

echo "Cookie устгагдлаа.\n";
?>

Cookie шинээр тохируулсны дараа тухайн хүсэлтэд $_COOKIE-д байхгүй — зөвхөн дараагийн хүсэлтээс уншдаг. Тиймээс тохируулсан даруй шалгах шаардлагатай бол $_COOKIE[$нэр] = $утга гэж гараар нэмэх хэрэгтэй.

Бодит жишээ — "Намайг санаарай" функц

Нэвтрэлтийн хуудсанд "Намайг санаарай" товч нэмэх нийтлэг хэрэглээ:

php
<?php
session_start();

// Санасан хэрэглэгчийг автоматаар нэвтрүүлэх
if (!isset($_SESSION['нэвтэрсэн']) && isset($_COOKIE['санаx_token'])) {
    $token = $_COOKIE['санаx_token'];

    // Бодит програмд токенийг өгөгдлийн сангаас хайна
    $токенүүд = ['abc123xyz' => ['id' => 1, 'нэр' => 'Болд']];

    if (isset($токенүүд[$token])) {
        $хэрэглэгч = $токенүүд[$token];
        session_regenerate_id(true);
        $_SESSION['нэвтэрсэн']     = true;
        $_SESSION['хэрэглэгч_id']  = $хэрэглэгч['id'];
        $_SESSION['хэрэглэгч_нэр'] = $хэрэглэгч['нэр'];
    }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $нэр      = $_POST['нэр']      ?? '';
    $нууц_үг  = $_POST['нууц_үг'] ?? '';
    $санах    = isset($_POST['санах']);

    // Нэвтрэлт шалгах логик...
    $нэвтрэлт_амжилттай = ($нэр === 'Болд' && $нууц_үг === '1234');

    if ($нэвтрэлт_амжилттай) {
        $_SESSION['нэвтэрсэн']     = true;
        $_SESSION['хэрэглэгч_нэр'] = $нэр;

        if ($санах) {
            // Аюулгүй санамсаргүй токен үүсгэнэ
            $token = bin2hex(random_bytes(32));

            // Бодит програмд токенийг өгөгдлийн санд хадгална
            setcookie('санаx_token', $token, [
                'expires'  => time() + 30 * 24 * 3600,
                'path'     => '/',
                'secure'   => true,
                'httponly' => true,
                'samesite' => 'Strict', // CSRF халдлагаас хамгаална
            ]);
        }

        header('Location: dashboard.php');
        exit;
    }
}
?>
<!DOCTYPE html>
<html>
<body>
<form action="" method="post">
    <input type="text"     name="нэр"      placeholder="Нэр">
    <input type="password" name="нууц_үг"  placeholder="Нууц үг">
    <label>
        <input type="checkbox" name="санах"> Намайг санаарай
    </label>
    <button type="submit">Нэвтрэх</button>
</form>
</body>
</html>

| | Cookie | Session | |---|---|---| | Хадгалах газар | Браузер | Сервер | | Хугацаа | Тохируулсан хэмжээгээр | Браузер хаагдтал (анхдагч) | | Хэмжээ | ~4KB | Хязгаргүй (серверийн санах ой) | | Аюулгүй байдал | Харьцангуй бага | Илүү аюулгүй | | Хэрэглээ | Тохиргоо, санах | Нэвтрэлт, түр өгөгдөл |

php
<?php
// Хэлний тохиргоог cookie-д хадгалах жишээ
if (isset($_POST['хэл'])) {
    $зөвшөөрөгдсөн_хэлнүүд = ['mn', 'en', 'zh'];
    $хэл = in_array($_POST['хэл'], $зөвшөөрөгдсөн_хэлнүүд)
        ? $_POST['хэл']
        : 'mn';

    setcookie('хэл', $хэл, time() + 365 * 24 * 3600, '/');
    $_COOKIE['хэл'] = $хэл; // Энэ хүсэлтэд ч уншигдахын тулд
}

$одоогийн_хэл = $_COOKIE['хэл'] ?? 'mn';
echo "Одоогийн хэл: {$одоогийн_хэл}\n";
?>

Дараагийн хичээлд:

JSON форматтай ажиллах аргыг судална. json_encode() болон json_decode() функцуудыг ашиглан PHP өгөгдлийг JSON болгох, JSON-ийг PHP массив болгон хөрвүүлэх, алдааг зохицуулах жишээнүүдийг үзнэ.