Програмування на Delphi - обмін досвідом / Cookies - призначення та принципи використання
Cookies - призначення та принципи використання
Отже, варто почати з відповіді на питання "що таке cookies". Cookies - це деяка текстова інформація, яка зберігається браузером на комп'ютері користувача за запитом сервера або за запитом скрипта (або META тега) HTML сторінки. Дана інформація прив'язана до імені сервера і (за бажанням сервера) до конкретного шляху. При наступних зверненнях до сервера, який залишив cookie, відбувається передача цього cookie в особливому полі заголовка HTTP запиту. Очевидно, що для зберігання браузер повинен вести свого роду базу даних на комп'ютері користувача.
В IE ця база даних представлена папкою з файлами, імена яких формуються з імені користувача і імені сервера (наприклад, zaitsev @ yandex [2] .txt). Крім того, в цій папці є індексний файл index.dat.
В Netscape Navigator база даних cookies представлена текстовим файлом з ім'ям cookies.txt, причому один рядок цього файлу відповідає одному запису cookie.
У cookies є кілька типових застосувань:- Організація сесій. Як відомо, стандартний протокол HTTP припускає роботу в транзакціях, тобто WEB сервер отримує HTTP запит, формує і передає заголовок відповіді, потім передаються дані і після завершення передачі з'єднання розривається з ініціативи сервера. Таким чином, постійне з'єднання між клієнтом і сервером відсутній (на відміну від протоколів FTP, TELNET, SMTP, POP3 і т.п.). Це, з одного боку, добре для WEB сервера. А з іншого боку дуже погано і незручно - сервер не пам'ятає про попередні звернення користувачів. Звичайно, частина проблеми вирішується і без cookies - можна, наприклад, зберігати деяку інформацію з тілі WEB сторінки - подивіться, як організована служба Yandex Guru, дуже повчально. Однак застосування cookies дозволяє імітувати сесію, запам'ятовуючи в cookies ознака успішної ідентифікації користувача, його ім'я, настройки і т.п.
- Зберігання параметрів користувача. Приклад - користувач заповнює складну форму на 10-20 полів. Через пару днів він знову звертається до даної сторінки і йому доводиться заповнювати всі знову. Можу навести приклад з моєї практики: я написав обробник протоколів проксі-сервера SQUID, який обробляє протоколи і поміщає статистичну інформацію в Oracle. Статистику можна переглядати через WEB інтерфейс (написаний до слова сказати на JAVA), заповнюючи при цьому форму параметрів, що містить 10 параметрів формування звіту. Зберігання значень, введених користувачем в форму параметрів, в cookies значно спрощує життя користувачеві;
- Здійснення нестандартної ідентифікації користувачів. Після введення імені та пароля сервер привласнює користувачеві якийсь ідентифікатор доступу і залишає на комп'ютері клієнта cookies, який зберігає цей ідентифікатор. При цьому особливо цікаво використовувати cookies без вказівки часу життя - вони не зберігаються на диску і асоційовані тільки з тим вікном браузера, яка прийняла цей cookies. Я використовував цей нехитрий прийом при розробці екзаменатора з WEB інтерфейсом;
- Створення лічильників, рейтингових систем і систем голосування з захистом від накрутки (тобто багаторазового входу або голосування з одного комп'ютера). Я б обдурив таку систему за дві секунди (написавши маленьку програму, яка імітує роботу браузера), а ось звичайному користувачеві обдурити таку систему складніше. Хоча рішення є - знайти на диску cookie і стерти його.
- Варто пам'ятати, що cookies зберігаються в текстовому вигляді і можуть бути проаналізовані або модифіковані користувачем. Отже, не можна використовувати cookies при розробці відповідальних програм (наприклад, інтернет-магазинів) для зберігання важливої інформації;
- Користувач може відключити cookies - в браузері є така можливість. Отже, відключення cookies не повинно спричинити за собою втрату працездатності WEB додатки. Або навпаки, досить легко перевірити, чи дозволені cookies (шляхом створення одного для проби) і заблокувати його роботу при відключених cookies;
- За замовчуванням cookies передаються в незашифрованому вигляді в заголовку HTTP запиту, отже, вони можуть бути перехоплені сніффером. Більш того, деякі проксі-сервера зберігають заголовки запитів і відповідей (і, отже, cookies) в своїх протоколах;
- Браузер не гарантує зберігання cookies протягом заданого терміну. Cookies може бути видалений в будь-який момент як з ініціативи браузера, так і за бажанням користувача до закінчення заданого періоду.
- Наявність cookies на диску дозволяють проаналізувати, які сайти відвідував користувач (точніше, які з залишають cookies сайтів);
- Аналіз cookies іноді дозволяє з'ясувати цікаві подробиці (наприклад, ім'я користувача і пароль до відвідування web ресурсу);
- При роботі в Інтернет з чужого комп'ютера слід пам'ятати, що відвідувані сайти можуть "наслідити", і при необхідності запобігання подібної ситуації відключати cookies або видалити їх після закінчення роботи;
- При розробці своїх WEB проектів не слід тримати в cookies важливу (не кажучи вже про конфіденційну) інформацію;
- Розробнику не слід зловживати розміром cookie - особисто я ніколи не створюю cookie довше 1 кб
- За допомогою передачі параметра Set-Cookie: в заголовку HTTP відповіді. Природно, цей шлях доступний для розробників CGI (чи інших технологій типу сервлетів або ISAPI) або для розробників WEB інтерфейсу управління, вмонтованого в програму;
- За допомогою META тега в заголовку HTML сторінки: & lt META HTTP-EQUIV = "Set-Cookie" CONTENT = "визначення cookies" & gt;
- За допомогою скрипта. Зробити це просто - у об'єкта document є властивість cookie, читання якого повертає cookies, а привласнення - збереження зазначеного значення. Даний шлях особливо цікавий для розробників, які не мають можливості розміщувати на сервері CGI програми.
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 На замітку:- Якщо в параметрі expires вказати дату, свідомо меншу поточної (наприклад, 1970 рік), то це призведе до видалення cookie з вказаним ім'ям. Даний прийом можна з успіхом використовувати для видалення cookie.
- Якщо cookie з вказаним ім'ям існує, то він буде перезаписаний
- У заголовку HTTP відповіді може бути присутнім кілька параметрів Set-Cookie, що дозволяє задати значення декількох cookie відразу
- Кешуючий проксі-сервера теоретично не повинні кешувати параметр Set-Cookie HTTP заголовка. Аналогічно, якщо відповідь містить параметр Cookie, то він обов'язково повинен дійти до сервера.