Php — Непонятности с cookies php


Содержание

Файлы cookie — это небольшие текстовые файлы, которые создаёт браузер в специальной папке по команде PHP программы. Хотя cookie может создать и JavaScript, но в этой статье не об этом. Тут мы будем говорить только о установке cookie через PHP программу.

Файлы cookie содержать в себе информацию в виде пар имя=значение. Например, в cookie можно записать логин и пароль пользователя и хранить их на компьютере клиента, чтобы он в следующий раз не залогинивался заново. Конечно, хранение логина и пароля в cookie не самый безопасный способ, и эти данные лучше хранить используя сессии в PHP, но в качестве примера использования cookie этот случай подойдёт.

PHP программа даёт команду браузеру-клиенту установить cookie используя строку в заголовке ответа. То есть вы должны представлять, как работает интернет, что такое заголовок запроса и заголовок ответа, чтобы понять как работает установка cookie.

Итак, всю информацию о том, какие cookie должен установить браузер, PHP программа отправляет в заголовке ответа.

На самом деле всё очень просто, читаем дальше и смотрим примеры.

Для установки cookie в языке PHP есть функция setcookie() , она и задает cookie, которое будет передано браузеру вместе с другими HTTP заголовками.

Все заголовки, которые создаёт ваш скрипт, должны быть отправлены до того, как ваш скрипт что-то выведет в окно браузера.

Вернёмся к нашей функции. Вот её синтаксис:

bool, string, int в этом синтаксисе ‐ это типы данных. То есть «bool setcookie() » обозначает то, что функций setcookie() возвращает значение булевого типа. Далее, первый и второй аргумент (имя и значение) должны быть типа строка (string), и так далее.

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

  • string имя — имя в паре имя=значение
  • string значение — значение в паре имя=значение
  • int время жизни — время хранения cookie, это метка времени Unix, т.е. желательно задавать это время с помощью функции time() , прибавляя время в секундах, через которое срок действия cookie должен истечь. Также можно воспользоваться функцией mktime() .
  • string путь — путь к директории на сервере, из которой будут доступны cookie.
  • string домен — домен, которому доступны cookie.
  • bool протокол — указывает на то, что значение cookie должно передаваться от клиента по защищенному HTTPS соединению. Если задано TRUE, cookie от клиента будет передано на сервер, только если установлено защищенное соединение. При передаче cookie от сервера клиенту следить за тем, чтобы cookie этого типа передавались по защищенному каналу, должен программист веб-сервера.
  • bool http only — если задано TRUE, cookie будут доступны только через HTTP протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, вроде JavaScript. Эта возможность была предложена в качестве меры, эффективно снижающей количество краж личных данных посредством XSS атак (несмотря на то, что поддерживается не всеми броузерами). Стоит однако же отметить, что вокруг этой возможности часто возникают споры о ее эффективности и целесообразности. Аргумент добавлен в PHP 5.2.0. Может принимать значения TRUE или FALSE.

Только первый параметр обязателен. Если упустить третий параметр, то по умолчанию он будет равным нолю, это значит что cookie исчезнут сразу после закрытия браузера.

Вот пример установки cookie:

Этот пример только устанавливает cookie на компьютер клиента.

Далее мы рассмотрим более содержательные примеры.

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

В PHP-програннме можно определить, прислал браузер cookie или нет очень просто. Они доступны в массиве $_COOKIE .

Давайте усложним прошлый пример:

Когда вы откроете страницу примера в первый раз, то за приветствием ничего не будет. Это потомы что cookie положены на ваш компьютер, но серверу ещё не отправлены.

Хотя в массиве $_COOKIE уже может что-то быть, но тогда эти cookie ложит не наш пример.

Только обновив страницу второй раз вы увидите, что PHP программа получила пару $_COOKIE[message] => welcome .

Обратите внимание, что cookie положены на одну минуту, а это значит что через минуту, если обновить страницу, приветствие опять будет отсутствовать.

Пожалуй вот и всё что касается получения доступа к информации из cookie в PHP.

Чтобы удалить cookie нужно просто поставить их срок жизни в прошедшем времени.

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

Напишем примитивный счётчик просмотра страниц сайта посетителем, используя cookie.

Обратите внимание, что данные в этом примере живут 60 секунд, потом счётчик обнулится.

На этом тема работа с cookie в PHP раскрыта практически полностью.

(PHP 4, PHP 5, PHP 7)

setcookie — Посылает cookie


Описание

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

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

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

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

» RFC 6265 дает конкретные указания, как нужно интерпретировать каждый из параметров setcookie() . name

Значение cookie. Это значение будет сохранено на клиентском компьютере; не записывайте в cookie секретные данные. Значение присвоенное cookie c именем name , допустим, ‘cookiename’, будет доступно через $_COOKIE[‘cookiename’] .

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

Цукерберг рекомендует:  Html - Верстка HTML - писем

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

Путь к директории на сервере, из которой будут доступны 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»] ).

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

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

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

Примеры

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

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

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, заданные в предыдущих примерах:

rasmus/» , «example.com» , 1 );
?>

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

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

// отправка cookie
setcookie ( «cookie[three]» , «cookiethree» );
setcookie ( «cookie[two]» , «cookietwo» );
setcookie ( «cookie[one]» , «cookieone» );

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

Результат выполнения данного примера:

Список изменений

Версия Описание
5.5.0 Атрибут Max-Age теперь добавляется в заголовок Set-Cookie, отправляемый клиенту.
5.2.0 Добавлен параметр httponly .

Примечания

Чтобы иметь возможность отправлять вывод скрипта до вызова этой функции, можно воспользоваться буферизацией. В этом случае весь вывод скрипта помещается в буфер на сервере и остается там, пока вы явно не отправите его броузеру. Управление буферизацией осуществляется функциями ob_start() и ob_end_flush() в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.

Если PHP директива register_globals включена (задано значение on), значения cookie помимо всего прочего будут помещаться в переменные. Для примеров выше будет существовать переменная $TestCookie . Тем не менее, рекомендуется использовать $_COOKIE .

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

  • 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. Начнём с того, что же это такое, для чего это нужно и почему оно вообще появилось.

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

Продолжение урока будет доступно вам
после покупки курса PHP для начинающих

Правильный вывод cookies в php [дубликат]

На данный вопрос уже ответили:

Написал такой код:

Проблема в том, что сначала открывается сайт без этих данных куки. Только после обновлении страницы с куками.
Как делать так, чтобы сразу открылся с куками, без всяких обновлений страниц?

Отмечен как дубликат участниками tutankhamun, user194374, aleksandr barakin, Pavel Parshin, Grundy 24 фев ’16 в 12:28 .

Подобный вопрос задавали ранее и на него уже получен ответ. Если представленные ответы не являются исчерпывающими, пожалуйста, задайте новый вопрос.

2 ответа 2

Функция setcookie() предварительно собирает из своих аргументов строку для HTTP-заголовка Set-Cookie в соответствии с RFC-6265 и в конце делает то же самое, что и конструкция header(‘Set-Cookie’, . ) . Таким образом куки будут переданы браузеру вместе с ответом сервера.

Массив $_COOKIE заполняется на основе данных HTTP-заголовка Cookie , полученного из запроса браузера.

Именно поэтому данных о только-что установленных куках нету в массиве $_COOKIE . Причем идея «чтобы сразу открылся с куками» врядли является удачным решением, поскольку нарушает логику работы кук на стороне сервера. Это может принести немалую головную боль при поддержке продукта с таким «решением».

Если вам нужны данные, которые вы только что записали в куки — берите их из той переменной, которую вы использовали в функции setcookie() . Например можно было бы реализовать это так:

Учебник PHP

Практика

Важное

Регулярки

Работа с htaccess

Файлы, папки

Сессии и куки

Работа с БД

Практика по работе с БД в PHP

Перед чтением см. новые уроки раздела «Важное», которые появились выше.

Практика

Движок PHP

Продвинутые БД

Аутентификация

Практика

ООП и MVC

Абстрактные классы и интерфейсы

Трейты

ООП Магия

Практика

Практика: классы как набор методов


  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс ArrayConvertor
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс TagHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс FormHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс TableHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс SessionShell
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс CookieShell
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс FileManipulator
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс databaseShell TODO cart корзина flash шаблонизатор роутер контроллер кеш логи фалидатор

Cookie (куки) — это способ долговременного хранения данных в браузере пользователя.

К сожалению, в куки можно сохранить только 4 килобайта информации. Кроме того, есть ограничение на количество кук для данного домена.

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

Написать что-то в куки можно с помощью функции setcookie, которая первым параметром принимает имя этой куки, а вторым — значение:

Однако такие куки долго не живут — только до закрытия браузера.

Продлить время жизни куки можно с помощью третьего параметра, который принимает время (конкретную дату) окончания жизни куки в формате timestamp.

Для тех, кто не помнит, что это за формат — напоминаю: это количество секунд, прошедших с первого января 1970 года.

Однако устанавливать конкретную дату ‘смерти’ куки не очень удобно, так как дата установки этой куки всегда разная.

Поэтому третий параметр принято записывать так: настоящий момент времени + N секунд.

Настоящий момент времени в формате timestamp можно получить с помощью функции time. Примеры:

Куки можно прочитать с помощью глобального массива $_COOKIE.

Давайте прочитаем ранее установленную куку test:

Удаляют куки очень хитрым способом — устанавливая дату ‘смерти’ куки на текущий момент времени:

Что вам делать дальше:

Приступайте к решению задач по следующей ссылке: задачи к уроку.

Когда все решите — переходите к изучению новой темы.

Файл cookie часто используется для идентификации пользователя.

Файл cookie — небольшой файл, который внедряется на сервер компьютера пользователя. Каждый раз, когда один и тот же компьютер запрашивает страницу в браузере, он будет отправлять куки. С помощью PHP можно создать и получить значения cookie.

Файл cookie создается с помощью функции setcookie() .

Синтаксис

Исключительный параметр name, необходим. Все остальные параметры являются необязательными.


В следующем примере создается файл cookie с именем «Пользователь» со значением «Андрей Щипунов» . Файл cookie истекает через 30 дней 86400 * 30 . Слеш «/» означает, что файлы cookie доступны на всем веб сайте (в противном случае выберите нужный каталог).

Затем извлекаем значение файла cookie «Пользователь» (используя глобальную переменную $_COOKIE . Также используте функцию isset() , чтобы узнать, установлен ли файл cookie:

Cookie — это набор данных, который создаётся Web-сервером и который отсылается при каждом обращении к серверу. Cookie хранятся в браузере пользователя. Как правило, cookie используется для: сохранения различных настроек, уникальных для пользователя, аутентификации пользователя, различной статистики и других подобных вещей. И о работе с cookie в PHP мы и поговорим в этой статье.

Начнём с простейших вещей: с записи cookie в браузер пользователя. Для этого существует функция setcookie():

После запуска скрипта, Вы сможете посмотреть cookie. Посмотреть их можно следующим образом: либо поискать в настройках браузера, либо поискать прямо на жёстком диске, где хранятся cookie Вашего браузера, либо (самый простой способ) ввести в адресной строке: «javascript:document.cookie«. Только вводите в той же вкладке, в которой Вы запускали скрипт, потому что браузеры отделяют cookie одного сайта от другого.

Теперь встаёт вопрос: «Как вывести cookie?«. Выводятся они с помощью массива $_COOKIE:

В результате, Вы увидите «Value«. Как видите всё элементарно.

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

Дата публикации: 2020-10-18

От автора: в PHP cookie — это текстовые файлы, хранящиеся на компьютере клиента, они сохраняются в целях отслеживания. PHP прозрачно поддерживает HTTP-файлы cookie.

Для идентификации возвращающихся пользователей предусмотрено три этапа:

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

Браузер сохраняет эту информацию на локальном компьютере для будущего использования.

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

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

В этой статье мы расскажем, как устанавливать файлы cookie, как работать с ними и как их удалять.

Файлы cookie обычно устанавливаются в HTTP-заголовке (хотя через JavaScript также можно устанавливать cookie непосредственно в браузере). PHP-скрипт, который устанавливает cookie, может отправлять заголовки, выглядящие приблизительно таким образом:

Как вы можете видеть, заголовок Set-Cookie содержит пару значений имени, дату GMT, путь и домен. Имя и значение будут закодированы в URL-адресе. Поле expires — это инструкция для браузера — «забыть» cookie по истечении заданного времени и даты.

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

После этого скрипт PHP получает доступ к файлу cookie в переменных среды $_COOKIE или $HTTP_COOKIE_VARS[], которые содержат все имена и значения файлов cookie. Сookie можно получить, используя $HTTP_COOKIE_VARS[«name»].

PHP предоставляет для установки файла cookie функцию setcookie(). Для этой функции требуется до шести аргументов, и она должна вызываться до тега html. Для каждого файла cookie эту функцию нужно вызывать отдельно.

Описание всех аргументов —

name — устанавливает имя файла cookie и хранится в переменной среды с именем HTTP_COOKIE_VARS. Эта переменная используется для доступа к файлам cookie.

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

value — устанавливает значение именованной переменной и представляет собой контент, который вы действительно хотите сохранить.

expiry — определяет время хранения cookie в секундах с 00:00:00 по Гринвичу 1 января 1970 года. По истечении этого времени cookie станет недоступным. Файлы cookie удаляются после закрытия браузера.

path — Указывает каталоги, для которых действителен файл cookie. Одиночный символ прямой косой черты задает, что файл cookie является действительным для всех каталогов.

domain — может использоваться для указания имени домена в очень больших доменах и должно содержать не менее двух периодов. Все файлы cookie действительны только для хоста и домена, для которых они созданы.

security. Может быть установлено 1, чтобы указать, что файл cookie должен передаваться только через защищенное соединение HTTPS. В противном случае это значение равно 0, и это означает, что файл cookie может передаваться через обычное соединение HTTP.

В следующем примере мы зададим для cookie name и age, согласно которому эти файлы cookie станут не действительны через час.


Хочу поделиться одной особенностью при установке значений COOKIE, которую очень часто забывают веб-разработчики.
В моей практике исследования веб-приложений на уязвимости, за 2009-2011 года, данная ошибка встретилась в 87% веб-приложений, написанных на PHP.
Чтобы как-то уменьшить данный показатель, решил написать этот текст.

Речь пойдет даже не о httpOnly флаге, хотя его использование не менее важно и обязательно к применению.

Рассмотрим пример кода:

Данный код, очевидно, устанавливает два значения COOKIE с именами foo и foo1.
Теперь главный вопрос — для какого домена и с какими флагами?

Обратимся к первоисточнику — HTTP-ответу веб-сервера:

Как видно, сервер ничего не говорит ни о домене, ни о флагах.
Тогда вопрос переходит в другую плоскость — какой домен и флаги выберет браузер для такого заголовка?

В случае с Chrome (актуальная версия 18.0.1025.168), все будет более чем хорошо и домен будет ровно такой, с которого пришел запрос. В моем примере — foo.bar.com:

Если бы все было так хорошо, наверное, здесь бы не было текста…

Проверим Internet Explorer. Так как красивых плагинов для просмотра COOKIE для него я не знаю, проставим куки для домена foo.com и выведем document.cookie с домена bar.foo.com:

Это очень печально. И забавно с другой стороны.
При получении в НТТР-ответе сервера
Set-cookie: foo=bar
Internet Explorer ставит foo=bar для ВСЕХ поддоменов, то есть *.foo.com в моем примере без всяких флагов, таких как httpOnly.

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

А как же остальные браузеры?

Firefox 12.0 httpOnly wildcard
Safari 5.1.5 httpOnly wildcard
Opera 11.62 httpOnly wildcard

Таким образом, используя конструкции

в случае использования клиентом Internet Explorer (8-9), вы проставляете COOKIE на ВСЕ поддомены от данного.

Уроки PHP.

На предыдущем уроке мы разобрали взаимосвязь протокола HTTP и языка PHP на уровне HTTP заголовков. На этом уроке мы познакомимся еще с одним специфическим HTTP заголовком — cookie.

Что такое cookies?

Дело в том, что в процессе развития www-технологий и внедрения языков программирования в Интернет, перед разработчиками программ возникла очень серьезная проблема — как сохранять результаты выполнения алгоритма для каждого конкретно взятого пользователя на долгое время? Сам по себе протокол HTTP не имеет возможности фиксирования результатов программных процессов. Использование сессий также не является решением проблемы, так как их действие прекращается сразу после разрыва соединения с сервером.

Проблема разрешилась с внедрением механизма cookies (то есть, в переводе с английского, — «печенье»). Cookies обладают замечательным свойством — они сохраняются на винчестере пользователя и могут храниться там практически неограниченное время.

По своей сути cookies — это обычные текстовые файлы, хранящиеся в специальной директории, используемой броузером (обычно эта папка называется Temporary Internet Files ), и вы можете увидеть их, зайдя в эту директорию (быстрый доступ к ней для броузера IE осуществляется через пункты меню Сервис -> Свойства обозревателя -> Временные файлы Интернета -> Настройка -> Просмотр файлов).

Реализация механизма cookies в PHP.

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

Функция имеет следующий синтаксис:

setcookie( имя куки , значение , срок годности, информация о пути, домен, защищенность )

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

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

$data = $name.»||».$surname;
setcookie(«username», $data);

Заметьте, что отсылаемые данные должны быть оформлены в виде строки, попытка прочитать отосланный ранее массив значений ни к чему не приведет.

Cookie, установленная в вышеуказанном примере, будет уничтожена сразу после закрытия броузера пользователем, так как по умолчанию срок жизни cookie устанавливается в ноль. Чтобы изменить этот порядок, необходимо указать третий параметр expire . Определение этого параметра можно произвести двуми способами:

  • Задать отностительный срок действия с помощью функции time() , к которой прибавляется время в секундах для хранения cookie. Например, чтобы определить cookie на два часа необходимо написать:

setcookie(«test 1», «это тестовая куки», time() + 3600 * 2); // 3600 — количество секунд в часе

  • Второй способ — задание абсолютного срока истечения годности cookie. Он устанавливается с помощью функции mktime() , которая возвращает конкретную дату удаления куки. Если необходимо задать срок жизни cookie до полуночи 1 сентября 2003 года, то следует определить cookie так:

setcooikie(«test 2», «куки с абсолютной датой удаления», mktime(0, 0, 0, 9, 1, 2003);

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

setcookie(«test 3, «», 0, «/mus»);

Мы установили куку, пропустив параметры значения и времени и определив область действия всеми путями, начинающимися со строки «/mus», то есть сюда входят и директория «/music/», и «/museums/». Чтобы однозначно определить путь, необходимо завершить путь слешем. То есть для ограничения действия куки каталогом «/mus», необходимо было написать в параметре «/mus/».

Следующим опциональным параметром является параметр определения действия cookie в пределах указанного домена. Причем значению этого параметра «someserver.com» соответствует только сайт с адресом http://someserver.com, а значению «.someserver.com» соответствуют уже и http://someserver.com, и http://mail.someserver.com, и http://my-someserver.com, то есть все домены, кончающиеся данной строкой.

Последний параметр функции setcookie() указывает на то, что данная cookie должна быть послана через защищенное соединение (HTTPS). Этот параметр необходим при установке cookie с конфеденциальными данными.

setcookie(«my_cookie», $value, time() + 3600 * 24 * 5, «/», «.myphp.dem.ru», 1);

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

echo «У вас сохранены следующие данные:
«;
echo $my_cookie;

Обращение к данным, сохраненным в cookie, также может происходить через массив $HTTP_COOKIE_VARS. Он схож с другими подобными массивами, такими как $HTTP_POST_VARS и другими, и содержит все значения, прочтенные из cookie.

Удаление cookie производится отправкой новой cookie с именем удаляемой без каких-либо дополнительных параметров.

$data = $my_cookie;
setcookie(«my_cookie»);
echo «Следующие данные были удалены:
» . $data;

На этом закончим сегодняшний урок. До встречи.

Цукерберг рекомендует:  QA Automation от первого рубля до последнего бага
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих