PHP Cookie
PHP cookie — небольшие текстовые файлы на стороне клиента, хранящие данные о поведении и предпочтениях пользователя.
Введение в PHP Cookie
PHP cookie — это небольшие текстовые файлы, хранящиеся на стороне клиента и содержащие данные о поведении и предпочтениях пользователя. Они широко используются для хранения таких сведений, как пользовательские предпочтения, содержимое корзины покупок или идентификаторы сессий.
В этой статье мы рассмотрим основы PHP cookie и способы их реализации на веб-сайте.
Что такое PHP Cookie?
Cookie — это небольшой фрагмент данных, сохраняемый веб-сайтом на устройстве пользователя. В отличие от серверных сессий, cookie хранятся исключительно на стороне клиента, что делает их идеальными для хранения небольших постоянных данных, например предпочтений или токенов отслеживания. PHP создаёт cookie с помощью функции setcookie() и обращается к ним через суперглобальный массив $_COOKIE. Функция setcookie() принимает несколько аргументов: имя cookie, значение, время истечения, путь, домен и флаги безопасности.
Как это работает на практике:
- Сервер отправляет cookie. При вызове
setcookie()PHP добавляет HTTP-заголовок ответаSet-Cookie. Браузер сохраняет cookie. - Браузер отправляет его обратно. При каждом последующем запросе к тому же домену браузер автоматически прикрепляет cookie в заголовке запроса
Cookie. - PHP считывает его. PHP разбирает входящие cookie в массив
$_COOKIE, поэтому вы можете прочитать их при следующей загрузке страницы.
Cookie и сессии
| Cookie | Сессии | |
|---|---|---|
| Где хранятся данные | На клиенте (браузер) | На сервере |
| Переживает перезапуск браузера | Да (если expire в будущем) | Только при постоянном cookie сессии |
| Ограничение размера | ~4 КБ на cookie | Ограничено хранилищем сервера |
| Подходит для | Предпочтений, «запомнить меня», несекретных флагов | Состояния авторизации, конфиденциальных данных |
Используйте cookie для небольших, несекретных данных, которые должны храниться на клиенте. Используйте сессии, когда данные конфиденциальны или велики.
Создание PHP Cookie
Для создания PHP cookie используйте функцию setcookie(). Базовый синтаксис функции setcookie() выглядит следующим образом:
Синтаксис функции PHP setcookie
setcookie(name, value, expire, path, domain, secure, httponly);Где:
name— имя cookievalue— значение, которое нужно сохранить в cookieexpire— время, после которого cookie истечётpath— путь на сервере, в котором cookie будет доступенdomain— доменное имя веб-сайтаsecure— указывает, следует ли отправлять cookie только по защищённому соединению (HTTPS)httponly— указывает, следует ли скрыть cookie от JavaScript (document.cookie), что помогает защититься от XSS-атак
Пример создания PHP cookie:
Простой пример PHP: как добавить cookie
setcookie("user", "John Doe", time() + 3600, "/");Этот код создаёт cookie с именем user и значением John Doe, срок действия которого истекает через один час (time() возвращает текущую метку Unix в секундах, поэтому прибавление 3600 устанавливает срок истечения на час вперёд). Путь "/" делает cookie доступным на всём сайте.
setcookie() отправляет HTTP-заголовок, поэтому должна вызываться до любого вывода — без HTML, пробелов или echo перед ней. Если вывод уже начался, вы получите предупреждение "headers already sent" и cookie не будет установлен. Смотрите headers_sent() для обнаружения этой ситуации.
Современный синтаксис с массивом (PHP 7.3+)
Начиная с PHP 7.3 можно передавать массив параметров вместо позиционных аргументов. Это рекомендуемый способ, поскольку он позволяет задать samesite, который управляет отправкой cookie при межсайтовых запросах (ключевая защита от CSRF):
setcookie("user", "John Doe", [
"expires" => time() + 3600,
"path" => "/",
"secure" => true, // only over HTTPS
"httponly" => true, // not readable by JavaScript
"samesite" => "Lax", // "Strict", "Lax", or "None"
]);Получение PHP Cookie
После создания cookie его значение можно получить с помощью суперглобального массива $_COOKIE. Базовый синтаксис для доступа к значению cookie выглядит следующим образом:
PHP: как получить значение cookie
$_COOKIE['name'];Где name — имя cookie.
Пример получения значения cookie:
PHP: как получить доступ к значению cookie
if (isset($_COOKIE["user"])) {
echo "Welcome back, " . $_COOKIE["user"];
} else {
echo "Welcome, guest!";
}Всегда проверяйте isset() перед чтением cookie. Cookie, установленный в текущем запросе, недоступен в $_COOKIE до следующей загрузки страницы, поскольку браузер отправляет его обратно только при следующем запросе. Чтение только что установленного cookie в том же скрипте ничего не вернёт.
Значения cookie поступают как ненадёжные пользовательские данные — любой может изменить их в своём браузере. Проверяйте и очищайте их перед использованием, например с помощью filter_var(). Никогда не полагайтесь на значение cookie при принятии решений об авторизации.
Обновление PHP Cookie
Для обновления PHP cookie просто создайте новый cookie с тем же именем и новым значением. Время истечения также следует обновить, чтобы cookie продолжал существовать.
Пример обновления PHP cookie:
Пример обновления cookie
setcookie("user", "Jane Doe", time()+3600, "/", "", 0, 0);Этот код обновляет cookie user, устанавливая новое значение Jane Doe и продлевая срок его действия ещё на один час.
Удаление PHP Cookie
Для удаления PHP cookie просто создайте новый cookie с тем же именем и временем истечения в прошлом. Это приведёт к автоматическому удалению cookie с устройства пользователя.
Пример удаления PHP cookie:
Пример удаления cookie
setcookie("user", "", time()-3600, "/", "", 0, 0);Этот код создаёт новый cookie user со временем истечения, которое находится на один час в прошлом. Это приводит к автоматическому удалению cookie с устройства пользователя.
Для удаления cookie необходимо передать тот же path (и domain), который использовался при его создании. Cookie, установленный с путём /account, является другим cookie, нежели установленный с путём /, и очистка неверного пути оставит оригинал нетронутым.
Полный пример: запоминание выбранной темы
Объединяя всё вместе, рассмотрим небольшой скрипт, который позволяет посетителю выбрать цветовую тему и запоминает её между визитами с помощью cookie:
<?php
// 1. Save the choice when the form is submitted
if (isset($_POST["theme"])) {
setcookie("theme", $_POST["theme"], time() + 60 * 60 * 24 * 30, "/"); // 30 days
// Reload so the new cookie is available to $_COOKIE
header("Location: " . $_SERVER["PHP_SELF"]);
exit;
}
// 2. Read the saved choice (default to "light")
$theme = isset($_COOKIE["theme"]) ? $_COOKIE["theme"] : "light";
?>
<p>Current theme: <?= htmlspecialchars($theme) ?></p>
<form method="post">
<button name="theme" value="light">Light</button>
<button name="theme" value="dark">Dark</button>
</form>Обратите внимание, как скрипт выполняет перенаправление после сохранения, чтобы только что установленный cookie был прочитан при следующем запросе, и как htmlspecialchars() экранирует значение перед его выводом. Смотрите раздел обработка форм в PHP для получения дополнительной информации о безопасной обработке данных $_POST.
Преимущества использования PHP Cookie
PHP cookie имеют ряд преимуществ:
- Улучшенный пользовательский опыт: cookie позволяют веб-сайтам хранить пользовательскую информацию, например предпочтения и учётные данные, которые можно использовать для обеспечения более персонализированного опыта.
- Постоянные данные: cookie позволяют веб-сайтам хранить данные на устройстве пользователя, которые сохраняются даже после закрытия браузера или выключения устройства. Это позволяет сайтам запоминать предпочтения пользователя и его учётные данные между несколькими визитами.
- Простота реализации: PHP cookie легко реализовать, и они могут использоваться для хранения самых разнообразных данных, что делает их универсальным инструментом для веб-разработчиков.
Лучшие практики использования PHP Cookie
Для обеспечения наилучшего пользовательского опыта и безопасности важно следовать лучшим практикам при использовании PHP cookie:
- Используйте защищённые соединения: по возможности используйте защищённые соединения (HTTPS) при создании и доступе к cookie. Это поможет защитить данные, хранящиеся в cookie, от перехвата третьими лицами.
- Надёжно храните конфиденциальные данные: не храните конфиденциальные данные, такие как учётные данные или пароли, в cookie. Поскольку cookie хранятся на стороне клиента, они уязвимы для кражи или подделки. Используйте серверные сессии (
$_SESSION) для конфиденциальных данных аутентификации. - Используйте уникальные имена cookie: используйте уникальные и описательные имена для ваших cookie, чтобы избежать конфликтов с другими cookie, используемыми вашим или другими сайтами.
- Ограничьте объём хранимых данных: ограничьте объём данных, хранящихся в cookie, только необходимым минимумом. Большие объёмы данных могут замедлить работу сайта и увеличить риск утечки данных.
Заключение
PHP cookie — мощный инструмент для веб-разработчиков, позволяющий хранить и извлекать данные на устройстве пользователя. Следуя лучшим практикам и принимая во внимание вопросы безопасности, PHP cookie можно использовать для улучшения пользовательского опыта и расширения функциональности сайта.