- cookies
- Установка cookies
- setcookie
- Пример простого приложения с cookies
- Установка срока годности cookies
- time
- mktime
- Удаление cookie
- Проблемы безопасности, связанные с cookies
- Установка области видимости cookie
- Шифрование
- Ограничение доступа для доменов
- Отправка cookies по защищенному запросу
- Index php do cook
- Опасность куки
- Авторизация с помощью куки и сессии
cookies
Использование сookies удобно как для программистов, так и для пользователей. Пользователи выигрывают за счет того, что им не приходится каждый раз заново вводить информацию о себе, а программистам сookies помогают легко и надежно сохранять информацию о пользователях.
Определение Cookies — это текстовые строки, хранящиеся на стороне клиента, и содержащие пары «имя-значение», с которыми связан URL, по которому броузер определяет нужно ли посылать cookies на сервер.
Установка cookies
Установка cookies производится с помощью функции setcookie:
setcookie
setcookiestring name [, string value [, expire [, path [, [, ]]]]] Эта функция имеет следующие аргументы: Давайте создадим простой сценарий, подсчитывающий при помощи cookies количество обращений посетителя к странице. В cookie с именем counter будет храниться число посещений страницы пользователем: $counter++setcookie«Вы посетили эту страницу $counter раз» Результат выполнения сценария на рис.: При работе с cookies необходимо учитывать важный момент, заключающийся в том, что cookie надо обязательно устанавливать перед отправкой в броузер каких-либо заголовков, поскольку сами cookies устанавливаются в виде заголовков. Поэтому если установить cookies после какого-либо текста, отправляемого в броузер, то возникнет ошибочная ситуация. Рассмотрим этот вопрос подробнее, для чего модифицируем код, приведенный в листинге, поместив перед установкой cookie текст: Если здесь поместить текст, то возникнет ошибка, так как будет послан заголовок Content-type: text/html. $counter++setcookie«Вы посетили эту страницу $counter раз» Как видно из рис., при выполнении этого сценария выводится сообщение об ошибке: Заметим, что в этих листингах мы обращаемся к переменной $counter, в которой хранится значение cookie, как к глобальной, что требует наличия включенной директивы register_globals. Если эта директива отключена, то значение, хранящееся в cookie можно получить через глобальный массив $_COOKIE[«name»]: $_COOKIE[‘counter’]++setcookie ‘Вы посетили эту страницу ‘.$_COOKIE[‘counter’].’ раз’ Поскольку некоторые пользователи отключают cookie в настройках своих браузеров, для корректной работы, в приложение, использующее cookies, необходимо помещать код, проверяющий включены ли cookies у посетителя, и, если нет, то сообщающий ему о необходимости включить cookie: if header$PHP_SELF?cookie=1» setcookie else if«Для корректной работы приложения необходимо включить cookies» else header > По умолчанию cookies устанавливаются на один сеанс работы с броузером, однако можно задать для них более продолжительный срок существования. Это очень удобное и полезное свойство, поскольку в этом случае пользователю не нужно предоставлять свои данные вновь при каждом посещении сайта. Как уже говорилось, срок годности устанавливается в секундах относительно начала эпохи. В PHP существуют функции time и mktime для работы с датой и временем, позволяющие переводить текущее время в количество секунд с начала эпохи. Функция time просто переводит текущее системное время в количество секунд, прошедших с начала эпохи: Усовершенствованным вариантом функции time является функция mktime: [ [, [, [, [, day [, [, ]]]]]]] Аргумент is_dst этой функции определяет, попадает ли эта дата в период летнего времени и может принимать следующие значения: Примеры установки сроки годности cookies: setcookie$value, time setcookie$value, mktime setcookie$value, mktime Удалить cookie просто. Для этого надо вызвать функцию setcookie и передать ей имя того cookie, который подлежит удалению: Другие установленные cookie при этом не удаляются. Иногда в cookies приходится хранить конфиденциальные данные, и в этом случае разработчик должен позаботиться о том, чтобы информация хранящееся в cookie не была передана третьим лицам. Существует несколько методов защиты информации, хранящейся в cookie: Наилучшим решением является комплексное применение всех этих способов. Поскольку, по умолчанию, доступ к cookie происходит из корневого каталога, это может создать «дыры» в системе защиты, так как cookies становятся доступными в любом подкаталоге этого каталога. Ограничить доступ к cookies для всех страниц, кроме расположенных в конкретном каталоге, к примеру, /web, можно следующим образом: setcookie$value, «/web/» Однако и в этом случае, к примеру, каталоги /web/index.php, /web1/page.html и т. д. будут удовлетворять этому ограничению. Если такое положение также является нежелательным, можно ограничить область видимости cookies до конкретной страницы: setcookie$value, «/web/index.php» Однако и такой способ в полной мере не решает проблему, так как в этом случае доступ к информации, содержащейся в cookie, может получить, к примеру, скрипт /web/index.php-script/anti_cookie.php. Поэтому появляется необходимость в шифровании. Применить шифрование к cookies можно разными способами, рассмотрим один из них: $vector mcrypt_create_ivMCRYPT_MODE_CFBMCRYPT_RAND$key «qwe233jk312jx813893xk312» $cook_name «maks»$cipher mcrypt_encrypt$key, $cook_name, MCRYPT_MODE_CFB, $vectorsetcookie$cipher, «/decrypt.php» Как видно из листинга 10.13, расшифровка cookie проводится при помощи скрипта decrypt.php, код которого приведен ниже: $vector mcrypt_create_ivMCRYPT_MODE_CFBMCRYPT_RAND$key «qwe233jk312jx813893xk312»$decrypt_name mcrypt_ decrypt$key, $username, MCRYPT_MODE_CFB, $vector«$decrypt_name, мы рады видеть вас на нашей страничке!» Для дополнительной безопасности, список доменов, имеющих доступ к cookies, должен быть ограничен. Это можно сделать при помощи следующего кода: setcookie$value, «/web/index.php», «.server.com» При таком ограничении заданной области видимости будут соответствовать домены с именами server.com, myservser.com, php.server.com и т. д., поскольку проверка на допустимость области видимости домена осуществляется по принципу концевого соответствия. Не является излишним для cookie, хранящему секретные данные, разрешить отвечать только на защищенные запросы HTTP, так как в этом случае значительно затрудняется перехват данных, которыми обмениваются клиент и сервер. Для обеспечения защищенного соединения, функции setcookie передается шестой параметр со значением, равным 1: Если Вам нужна частная профессиональная консультация от авторов многих книг Кузнецова М.В. и Симдянова И.В., добро пожаловать в наш Консультационный Центр SoftTime. В параметрах, настройках браузера (у разных браузеров этот сервис устроен по-разному) требуется разрешить или запретить использование кукис. Использование браузера в режиме инкогнито позволяет устанавливать куки только сессионно т.е. на время работы в браузере. После окончания работы браузер следует закрыть. Наличие файлов кукис на вашей машине позволяет манипулировать вашим сознанием. Это может делать как государство так и субъект. Также злоумышленник, получивший доступ на ваш компьютер и нашедший куки, может управлять вашими доступами. Создать на странице 3 ссылки: «Крупный шрифт», «Средний шрифт», «Маленький шрифт». В зависимости от того, по какой ссылке пойдет пользователь, установить размер шрифта, он должен сохраняться и при переходе на другие страницы сайта. Функция setcookie посылает cookie клиенту (пользователю Интернетом) вместе с другими HTTP заголовками. Lorem ipsum ljlj dolor fmtn, amet consectetur adihisicing elit. Установленные в браузер куки действуют не сразу. Для их работы требуется загрузка следующей страницы сайта через массив $_COOKIE. Поэтому для проверки работы этого скрипта требуется перезагрузка страницы. Проверить работу скрипта Style в новом окне. Подтверждение прав пользователя на запрашиваемый ресурс или действие. Происходит в виде обмена заголовками между клиентом и сервером. Создать на сайте главную страницу index.php. Эта страница отправляет неавторизованных пользователей на страницу авторизации. Авторизованные попадают на страницу, которую они посетили в последний раз («А» или «Б»). Пользователь главную страницу index.php не должен видеть. Она — для перенаправления. Для решения задачи используем куки и сессии. Сайт будет состоять из 4-х страниц: Страницы a.php и b.php посетить могут только авторизованные посетители. Главная страница index.php никому не видна. $username — имя пользователя. $remember — булева переменная. Указывает на выбор посетителя автоматически авторизоваться. Код страницы login.php, на которую попадают неавторизованные посетители: Страница a.php для авторизованных пользователей. Если в сессии нет имени пользователя, ищем его в cookies и если находим, то записываем в сессию: Страница b.php для авторизованных пользователей. Почти не отличается от a.php: Главная страница нашего сайта — index.php. Она управляет работой сайта и никому не видна: Проверить работу сайта с входом на сайт в новом окне. Интенсив «Основы программирования» Бесплатный курс по программированию Бесплатный Видеокурс по PHP!
Пример простого приложения с cookies
Установка срока годности cookies
time
mktime
Удаление cookie
Проблемы безопасности, связанные с cookies
Установка области видимости cookie
Шифрование
Ограничение доступа для доменов
Отправка cookies по защищенному запросу
Index php do cook
Опасность куки
php $size = $_GET['size']; setcookie("size", $size); $size = (isset ($_COOKIE['size'])) ? $_COOKIE['size'] : $_GET['size']; ?> Крупный шрифт
Средний шрифт
Мелкий шрифт Авторизация с помощью куки и сессии
php //Сброс авторизации session_start(); setcookie('username', '', time() - 1); setcookie('url', '', time() - 1); unset($_SESSION['username']); unset($_SESSION['url']); ?>
Вход на сайт
Введите имя:
Запомнить меня
php //Точка входа session_start(); if (!isset($_SESSION['username']) && isset($_COOKIE['username'])) $_SESSION['username'] = ($_COOKIE['username']); $username = $_SESSION['username']; //Записываем в куки адрес этой страницы setcookie('url', 'a.php'); if ($username == null) < header("Location: login.php"); exit; >?>
Страница "А"
A и Б сидели на трубе.
Вы вошли как | Выход
php //Точка входа session_start(); if (!isset($_SESSION['username']) && isset($_COOKIE['username'])) $_SESSION['username'] = ($_COOKIE['username']); $username = $_SESSION['username']; //Записываем в куки адрес этой страницы setcookie('url', 'b.php'); if ($username == null) < header("Location: login.php"); exit; >?>
Страница "Б"
А и Б сидели на трубе.
Вы вошли как | Выход
php session_start(); //Авторизация function Login ($username, $remember) < if ($username == '') return false; $_SESSION['username'] = $username;// Запоминаем имя в сессии $_SESSION['url'] = $remember; if ($remember) < setcookie('username', $username, time() + 3600 * 24 * 7);// Запоминаем имя в куки >return true; > //Точка входа //Если пользователь авторизован с запоминанием, // отправляем на последнюю посещенную им страницу if ($_SESSION['username'] && $_SESSION['url']) < header("Location: " . $_COOKIE['url']); exit; >//Если пользователь не авторизован, //а производит авторизацию с запоминанием- на страницу a.php elseif (count($_POST) > 1 && $_POST['remember']) < Login($_POST['username'], $_POST['remember'] == 'on'); header("Location: a.php"); exit; >//Если пользователь не авторизован, //а авторизуется без запоминания - отправляем на страницу b.php elseif (count($_POST) > 0 && $_POST['remember'] == null) < Login($_POST['username'], $remember = false); header("Location: b.php"); exit; >else < header("Location: login.php"); exit; >?>