Программирование на Delphi - обмен опытом / Cookies - назначение и принципы использования

© Зайцев Олег 1998-2004
Лучшая портативная техника. Плееры Камеры Телефоны Компьютеры
Покупателям, пришедшим на www.porta.ru по этой ссылке - дополнительная скидка 1%
Железо | Система | WEB | Компоненты | Графика | Ссылки | Мультимедиа | Сети | Прочее | Реестр | Литература

Статистика

Cookies - назначение и принципы использования

Рекомендую:
Главная страница \ WEB программирование \ Cookies - назначение и принципы использования

  • Cookies - назначение и принципы использования

    Cookies - назначение и принципы использования

    Введение Задать вопрос Наверх
    Мне часть задают вопросы, связанные с разработкой WEB серверов или активных расширений WEB сервера, которые прямо или косвенно затрагивают использование cookies. Поэтому я решил написать эту статью и по возможности наиболее полно осветить все вопросы, связанные с cookies.

    Итак, стоит начать с ответа на вопрос "что такое cookies". Cookies - это некоторая текстовая информация, которая сохраняется браузером на компьютере пользователя по запросу сервера или по запросу скрипта (или META тега) HTML страницы. Данная информация привязана к имени сервера и (по желанию сервера) к конкретному пути. При последующих обращениях к серверу, оставившему cookie, происходит передача этого cookie в особом поле заголовка HTTP запроса. Очевидно, что для хранения браузер должен вести своего рода базу данных на компьютере пользователя.

    В IE эта база данных представлена папкой с файлами, имена которых формируются из имени пользователя и имени сервера (например, zaitsev@yandex[2].txt). Кроме того, в этой папке имеется индексный файл index.dat.

    В Netscape Navigator база данных cookies представлена текстовым файлом с именем cookies.txt, причем одна строка этого файла соответствует одной записи cookie.

    Назначение cookies Задать вопрос Наверх
    У cookies есть несколько типовых применений:

    1. Организация сессий. Как известно, стандартный протокол HTTP предполагает работу в транзакциях, т.е. WEB сервер получает HTTP запрос, формирует и передает заголовок ответа, затем передаются данные и после завершения передачи соединение разрывается по инициативе сервера. Таким образом, постоянное соединение между клиентом и сервером отсутствует (в отличие от протоколов FTP, TELNET, SMTP, POP3 и т.п.). Это, с одной стороны, хорошо для WEB сервера. А с другой стороны очень плохо и неудобно - сервер не помнит о предыдущих обращениях пользователей. Конечно, часть проблемы решается и без cookies - можно, к примеру, хранить некоторую информацию с теле WEB страницы - посмотрите, как организована служба Yandex Guru, очень поучительно. Однако применение cookies позволяет имитировать сессию, запоминая в cookies признак успешной идентификации пользователя, его имя, настройки и т.п.
    2. Хранение параметров пользователя. Пример - пользователь заполняет сложную форму на 10-20 полей. Через пару дней он опять обращается к данной странице и ему приходится заполнять все снова. Могу привести пример из моей практики: я написал обработчик протоколов прокси-сервера SQUID, который обрабатывает протоколы и помещает статистическую информацию в Oracle. Статистику можно просматривать через WEB интерфейс (написанный к слову сказать на JAVA), заполняя при этом форму параметров, содержащую 10 параметров формирования отчета. Хранение значений, введенных пользователем в форму параметров, в cookies значительно упрощает жизнь пользователю;
    3. Осуществление нестандартной идентификации пользователей. После ввода имени и пароля сервер присваивает пользователю некий идентификатор доступа и оставляет на компьютере клиента cookies, хранящий этот идентификатор. При этом особенно интересно использовать cookies без указания времени жизни - они не сохраняются на диске и ассоциированы только с тем окном браузера, которое приняло этот cookies. Я использовал этот нехитрый прием при разработке экзаменатора с WEB интерфейсом;
    4. Создание счетчиков, рейтинговых систем и систем голосования с защитой от накрутки (т.е. многократного входа или голосования с одного компьютера). Я бы обманул такую систему в два счета (написав маленькую программу, имитирующую работу браузера), а вот обычному пользователю обмануть такую систему сложнее. Хотя решение есть - найти на диске cookie и стереть его.

    Особенности использования cookies Задать вопрос Наверх

    Cookies и безопасность пользователя Задать вопрос Наверх
    Мне часто приходится читать в Интернет жуткие истории о том, как при помощи cookies злобные хакеры могут проникнуть на компьютер, выполнить format c: и т.п. На самом деле cookies не представляют особой опасности (HTML страница со скриптами и тегами типа IFRAME или OBJECT куда опаснее!). Cookie - это обыкновенные текстовые строчки, хранимые на компьютере в примитивной базе данных. Каждый браузер имеет ограничения, которые задают максимальный размер cookie (обычно 4 кб), общее количество cookie (обычно 300-500) и максимальное количество cookie, хранимых для одного сервера (обычно около 20). Так что вызвать ситуацию DoS за счет переполнения диска при помощи cookie явно не удастся. Однако если речь зашла о безопасности, то следует учесть несколько аспектов:

    Следовательно, следует сделать ряд выводов: Следует учитывать, что при уровне безопасности "Средний" в IE Cookies разрешены, при уровне "Высокий" - запрещены. Можно также включить запрос на сохранение cookies, однако эти запросы будут раздражать Вас при работе в Интернет.

    Создание cookies Задать вопрос Наверх
    Мне на данный момент известно три способа создания cookies:

    1. При помощи передачи параметра Set-Cookie: <определение cookies> в заголовке HTTP ответа. Естественно, этот путь доступен для разработчиков CGI (или иных технологий типа сервлетов или ISAPI) или для разработчиков WEB интерфейса управления, вмонтированного в программу;
    2. При помощи META тега в заголовке HTML страницы: < META HTTP-EQUIV="Set-Cookie" CONTENT=" определение cookies">;
    3. При помощи скрипта. Сделать это просто - у объекта document есть свойство cookie, чтение которого возвращает cookies, а присвоение - сохранение указанного значения. Данный путь особенно интересен для разработчиков, не имеющих возможности размещать на сервере CGI приложения.

    Чтение cookies Задать вопрос Наверх
    При запросе любого ресурса браузер проверяет, нет ли cookies, которые необходимо передать серверу при запросе документа. Если они есть, то в заголовок HTTP запроса включается параметр Cookie: <значения>. WEB сервер анализирует заголовок запроса и при обнаружении параметра Cookie: он создает переменную окружения HTTP_COOKIE и присваивает ей значение параметра из заголовка запроса. При этом следует учитывать, что WEB сервер совершенно не обязан это делать (он может не уметь работать с Cookie, что часто бывает в простейших WEB серверах, или такая возможность может быть заблокирована). Я проводил свои опыты с IIS 4.0, IIS 5.0 и Apache Web Server 1.3.12 под операционной системой AIX, эти сервера прекрасно работают с Cookies. Если браузер обнаружит несколько cookie, то их значения будут переданы через точку с запятой, например: MyCookie1=MyVal1; MyCookie2=MyVal2

    Формат Set-Cookie Задать вопрос Наверх
    Как я писал выше, для установки значения cookies применяется параметр запроса вида:
    Set-Cookie: name=[значение]; path=[путь]; expires=[дата]; domain=[домен]; secure

    Для создания cookies достаточно только указать первый параметр (т.е. имя и значение), остальные параметры являются необязательными.

    Рассмотрим подробнее назначение всех элементов строки описание cookies:
    ПараметрОписание
    name=[значение] Определяет имя и значение cookie. В имени и значении недопустимы пробелы, запятые и точка с запятой, символы перевода строки и возврата каретки. Как показали опыты, точка с запятой действительно недопустима, а вот к пробелам и запятым IE относится лояльно. Однако, как показывает моя практика WEB программирования, лучше всего использовать URL-кодирование значения - при этом недопустимые символы исключены, т.к. заменяются кодами. В качестве имени не следует использовать слова PATH, EXPIRES и DOMAIN.
    path=[путь] Путь, для которого определен cookie. Этот параметр очень полезен для больших WEB серверов и позволяет связать cookie с конкретными страницами или CGI программами, которые используют этот cookie. По умолчанию path = директории текущего документа. Если задать path=/, то этот cookie будет передаваться при каждом запросе к серверу. Это часто бывает удобно, например, если cookie хранит признак того, что пользователь ввел правильный пароль на доступ к серверу
    expires=[дата] Очень важный параметр. Указывает дату, до которой должен хранится данный cookie. Если параметр не указан, то создается cookie особого типа - он не хранится на диске и ассоциирован только с тем окном браузера, которое приняло данные cookie. Этот тип cookie я называю memory cookie (термин естественно неофициальный) и широко использую для примитивной идентификации пользователей, при построении WEB экзаменаторов и т.п. Дата передается в особом формате, пример : Thursday, 14-Feb-2002 18:49:21 GMT. Для упрощения работы с cookie я написал несколько функций, в частности функцию форматирования даты согласно принятому для cookies формату. Эти функции включены в модуль zcookies.pas, который прилагается к примерам.
    domain=[домен] Определение домена, для которого действителен данный cookie. Мне на практике не приходилось использовать этот параметр. Если параметр отсутствует, то берется доменное имя текущего сервера.
    Secure Наличие этого ключевого слова в строке описания cookie сообщает браузеру о том, что данный cookie должен передаваться только через защищенное соединение HTTPS
    На заметку:


    © Зайцев Олег, "Программирование на Delphi - обмен опытом" 1999-2004. При использовании любых материалов данного сайта необходимо указывать источник информации. Дата обновления: 22.11.2004. Сайт размещен на хостинге AGAVA - Хостинг от AGAVA.ru