Cookie үндэс
Өмнөх хичээлд session-ийг сурсан — хэрэглэгчийн мэдээллийг серверт хадгалдаг. Cookie бол ялгаатай: хэрэглэгчийн браузерт жижиг өгөгдөл хадгалдаг. Сервер cookie тохируулахад браузер тэр өгөгдлийг хадгаллаж, цаашид тухайн сайт руу хийх хүсэлт бүрт автоматаар дагуулж явуулдаг. "Намайг санаарай" товч, хэлний тохиргоо, сайтад зочилсон тоолуур — эдгээр нь бүгд cookie ашиглан хийгддэг.
Cookie тохируулах — setcookie()
Cookie нь session шиг HTML-ийн өмнө тохируулагдах ёстой. setcookie() функц нь браузер руу cookie явуулна:
<?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-г $_COOKIE superglobal-аар уншдаг. Устгахдаа хугацааг өнгөрсөн рүү тохируулна:
<?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
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 — харьцуулалт
| | Cookie | Session | |---|---|---| | Хадгалах газар | Браузер | Сервер | | Хугацаа | Тохируулсан хэмжээгээр | Браузер хаагдтал (анхдагч) | | Хэмжээ | ~4KB | Хязгаргүй (серверийн санах ой) | | Аюулгүй байдал | Харьцангуй бага | Илүү аюулгүй | | Хэрэглээ | Тохиргоо, санах | Нэвтрэлт, түр өгөгдөл |
<?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 массив болгон хөрвүүлэх, алдааг зохицуулах жишээнүүдийг үзнэ.