Запись, получение и удаление cookie в PHP. Как избежать проблем с безопасностью?

запись, получение и удаление cookie в php. как избежать проблем с безопасностью?

Запись cookie

HTTP также называют протоколом без сохранения состояния. Веб-сервер сформировав ответ клиенту забывает о нем, а два одинаковых запроса от одного и того же клиента никак не связаны между собой.

Обойти такое поведение можно с помощью записи cookie. Cookie — это небольшой кусочек данных, который передается браузеру в заголовках ответа сервера. Такие данные будут записаны в браузере и переданы на сервер с новым запросом. Этот механизм можно использовать для идентификации пользователя или сохранения информации.

В PHP для записи cookie используется функция setcookie(). Она принимает семь параметров. Однако обязательным является только первый. Параметры условно можно назвать следующим образом «setcookie(name, value, expire, path, domain, secure, httponly)». Внимательно ознакомьтесь с их описанием, представленным ниже.

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

Имя Описание Пример
name Строка, являющаяся идентификатором передаваемых данных. В дальнейшем получить значение конкретного cookie можно с помощью этого идентификатора. user-role
value Сохраняемые данные. Значение может состоять из буквенно-числовых символов общим объемом не более 4Кбайт. admin
expire Время жизни. Устанавливается в виде числового значения в формате timestamp. По истечении указанного времени cookie будет удалена браузером. Если данный параметр отсутствует, то cookie удаляется после закрытия браузера. time() + 86400
path Часть URL-адреса. Cookie будет отправлена серверу в случае совпадения запрошенного URL и указанного в настройках. Если задан путь «/», cookie будет отправляться с каждым запросом. По умолчанию используется путь из URL-адреса запроса. /documents
domain Имя хоста. Cookie будет отправлена серверу в случае совпадения запрошенного домена и заданного в настройках. Например, «.example.com» будет соответствовать и «image.example.com» и «video.example.com», а «image.example.com» отсылается строго для конкретного хоста. image.example.com
secure Устанавливается в виде логического значения. Если параметр задан в true, cookie будет передана только через защищенный HTTPS-протокол. true
httponly Логическое значение, определяющее можно ли получить доступ к cookie из скрипта на стороне браузера. Если установлено в false, содержимое cookie передается только вместе с запросом на сервер. false

Запись cookie в PHP должна быть произведена до любого другого вывода в браузер. Если где-либо в коде уже были вызваны echo или print, функция setcookie() вернет логическое значение false, в противном случае true.

Cookie может быть установлена в любом месте программы, если используется буферизация вывода, о которой мы будет разговаривать в следующих уроках.

//Установка простой cookie
setcookie('favorite-color', 'yellow');

//Определение срока жизни (2 дня)
setcookie('user-identity', '2P18YU7', time() + 172800);

//Задействуем парметры безопасности
setcookie('discounts-key', '59Iwf41', time() + 172800, '/', 'example.com', true, true);

Заметка
Наряду с записью cookie в PHP существует более универсальный механизм сессий, предназначенный для передачи данных между запросами, и хранящий их на сервере. Для каждого пользователя создается отдельный файл, а доступ к нему производится по уникальному идентификатору, хранящемуся в cookie. Сессии будут рассмотрены далее в учебном курсе.

Доступ к cookie

Получить доступ к значению только что установленной cookie можно будет только при следующем запросе пользователя. PHP облегчает этот функционал задействуя суперглобальный массив $_COOKIE.

Все кусочки данных, хранящихся в браузере пользователя, при запросе будут сверены с параметрами их установки и отправлены на сервер. PHP-интерпретатор автоматически поместит их в ассоциативный массив $_COOKIE. Доступ к значениям осуществляется с указанием текстового ключа, который ранее был указан в качестве первого параметра функции setcookie().

//Выводим все cookies, пришедшие с запросом
foreach ($_COOKIE as $name => $value) {
    echo "{$name}: {$value}<br>";
}

Удаление cookie

Единственно возможным способом удаления cookie является её перезапись с указанием времени срока действия на дату в прошлом. Это не является проблемой PHP, такой механизм используется и в других языках программирования.

Обратите особое внимание. Чтобы удаление прошло успешно, вы должны повторить все параметры функции setcookie() использовавшиеся при установке, иначе браузер пользователя решит, что вы хотите задать новую cookie.

//Удаление ранее установленной cookie
setcookie('favorite-color', 'yellow', time() - 172800);

Проблемы безопасности

Как вы могли заметить, при записи cookie есть несколько параметров, ограничивающих условия её применения: путь URL-адреса, домен, время жизни и т.д. Мы настоятельно рекомендуем не использовать значения, принимаемые по умолчанию, а задавать минимально допустимые.

Если вы используете HTTPS-соединение, логичным будет установка параметра secure в значение true. Таким образом, cookie будут отправляться зашифрованными, что предотвратит перехват информации.

Не храните важные данные в cookie, такие как: логин и пароль, паспортные данные, номера телефонов, номера кредитных карт. Эта информация запишется в браузер пользователя, и может быть извлечена с помощью различных методов взлома.

Устанавливайте параметр httponly в значение true. За счет этого скрипт, подключенный к странице из другого источника, не будет иметь доступ к вашим cookies. Это может быть опасным, если в cookie хранится ключ аутентификации на сервере.

Последние публикации