Сохранение в cookies на php. Setcookie - Посылает cookie

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

Приведем пример использования Cookies на конкретном примере.

Предположим, нам нужно написать счетчик посещения сайта. Нам нужно знать, какое число посещений сайта осуществлялось каждым конкретным посетителем.

Данную задачу можно решить двумя способами. Первый из них заключается в ведении учета IP-адресов пользователей. Для этого нужна база данных всего из одной таблицы, примерная структура которой такая:

Когда пользователь заходит на сайт, нам нужно определить его IP-адрес, найти в базе данных информацию о его посещениях, увеличить счетчик и вывести его в браузер посетителя. Написать обработчик (скрипт) подобной процедуры несложно. Однако при использовании такого метода у нас появляются проблемы следующего характера:

  • Для каждого IP-адреса нужно вести учет в одной таблице, которая может быть очень большой. А из этого следует, что мы нерационально используем процессорное время и дисковое пространство;
  • У большинства домашних пользователей IP-адреса являются динамическими. То есть, сегодня у него адрес 212.218.78.124, а завтра - 212.218.78.137. Таким образом, велика вероятность идентифицировать одного пользователя несколько раз.

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

Теперь понятно, для чего мы можем использовать Cookie - для хранения небольшой по объему информации у клиента (посетителя) сайта, например: настройки сайта (цвет фона страниц, язык, оформление таблиц и.т.д.), а также другой информации.

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

Программирование Cookies

Приступим к программированию Cookies.

Для установки Cookies используется функция SetCookie() . Для этой функции можно указать шесть параметров, один из которых является обязательным:

  • name - задает имя (строк), закрепленное за Cookie;
  • value - определяет значение переменной (строка);
  • expire - время "жизни" переменной (целое число). Если данный параметр не указать, то Cookie будут "жить" до конца сессии, то есть до закрытия браузера. Если время указано, то, когда оно наступит, Cookie самоуничтожится.
  • path - путь к Cookie (строка);
  • domain - домен (строка). В качестве значения устанавливается имя хоста, с которого Cookie был установлен;
  • secure - передача Cookie через защищенное HTTPS-соединение.

Обычно используются только три первые параметра.

Пример установки Cookies:



SetCookie ("Test" , "Value" );

// Устанавливаем Cookie на один час после установки:
SetCookie ("My_Cookie" , "Value" , time ()+ 3600 );

?>

При использовании Cookies необходимо иметь в виду, что Cookies должны устанавливаться до первого вывода информации в браузер (например, оперетором echo или выводом какой-либо функции). Поэтому желательно устанавливать Cookies в самом начале скрипта. Cookies устанавливаются с помощью определенного заголовка сервера, а если скрипт выводит что-либо, то это означает, что начинается тело документа. В результате Cookies не будут установлены и может быть выведено предупреждение. Для проверки успешности установки Cookies можно использовать такой метод:

// Устанавливаем Cookie до конца сессии:
// В случае успешной установки Cookie, функция SetCookie возвращает TRUE:
"

Cookies успешно установлены!

" ;
?>

Функция SetCookie() возвращает TRUE в случае успешной установки Cookie. В случае, если Cookie установить не удается SetCookie() возвратит FALSE и возможно, предупреждение (зависит от настроек PHP). Пример неудачной установки Cookie:

// Cookies установить не удастся, поскольку перед отправкой
// заголовка Cookie мы выводим в браузер строку "Hello":
echo "Hello" ;
// Функция SetCookie возвратит FALSE:
if (SetCookie ("Test" , "Value" )) echo "

Cookie успешно установлен!

" ;
else echo "

Cookie установить не удалось!

"
;
// Выводит "Cookie установить не удалось!".
?>

Cookie установить не удалось, поскольку перед посылкой заголовка Cookie мы вывели в браузер строку "Hello".

Чтение значений Cookies

Получить доступ к Cookies и их значениям достаточно просто. Они хранятся в суперглобальных массивах и $_COOKIE и $HTTP_COOKIE_VARS .

Доступ к значениям осуществляется по имени установленных Cookies, например:

echo $_COOKIE["my_cookie"];
// Выводит значения установленной Cookie "My_Cookie"

Пример установки Cookie и последующего его чтения:

// Устанавливаем Cookie "test" со значением "Hello" на один час:
setcookie ("test" , "Hello" , time ()+ 3600 );
// При следующем запросе скрипта выводит "Hello":
echo @$ _COOKIE [ "test" ];
?>

В рассмотренном примере при первом обращении к скрипту устанавливается Cookie "test" зо значением "hello". При повторном обращении к скрипту будет выведено значение Cookie "test", то есть строка "Hello".

При чтении значений Cookies обращайте внимание на проверку существования Cookies, например, используя оператор isset() . Либо путем подавления вывода ошибок опереатором @

А вот пример, как построить счетчик числа загрузок страницы с помощью Cookies:

// Проверяем, был ли уже установлен Cookie "Mortal",
// Если да, то читаем его значение,
// И увеличиваем значение счетчика обращений к странице:
if (isset ($ _COOKIE [ "Mortal" ])) $ cnt =$ _COOKIE [ "Mortal" ]+ 1 ;
else $ cnt = 0 ;
// Устанавливаем Cookie "Mortal" зо значением счетчика,
// С временем "жизни" до 18/07/29,
// То есть на очень долгое время:
setcookie ("Mortal" ,$ cnt , 0x6FFFFFFF );
// Выводит число посещений (загрузок) этой страницы:
echo "

Вы посещали эту страницу " .@$ _COOKIE [ "Mortal" ]. " раз

" ;
?>

Удаление Cookies

Иногда возникает необходимость удаления Cookies. Сделать это несложно, необходимо лишь вновь установить Cookie с идентичным именем и пустым параметром. Например:

// Удаляем Cookie "Test":
SetCookie ("Test" , "" );
?>

Установка массива Cookies и его чтение

Мы может установить массив Cookies, используя квадратные скобки в именах Cookies , а затем прочитать массив Cookies и значения этого массива:

// Устанавливаем массив Cookies:
setcookie ("cookie" , "Первый" );
setcookie ("cookie" , "Второй" );
setcookie ("cookie" , "Третий" );

// После перезагрузки страницы мы отобразим
// Состав массива Cookies "cookie":
if (isset ($ _COOKIE [ "cookie" ])) {
foreach ($ _COOKIE [ "cookie" ] as $ name => $ value ) {
echo "$name: $value
" ;
}
}
?>

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



<<< Назад Содержание Вперед >>>
Есть еще вопросы или что-то непонятно - добро пожаловать на наш

Всем привет!

Я снова в строю! В последнее время перемены в жизни вынуждают частенько отдаляться от блога, но тем не менее я здесь и никуда не ухожу! Скоро будет ряд очень полезных и познавательных уроков по заработку! Не пропустите! А пока я расскажу о том, как в php работать с куками. Как можно легко создать, удалить или обновить куки в php?

В последующих статьях мы рассмотрим работу куки в WordPress. А пока для общего развития разберем само понятие куки.

Не буду писать банальщину о том, что куки это в переводе печеньки и все такое. Информация эта, на мой взгляд, совершенно бесполезная. Скажу иначе, куки - это какая-то информация, которая хранится в Вашем браузере.

Например, Вы решили проголосовать в опросе. Далее Вы еще раз захотели проголосовать, но вместо принятия голоса вылезает сообщение: "Вы уже голосовали". Казалось бы, на сайте мы не регистрировались, откуда информация, что мы уже голосовали?

Все дело в куках. При голосовании, Вам в браузер добавляется небольшой файлик с информацией о том, что Вы уже голосовали. И при новом голосовании, скрипт на сервере проверяет, есть ли у Вас такой файлик. Если есть - значит Вы уже голосовали. Все просто.

Как создать куки в php?

Создаются куки в php благодаря функции setcookie . Эта функция принимает в себя следующие параметры:

setcookie ("Имя" , "Значение" , "Срок" , "Путь" , "Домен" , "Защита" ) ;

  • Обязательный здесь только один параметр - "Имя".
  • "Значение" указывается значение куки, как уже все догадались.
  • Срок - сколько времени куки будут работать? После окончания срока действия, кука автоматически будет удалена. Срок может быть бессрочным, в случае, если мы не указываем значение "срок". Срок устанавливается только в секундах!
  • Путь - из какого каталога будет доступна кука. (обычно не указывается, и доступна из всех каталогов)
  • Домен - Домен указывается автоматически. В случае, если доступ к куки нужно получать и на поддоменах, можно указать ".сайт". В таком случае кука будет доступна на всех сайтах с адресами: name.сайт
  • Защита - если написано TRUE, тогда куки передаются по шифрованному соединению (ssl).

Создание куки на PHP

Теперь если посмотреть в браузере (я использую mozilla), то мы увидим куку в действии:

Как видите, куки установились ровно на 1 день, с нужным, нам, названием, и нужным значением.

Как обновить куки php?

Предположим нам нужно обновить значение куки. Т.е. название будет то же, но значение или срок действия надо изменить. В таком случае нам опять же понадобится функция setcookie .

Операция ничем не отличается от операции создания куков. Точно так же пишем похожий код, но с измененными данными:

Теперь посмотрим, что содержится в браузере:

Как видите, обновление куки произошло успешно!

Как прочитать\получить куку php?

То, что в браузере отображается кука, это хорошо, но мы ведь ее создаем, чтобы впоследствии использовать в наших скриптах. Так как же получить куку? Для этого существует глобальный массив кук $_COOKIE , в котором находятся вообще все созданные куки. Обратиться к ним легко - достаточно знать имя.

Теперь кука удалится!

Одно важное замечание, о котором никто не говорит. Когда я только начинал изучать программирование, я удалил куку этим способом. Зашел в браузер - кука осталась. Перерыл все форумы - такая проблема часто встречается, но все отвечают мол: "Хм, не знаю, у меня работает". А причина вот в чем - кука удаляется, но не из файлов пользователя. Там она остается. И открывая браузер, Вы ее видите, но если мы обратимся к ней посредством $_COOKIE["wpguru"] , то в результате будет 0. Вот так можно легко проверить, удалена ли кука.

На этом у меня все, в ближайшее время будут выходить еще статьи. Скорей всего я опишу в следующей статьи, какие планы ждут блог, и подробно расскажу про серию статей о заработке. Все будет в онлайн-режиме, т.е. я зарабатываю, и пишу статью. А не просто теорию вещаю.

Так что ждите.

До скорых встреч!

Безопасность является важной составляющей успеха каждого сайта. Тем не менее, неправильное повышение уровня безопасности может привести к увеличению затрат и общему раздражению пользователей. В данном руководстве мы рассмотрим общие проблемы, которые встречаются при работе с файлами сессий и cookies.

Файлы Cookie

Файлы Cookies - способы идентификации пользователя сайтом. Например, сайт создаёт файл cookie с именем: “favorite_color” и значением: “red”. С этого момента всякий раз при посещении сайта будет загружаться файл cookie, и устанавливать, что ваш любимый цвет - красный (“favorite_color” is “red). Это довольно удобно, так как пользователю не приходится каждый раз регистрироваться в системе при посещении сайта. Этот метод используется также в опции “Remember Me”, которая встречается на многих сайтах. Однако этот способ также может создать серьёзные бреши в системе безопасности сайта.

Один пример не подтверждает, какой именно файл cookie вернётся на ваш сайт. После несложного поиска я нашёл веб-сайт со сценарием панели пользователя. Данный сценарий вывел все мои данные входа в систему в файлах cookie и загружал значения каждый раз во время выполнения действия. Например, если я оставлял комментарий, система выдавала любое из моих имён из переменной имён файла cookie. Далее, используя расширение firebug и пару других устройств, я мог не только просматривать эти файлы, но также и редактировать их. Таким образом, всякий раз, когда я редактировал файл cookie содержащий моё имя, сайт не подтверждал правильность имени, а выводил данные. Также я мог изменять свой ID. В конечном итоге я смог найти ID администратора (001) и получить доступ на правах администратора.

Сессии

Сессии - это переменные для идентификации пользователей, хранящиеся на вашем сервере. В отличие от файлов cookie, пользователи не могут изменять их напрямую, но в то же время риск ещё существует. Есть две основные угрозы для сессий: фиксация сессии и перехват сессии.

Фиксация сессии

Фиксация сессии происходит, когда пользователи подключаются к уже установленной сессии и загружают туда свою информацию. Посредством входа в уже установленную сессию злоумышленник может посетить данную сессию и получить информацию, введённую пользователями. Простой пример - пройти по ссылке на веб-сайт с уже установленным идентификатором сессии (session ID). Например, http://www.example.com/?PHPSESSID=1234. Теперь для просмотра вашей информации злоумышленник использует тот же идентификатор PHPSESSID.

Перехват сессии

Перехват сессии - второй вид атаки, от которого гораздо сложнее защититься. В этом случае злоумышленник может завладеть вашим идентификатором сессии посредством анализа пакетов (данных) и иных всевозможных способов. Например, злоумышленник, подключённый к вашей сети, может фильтровать все ваши данные, посылаемые на маршрутизатор. После получения вашего идентификатора сессии злоумышленник может посетить данный идентификатор для получения доступа ко всей вашей информации.

Эффективное использование сессий

В данном руководстве не описывается процесс кодирования сценария регистрации. Однако я постараюсь показать, как сделать более безопасным ваш текущий сценарий регистрации.

В целом использование сессий безопаснее использования файлов cookie. Это объясняется тем, что пользователи не могут изменять значения сессий так же легко, как и значения файлов cookie. Вот почему мне нравится хранить все переменные пользователей в переменных сессий. Другой важный момент - никогда не доверять вводу данных пользователями. Всегда сверяйте информацию пользователя со значениями в базе данных MYSQL и соответственно затем вывод на сессию. Рассмотрите вариант внесения изменений в регистрационную функцию наподобие следующей функции:

function login($username, $password)
$sql = mysql_query("SELECT id, user_level FROM users WHERE password = "" . $password . "" AND username = "" . $username . "" LIMIT 1");
// If there are no matches then the username and password do not match
if($sql === false)
{
return false;
}
else
{
while($u = mysql_fetch_array($sql))
{
session_regenerate_id(true);
$session_id = $u;
$session_username = $username;
$session_level = $u;

$_SESSION["user_id"] = $session_id;
$_SESSION["user_level"] = $session_level;
$_SESSION["user_name"] = $session_username;
$_SESSION["user_lastactive"] = time();
return true;
}
}

Давайте проанализируем данный код. Он запрашивает имя пользователя и пароль и проверяет, существует ли пользователь, у которого совпадают оба этих критерия. Если результат отсутствует, образуется неверная комбинация имя пользователя/пароль и выдается ошибка. В противоположном случае создаются переменные сессии: user_id, user_level, user_name, и user_lastactive. Эти значения заполняются данными из списка mysql.

Возможно, у вас возникнет вопрос, что означает функция “session_regenerate_id(true)”. Ранее мы говорили о фиксации сессии. Это решение предназначено для защиты от данного типа атаки. Функция создаёт новый идентификатор сессии при каждом входе пользователя в систему. Таким образом, если пользователь щёлкнет по ссылке с установленным значением сессии, будет создан новый идентификатор сессии, а информация о пользователях будет добавлена в новую, а не старую сессию. При прохождении верного параметра (true) через данную функцию удаляет старую сессию и стирает всю информацию.

Написание функции “Remember Me”

Файлы cookie или файлы сессии не должны содержать паролей пользователей. Это очень важно, так как в случае перехвата файла сессии или cookie злоумышленник может получить полный контроль над всеми учётными записями. Известно, что многие пользователи используют один и тот же пароль в различных учётных записях, и это позволит злоумышленнику получить контроль над учётными записями пользователей на других сайтах. Как можно выйти из этого затруднительного положения?

Решение данной проблемы - ключ санкционирования доступа (auth_key). Ключом санкционирования доступа может быть связка из имени пользователя, пароля и произвольного набора символов, которые объединяются и зашифровываются. У каждого пользователя должен быть свой уникальный ключ санкционирования доступа. Таким образом, при установке файла cookie значение устанавливается на ключ санкционирования доступа. После этого происходит сравнение значения ключа санкционирования доступа со значением в списке MySQL, которое вы добавите. Давайте посмотрим, как изменится функция входа пользователей в систему.

account_active = true; // Check if user wants account to be saved in cookie if($remember) { // Generate new auth key for each log in (so old auth key can not be used multiple times in case // of cookie hijacking) $cookie_auth= rand_string(10) . $username; $auth_key = session_encrypt($cookie_auth); $auth_query = mysql_query("UPDATE users SET auth_key = "" . $auth_key . "" WHERE username = "" . $username . """); setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7, "/", "example.com", false, true) } // Assign variables to session session_regenerate_id(true); $session_id = $u; $session_username = $username; $session_level = $u; $_SESSION["user_id"] = $session_id; $_SESSION["user_level"] = $session_level; $_SESSION["user_name"] = $session_username; $_SESSION["user_lastactive"] = time(); return true; } } } ?>

Теперь происходит проверка, прошёл ли параметр “true” через параметр запоминания функции входа в систему. Если да, для ключа санкционирования доступа задаётся файл cookie. Функция Rand_string создаёт цепочку с числом символов, которые прошли через неё. Функция Session_encrypt добавляет в цепочку произвольные данные и зашифровывает всю информацию с помощью md5. Данная цепочка является уникальной, так как в ней используется имя пользователя, которое уникально для каждого пользователя. Затем ключ санкционирования доступа в списке mysql устанавливается к значению, вводимому в файл cookie. Как бы там ни было, этой защиты может быть не достаточно для вашего сайта. Рассмотрите возможность добавления нескольких ключей санкционирования доступа и нескольких файлов cookie. Опять-таки, данная функция не соответствует требованиям функции “remember me”. Также необходимо добавить функцию инициализации.

К данной функции необходимо обращаться на каждой странице. Её назначение - проверка ключа санкционирования доступа файла cookie (“auth_key”). Если файл cookie использует функцию isset, появится соответствующий пользователь. Ещё раз, к данной функции необходимо обращаться на каждой странице.

Данный код проверяет, используется ли функция isset. Если данная функция используется файлом cookie, произойдёт проверка соответствия ключа санкционирования доступа с пользователем. Если соответствие установлено, файл извлечёт требуемую информацию и зарегистрирует пользователя. В противном случае файл cookie будет удалён, так как является недействительным.

Другие функции

= $currenttime){ // Set new user last active time $_SESSION["user_lastactive"] = $currenttime; } else { // If session has been inactive too long logout logout(); } } } } ?>

Функция выхода из системы не требует разъяснений. Данная функция удаляет все переменные сессии и файлы cookie и устанавливает значение ключа санкционирования доступа для пользователя на 0. После этого ключом санкционирования доступа воспользоваться будет нельзя. Необходимо отметить, что пользователь может задать значение 0 для своего файла cookie и всё ещё регистрироваться в системе под своим именем. Чтобы это исправить, проверьте всё информацию, получаемую из файлов cookie. Используя функцию regexp, убедитесь, что цепочка содержит действительное количество символов, содержит действительные символы и т. д. Функция keepalive() поддерживает активность сессии. Данная функция должна быть на каждой странице.

Заключение & перехват сессии

Чрезвычайно сложно защититься от перехвата сессии Session Hijacking. Возможно, вы читали некоторые советы по использованию комбинации IP-адреса пользователя или процесса User Agent для создания идентификационных меток. Впрочем, это не эффективно для ваших фактических пользователей. IP-адреса пользователей постоянно меняются. У крупных поставщиков услуг Интернета, таких как AOL, они меняются каждые несколько минут. Это создаст огромную проблему. Процессы User Agent также меняются — установлено, что в IE7 агенты пользователя периодически меняются. Самый лучший способ защиты от перехвата - создать жезловую систему. Данная система выводит файл cookie на каждую страницу загрузки и также хранит это значение в вашем списке mysql. Затем происходит сравнение значения файла cookie со значением таблицы MySQL. Если они разные, сессия будет недействительной.

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

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

Для предотвращения фиксации сессии используйте идентификатор
session_regenerate_id.

До следующих уроков!

П.С. Комментарии в коде переведу в течении суток:)

(PHP 4, PHP 5, PHP 7)

setcookie — Посылает cookie

Описание

Bool setcookie (string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]])

setcookie() задает cookie, которое будет передано клиенту вместе с другими HTTP заголовками. Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта (это ограничение протокола). Это значит, что в скрипте вызовы этой функции должны располагаться прежде остального вывода, включая вывод тэгов и , а также пустые строки и пробелы.

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

Список параметров

Все аргументы, за исключением name , являются необязательными. Если нужно пропустить какой-либо аргумент, можно вместо него поставить пустую строку ("" ). Это не относится к аргументу expire . Так как он принимает значение типа integer, для его замены пустая строка не подходит. Используйте вместо нее ноль (0 ).

Expire

Время, когда срок действия cookie истекает. Это метка времени Unix, то есть это количество секунд с начала эпохи. Другими словами, желательно задавать это время с помощью функции time() , прибавляя время в секундах, через которое срок действия cookie должен истечь. Либо можно воспользоваться функцией mktime() . time()+60*60*24*30 установит срок действия cookie 30 дней. Если задать 0 или пропустить этот аргумент, срок действия cookie истечет с окончанием сессии (при закрытии броузера).

Замечание :

Можно заметить, что expire принимает в качестве значения метку времени Unix, а хранит его в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT . PHP делает внутреннее преобразование автоматически.

path

Путь к директории на сервере, из которой будут доступны cookie. Если задать "/" , cookie будут доступны во всем домене domain . Если задать "/foo/" , cookie будут доступны только из директории /foo/ и всех ее поддиректорий (например, /foo/bar/ ) домена domain . По умолчанию значением является текущая директория, в которой cookie устанавливается.

Домен, которому доступны cookie. Задание домена "www.example.com" сделает cookie доступными в поддомене www и поддоменах более высоких порядков. Cookie доступные низким уровням, таким как "example.com" , будут доступны во всех поддоменах высших уровней, с том числе "www.example.com" . Старые броузеры, следующие устаревшим нормативам » RFC 2109 , могут требовать . перед доменом, чтобы включались все поддомены.

Указывает на то, что значение cookie должно передаваться от клиента по защищенному HTTPS соединению. Если задано TRUE , cookie от клиента будет передано на сервер, только если установлено защищенное соединение. При передаче cookie от сервера клиенту следить за тем, чтобы cookie этого типа передавались по защищенному каналу, должен программист веб-сервера (стоит обратить внимание на $_SERVER["HTTPS"]).

Httponly

Если задано TRUE , cookie будут доступны только через HTTP протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, вроде JavaScript. Эта возможность была предложена в качестве меры, эффективно снижающей количество краж личных данных посредством XSS атак (несмотря на то, что поддерживается не всеми броузерами). Стоит однако же отметить, что вокруг этой возможности часто возникают споры о ее эффективности и целесообразности. Аргумент добавлен в PHP 5.2.0. Может принимать значения TRUE или FALSE .

Возвращаемые значения

Если перед вызовом функции клиенту уже передавался какой-либо вывод (тэги, пустые строки, пробелы, текст и т.п.), setcookie() вызовет отказ и вернет FALSE . Если setcookie() успешно отработает, то вернет TRUE . Это, однако, не означает, что клиентское приложение (броузер) правильно приняло и обработало cookie.

Примеры

Ниже представлено несколько примеров, как отправлять cookie:

Пример #1 Пример использования setcookie()

$value = "что-то где-то" ;

Setcookie ("TestCookie" , $value );
setcookie ("TestCookie" , $value , time ()+ 3600 ); /* срок действия 1 час */
setcookie ("TestCookie" , $value , time ()+ 3600 , "/~rasmus/" , "example.com" , 1 );
?>

Стоит отметить, что значение cookie перед отправкой клиенту подвергается URL-кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie() (работает в PHP 5). Посмотреть содержимое наших тестовых cookie можно, запустив один из следующих примеров:

// Вывести одно конкретное значение cookie
echo $_COOKIE [ "TestCookie" ];
echo $HTTP_COOKIE_VARS [ "TestCookie" ];

// В целях тестирования и отладки может пригодиться вывод всех cookie
print_r ($_COOKIE );
?>

Пример #2 Пример удаления cookie посредством setcookie()

Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом. Это запустит механизм броузера, удаляющий истекшие cookie. В примерах ниже показано, как удалить cookie, заданные в предыдущих примерах:

// установка даты истечения срока действия на час назад
setcookie ("TestCookie" , "" , time () - 3600 );
setcookie ("TestCookie" , "" , time () - 3600 , "/~rasmus/" , "example.com" , 1 );
?>

Пример #3 setcookie() и массивы

Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:

// отправка cookie
setcookie ("cookie" , "cookiethree" );
setcookie ("cookie" , "cookietwo" );
setcookie ("cookie" , "cookieone" );

// после перезагрузки страницы, выведем cookie
if (isset($_COOKIE [ "cookie" ])) {
foreach ($_COOKIE [ "cookie" ] as $name => $value ) {
$name = htmlspecialchars ($name );
$value = htmlspecialchars ($value );
echo " $name : $value
\n" ;
}
}
?>

в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.

Замечание :

Общие замечания:

  • Cookie станут видимыми только после перезагрузки страницы, для которой они должны быть видны. Для проверки, правильно ли cookie установились, проверьте их при следующей загрузке страницы до истечения срока их действия. Срок действия cookie задается в параметре expire . Удобно проверять существование cookie простым вызовом print_r($_COOKIE); .
  • При удалении cookie должны быть заданы те же параметры, что и при установке. Если в качестве значения задать пустую строку или FALSE , а остальные параметры задать соответственно предыдущему вызову, установившему cookie, тогда cookie c заданным именем будет удалено с клиентской машины. Внутренне это выглядит так: cookie присваивается значение "deleted", а срок действия переносится на год в прошлое.
  • Так как установка значения FALSE приведет к удалению cookie, не следует задавать cookie значения булевого типа. Вместо этого можно использовать 0 для FALSE и 1 для TRUE .
  • Cookie можно именовать, как массивы, и они будут доступны в PHP скрипте, как массивы, но на пользовательской машине они будут храниться в виде отдельных записей. Для задания cookie c множеством имен и значений желательно использовать функцию explode() . Не рекомендуется для этих целей использовать функцию serialize() , так как это негативно сказывается на безопасности скрипта.

При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.

В сегодняшнем уроке мы поговорим о работе с cookie в PHP. Начнём с того, что же это такое, для чего это нужно и почему оно вообще появилось.

Для чего нужны cookie

Как мы с вами уже знаем, в PHP мы можем работать с GET- и POST-запросами. Они позволяют нам передавать серверу данные, чтобы как-то повлиять на работу кода. Мы можем передать скрипту логин и пароль, он их проверит и разрешит нам доступ к какой-либо информации. Однако, это не позволит создать сессию между нами и сервером. То есть сервер не может нас «запомнить», и каждый раз, как мы хотим сказать что это мы, придется отправлять отдельный новый запрос с логином и паролем.

В качестве решения придумали cookie. Это такие записи с типом ключ-значение, типа массива в PHP, только хранятся они в браузере у пользователя сайта. Для каждого сайта cookie хранятся отдельно. Каждый раз, когда пользователь обращается с запросом на сайт, браузер проверяет наличие этих записей для данного сайта. И если они имеются, то он отправляет их в заголовке каждого запроса к этому сайту.

Откуда берутся cookie

Cookie создаются в браузере по «просьбе» сервера. В какой-то момент мы решаем, что нужно в браузере посетителя создать cookie с каким-то значением. Для этого нужно чтобы сервер передал в ответе клиенту специальный заголовок, в котором указано, какую запись нужно создать в браузере для данного сайта.

Всё это происходит в фоне и не заметно для пользователя. По этому принципу работает авторизация на любом сайте. В простейшем случае, после того как вы ввели логин и пароль на сайте, сервер проверяет, верны ли они. И если да, то сервер может попросить браузер сохранить эти данные в cookie и при каждом запросе отправлять их ему.

То есть сервер примерно говорит: «Эй, браузер, создай запись для меня с ключом “login” и значением “admin”, и ещё одну с ключом “password” и значением “123”». После этого браузер при любом запросе к серверу начинает отправлять дополнительные данные типа:

Login: admin password: 123

После этого в других местах сайта, где нужна авторизация, теперь можно будет проверить эти данные из cookie, не заставляя пользователя заполнять форму заново. И если они являются верными логином и паролем, то давать пользователю доступ к чему-либо.

Про время жизни

При этом у cookie есть TTL (Time To Live – время жизни). То есть эти записи могут быть временными. Это время жизни так же указывается сервером во время установки cookie в браузер. Благодаря этому можно сделать так, чтобы сессия длилась пол часа. А после этого времени пользователю надо будет авторизоваться снова. Наверняка вы замечали это в действии на многих сайтах.

Как работать с cookie в PHP

Итак, мы в общих чертах разобрались с тем, как работают cookie. Давайте теперь посмотрим, как с ними можно работать в языке PHP.

Давайте создадим в нашем проекте файл с именем viewCookies.php. Поместим в него следующий код.

Как вы уже должны были догадаться, $_COOKIE - это еще один глобальный массив в PHP, аналогично массивам $_GET и $_POST . Только в нём хранятся все cookie, которые были отправлены браузером в рамках текущего запроса.

Давайте посмотрим на работу данного скрипта, открыв в браузере страницу: http://myproject.loc/viewCookies.php

Как мы видим, в данный момент этот массив пуст. Давайте же его наполним:) Для этого нам нужно установить какую-нибудь cookie в браузер. В PHP для этого используется функция setcookie($name, $value, $ttl, $path)

Передаваемые параметры:

  • $name – название cookie
  • $value – её значение
  • $ttl – время жизни. Если указать 0, то cookie будет установлена навсегда (пока её не удалят).
  • $path – путь в адресной строке. Если задать "/", cookie будут доступны из всех директорий сайта. Например, и в http://myproject.loc/ и в http://myproject.loc/posts/ . Если задать "/posts/", cookie будут доступны только из директории http://myproject.loc/posts/ и всех ее поддиректорий (например, http://myproject.loc/posts/new/). По умолчанию значением является текущая директория, в которой cookie устанавливается. Если мы хотим, чтобы cookie была доступна на всём сайте, то нужно устанавливать это значение в "/".

Есть еще несколько параметров, о них вы можете прочитать в официальной документации .

А теперь давайте попробуем эту функцию в деле. Создадим файл setCookies.php и запишем в него следующий код:

После этого перейдём по адресу http://myproject.loc/setCookies.php , где увидим пустую страницу. Как мы уже говорили, работа с cookie не видна пользователю.

Однако, эту работу всегда можно увидеть в консоли разработчика Google Chrome. Давайте откроем её (нажатием F12), перейдём во вкладку Network, обновим страницу в браузере и найдём её в списке загруженных данных (она там одна).

Нажмем на эту запись и в открывшемся справа окне выберем вкладку Headers. Здесь, в секции Response Headers мы можем видеть заголовок Set-Cookie с указанными нами данными.

Таким образом, cookie были успешно установлены в браузере. Давайте теперь перейдём на нашу страничку, выводящую массив $_COOKIE - http://myproject.loc/viewCookies.php

Как мы видим, теперь на сервер передаются cookie, ранее установленные в браузере. Увидеть их можно и в запросе, посмотрев в консоли разработчика секцию Request Headers.

Если вам нужно посмотреть все cookie, которые имеются в браузере для данного сайта - можно посмотреть их в той же консоли разработчика Google Chrome. Для этого перейдем во вкладку Application, выберем в левом списке пункт Cookies, а внутри него наш сайт.

Все cookie будут представлены в виде удобного списка.

Что еще нужно знать про cookie

И в заключение данного урока нужно добавить, что cookie устанавливаются с помощью заголовка в ответе сервера по протоколу HTTP. Протокол HTTP устроен таким образом, что заголовок должен всегда идти перед данными, и никак иначе. Таким образом, функция setcookie и любые другие функции в PHP, изменяющие заголовок в HTTP-ответе, должны вызываться до любого вывода данных.

Можно сначала задать cookie, а затем вывести текст.

Всё прекрасно отработает.

Но нельзя вывести текст (являющийся телом HTTP-ответа), а затем пытаться установить cookie.

Как мы видим, это приведет к ошибке. Так устроен протокол HTTP. Сначала - заголовок, затем - тело. Только так и никак иначе.

Установка нескольких cookie

Нет ничего проще, чем установить несколько cookie. Для этого нужно просто несколько раз вызвать функцию setcookie.

Они успешно будут переданы клиенту.

Пример полноценного взаимодействия с пользователем через cookie мы рассмотрим в следующем уроке. А пока - за домашку.

Понравилась статья? Поделиться с друзьями: