Програмування на Delphi - обмін досвідом / Cookies - призначення та принципи використання

  1. 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 є кілька типових застосувань:
    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 - в браузері є така можливість. Отже, відключення cookies не повинно спричинити за собою втрату працездатності WEB додатки. Або навпаки, досить легко перевірити, чи дозволені cookies (шляхом створення одного для проби) і заблокувати його роботу при відключених cookies;
    • За замовчуванням cookies передаються в незашифрованому вигляді в заголовку HTTP запиту, отже, вони можуть бути перехоплені сніффером. Більш того, деякі проксі-сервера зберігають заголовки запитів і відповідей (і, отже, cookies) в своїх протоколах;
    • Браузер не гарантує зберігання cookies протягом заданого терміну. Cookies може бути видалений в будь-який момент як з ініціативи браузера, так і за бажанням користувача до закінчення заданого періоду.
    Мені часто доводиться читати в Інтернет моторошні історії про те, як за допомогою cookies злісні хакери можуть потрапити до електронної пошти, виконати format c: і т.п. Насправді cookies не уявляють особливої ​​небезпеки (HTML сторінка зі скриптами і мітки на кшталт IFRAME або OBJECT куди небезпечніше!). Cookie - це звичайні текстові рядки, збережені на комп'ютері в примітивній базі даних. Кожен браузер має обмеження, які задають максимальний розмір cookie (зазвичай 4 кб), загальна кількість cookie (зазвичай 300-500) і максимальну кількість cookie, які зберігаються для одного сервера (зазвичай близько 20). Так що викликати ситуацію DoS за рахунок переповнення диска за допомогою cookie явно не вдасться. Однак якщо мова зайшла про безпеку, то слід врахувати кілька аспектів:
    • Наявність cookies на диску дозволяють проаналізувати, які сайти відвідував користувач (точніше, які з залишають cookies сайтів);
    • Аналіз cookies іноді дозволяє з'ясувати цікаві подробиці (наприклад, ім'я користувача і пароль до відвідування web ресурсу);
    Отже, слід зробити ряд висновків:
    • При роботі в Інтернет з чужого комп'ютера слід пам'ятати, що відвідувані сайти можуть "наслідити", і при необхідності запобігання подібної ситуації відключати cookies або видалити їх після закінчення роботи;
    • При розробці своїх WEB проектів не слід тримати в cookies важливу (не кажучи вже про конфіденційну) інформацію;
    • Розробнику не слід зловживати розміром cookie - особисто я ніколи не створюю cookie довше 1 кб
    Слід враховувати, що при рівні безпеки "Середній" в IE Cookies дозволені, при рівні "Високий" - заборонені. Можна також включити запит на збереження cookies, проте ці запити будуть дратувати Вас при роботі в Інтернет. Мені на даний момент відомо три способи створення cookies:
    1. За допомогою передачі параметра Set-Cookie: в заголовку HTTP відповіді. Природно, цей шлях доступний для розробників CGI (чи інших технологій типу сервлетів або ISAPI) або для розробників WEB інтерфейсу управління, вмонтованого в програму;
    2. За допомогою META тега в заголовку HTML сторінки: & lt META HTTP-EQUIV = "Set-Cookie" CONTENT = "визначення cookies" & gt;
    3. За допомогою скрипта. Зробити це просто - у об'єкта document є властивість cookie, читання якого повертає cookies, а привласнення - збереження зазначеного значення. Даний шлях особливо цікавий для розробників, які не мають можливості розміщувати на сервері CGI програми.
    При запиті будь-якого ресурсу браузер перевіряє, чи немає 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 Як я писав вище, для установки значення 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 На замітку:
    • Якщо в параметрі expires вказати дату, свідомо меншу поточної (наприклад, 1970 рік), то це призведе до видалення cookie з вказаним ім'ям. Даний прийом можна з успіхом використовувати для видалення cookie.
    • Якщо cookie з вказаним ім'ям існує, то він буде перезаписаний
    • У заголовку HTTP відповіді може бути присутнім кілька параметрів Set-Cookie, що дозволяє задати значення декількох cookie відразу
    • Кешуючий проксі-сервера теоретично не повинні кешувати параметр Set-Cookie HTTP заголовка. Аналогічно, якщо відповідь містить параметр Cookie, то він обов'язково повинен дійти до сервера.
    © Зайцев Олег, "Програмування на Delphi - обмін досвідом" 1999-2004. При використанні будь-яких матеріалів даного сайту необхідно вказувати джерело інформації. Дата поновлення: 22.11.2004. Сайт розміщено на хостингу AGAVA - Хостинг від AGAVA.ru