Как создать и использовать cookie в PHP?php-10

Что такое cookie?

Cookie — это небольшие текстовые данные, которые сервер отправляет браузеру и которые браузер возвращает при последующих запросах. Они используются для:

  • Аутентификации пользователей
  • Хранения настроек
  • Отслеживания сеансов
  • Персонализации контента

Создание cookie

Основная функция для установки:

setcookie(
    name: "user_token",
    value: "abc123",
    expires_or_options: time() + 3600, // Время жизни (1 час)
    path: "/", // Доступно для всего сайта
    domain: "example.com", // Домен
    secure: true, // Только по HTTPS
    httponly: true // Недоступно для JavaScript
);

Параметры функции setcookie:

  1. name - имя cookie (обязательный)
  2. value - значение (строка, до 4KB)
  3. expires - timestamp истечения (0 - до закрытия браузера)
  4. path - путь, где cookie доступны
  5. domain - домен действия
  6. secure - только через HTTPS
  7. httponly - запрет доступа из JavaScript

Чтение cookie

Доступ через суперглобальный массив $_COOKIE:

$token = $_COOKIE['user_token'] ?? null;
if ($token) {
    echo "Найден токен: " . htmlspecialchars($token);
}

Важно:

  • Cookie доступны только в следующих запросах после установки
  • Всегда проверяйте существование ключа
  • Фильтруйте/валидируйте данные из cookie

Удаление cookie

Для удаления установите срок истечения в прошлое:

setcookie("user_token", "", time() - 3600, "/");

Практические примеры

1. Запоминание пользователя

// Установка
setcookie("remember_me", "1", time() + 86400 * 30, "/", "example.com", true, true);

// Проверка
$remembered = isset($_COOKIE['remember_me']) && $_COOKIE['remember_me'] === "1";

2. Языковые настройки

// Установка языка
if (isset($_GET['lang'])) {
    setcookie("site_lang", $_GET['lang'], time() + 86400 * 365, "/");
}

// Получение текущего языка
$language = $_COOKIE['site_lang'] ?? 'en';

3. Безопасное хранение данных

// Установка подписанного cookie
function setSecureCookie($name, $value, $expire) {
    $secret = 'your-secret-key';
    $hash = hash_hmac('sha256', $value, $secret);
    setcookie($name, $value . '|' . $hash, $expire, "/", "", true, true);
}

// Проверка подписи
function getSecureCookie($name) {
    if (!isset($_COOKIE[$name])) return null;

    list($value, $hash) = explode('|', $_COOKIE[$name], 2);
    $secret = 'your-secret-key';

    if (hash_hmac('sha256', $value, $secret) === $hash) {
        return $value;
    }
    return null;
}

Безопасность cookie

  1. HttpOnly - защита от XSS
  2. Secure - передача только по HTTPS
  3. SameSite - защита от CSRF
    setcookie("session", $token, [
        'expires' => time() + 3600,
        'path' => '/',
        'domain' => 'example.com',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'Strict'
    ]);
    
  4. Ограниченный срок жизни
  5. Не храните чувствительные данные - только идентификаторы

Ограничения

  1. Максимальный размер - обычно 4KB на cookie
  2. Ограниченное количество на домен (зависит от браузера)
  3. Пользователь может отключить cookie
  4. Требуется хедер перед выводом любого контента

Резюмируем:

cookie в PHP устанавливаются функцией setcookie(), доступны через $_COOKIE и требуют внимательного отношения к безопасности. Используйте флаги Secure и HttpOnly, ограничивайте срок действия и никогда не доверяйте данным из cookie без проверки.