Skip to Content

Тестирование Cookie. Грызем печеньки

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

 

Куки — кто они?


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


Итак, куки — это некоторый объем данных, созданный веб сервером и хранимый на клиентской машине в виде файла, который впоследствии может быть передан клиентским ПО обратно на веб сервер в HTTP-запросе. Предназначение куки — хранение пользовательских данных на клиентском компьютере. Эти данные необходимы для того, чтобы бороться с некоторыми недостатками HTTP-протокола, а также для реализации всяких полезностей, о которых будет сказано немного позже.


Пожалуй, стоит пояснить, что подразумевается под борьбой с недостатками HTTP-протокола. Дело в том, что этот протокол не умеет сохранять своего состояния, т.е. пользуясь средствами одного лишь HTTP у вас никогда не получится отследить взаимосвязь между парами «запрос-ответ». На практике это означает следующее — например, на вашем сайте существуют три страницы page1.htm, page2.htm и page3.htm, на сайт приходят два пользователя, один из которых сначала просматривает страницу page1.htm, а второй page3.htm, затем оба переходят на страницу page2.htm, так вот, в этом случае никакой разницы между запросами первого и второго пользователя на получение этой страницы не будет, т.е. веб сервер не сможет узнать, какие страницы посещали пользователи до того, как собрались перейти на страницу page2.htm.


Вторая проблема при использовании HTTP заключается в том, что для каждого запроса протокол устанавливает новую TCP-сессию, а завершив цикл «запрос-ответ» сразу же ее закрывает. Это значительно усложняет идентификацию пользователя, поскольку лишает возможности реализовать аутентификацию средствами самого протокола (HTTP-аутентификацию в расчет не берем, т.к. она требует пересылки учетных данных при каждом обращении к серверу). Справедливости ради, отмечу, что в HTTP1.1 была реализована возможность осуществлять несколько запросов в рамках одной TCP-сессии, но... это совершенно другая история... :)


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

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

  • имя куки,
  • непосредственно пользовательская информация,
  • имя домена которому принадлежит куки,
  • путь в пределах домена, для которого эта куки действительна,
  • тип соединения, при котором она должна передаваться (с использованием SSL или без),
  • время в течении которого куки считается действительной.


Короче говоря, в реальной жизни это выглядит приблизительно так:

Так выглядят Cookies в Opera


Где и как хранить куки (и хранить ли их вообще) определяет, непосредственно, клиентское ПО (чаще всего браузер). Время, на протяжении которого куки будут хранится в клиентском ПО, может варьироваться, и задается для каждой куки отдельно. Исходя из времени хранения, куки делятся на сессионные (те которые будут удалены сразу после закрытия сессии между браузером и сервером) и постоянные (те которые будут удалены после даты определенной в поле Expires).


Передача куки от серверного ПО к клиентскому осуществляется в HTTP-запросе, путем добавления в него поля Set-Cookie, в обратном направлении куки пересылаются в поле Cookie.


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

Куки — зачем они?


Что же можно делать при помощи куки? На самом деле, множество вещей без которых трудно представить современный веб, а именно:


1.Аутентификация
Многие веб приложения требуют аутентификации для доступа к некоторым функциям или данным. Примером таких приложений, может служить и сайт на котором вы сейчас находитесь, ведь для того чтобы добавить комментарий или скачать какой-либо файл вам необходимо ввести свой логин и пароль. Вроде бы, ничего необычного, но давайте задумаемся вот над чем — вы вводите пароль всего лишь один раз, но при этом можете добавить десяток комментариев или скачать десяток файлов. Как же сайт «узнает» вас и почему не просит повторять процедуру аутентификации каждый раз? Все просто. После того как вы ввели свой логин и пароль, сервер сгенерировал для вас уникальный ключ и отправил его в виде куки вашему браузеру. Теперь, при запросе каждой новой страницы, браузер отправляет эту куки обратно на сервер, который, в свою очередь, сверяет ключ записанный в ней со списком ключей известных ему пользователей, после чего и принимает решение о том, какую же страницу вам отдавать и какие действия вам разрешать, а какие нет. Более того, эта куки не удаляется, после того как вы покидаете сайт, а хранится в вашем браузере на протяжении нескольких дней, избавляя вас от необходимости проходить процедуру логина при последующих посещениях.


2. Персонализация
Часто веб сайты позволяют пользователям изменять некоторые параметры отображения страниц, например, цветовое оформление либо язык интерфейса. Опять же, вполне привычная вещь, если бы не одно но, некоторые веб сайты позволяют делать это даже неаутентифицированным пользователям. Где же хранятся эти настройки? Правильно — в куки. В качестве примера, взгляните на всеми любимый/нелюбимый Вконтакте. Попробуйте сменить язык на странице регистрации, а после закрыть окно браузера и снова открыть эту же страницу. Как ни странно, язык останется тем же, что вы выбрали перед тем как закрыть браузер, а все это благодаря куки под названием remixlang, содержащей код выбранного вами языка.

3. Сбор статистики
Вполне естественно, что каждый владелец веб сайта желает знать кто, когда, зачем и почему посещал его ресурс. И еще более естественно, что это желание веб мастеров нашло свою реализацию в десятках и сотнях сервисов интернет-статистики. И, конечно же, работа этих сервисов была бы невозможна без куки. Почему? Да потому, что без использования куки они были бы, мягко говоря, бесполезны, ведь в этом случае предоставляемая ими информация ограничивалась бы списком IP адресов со временем посещения, полем referer и данными о пользовательском окружении (ОС, браузер и т.п.). Практическая польза от такого рода статистики стремится к нулю, тем более, что количество уникальных посещений веб мастера в состоянии посчитать и сами, не прибегая к посторонней помощи. Об этом знают и создатели подобных сервисов, и потому бессовестно захламляют ваш браузер множеством различных куки, которые впоследствии позволят ответить на вопросы, так интересующие владельцев сайтов: «Кто приходил?», «Зачем приходил?», «Через сколько вернулся?», «Сколько времени провел?», «Что еще посещал?». Не верите, что за вами наблюдают всего лишь с помощью куки? Тогда обновите страницу ;)
 

 

4. Интернет-маркетинг
Помимо того, что куки используются для сбора статистики, они еще и успешно применяются для извлечения прибыли из этой же статистики. Взгляните, на Яндекс-Директ, Google AdSense или любой другой рекламный сервис. Наверняка, вы без труда найдете взаимосвязь показываемых вам объявлений не только с тематикой сайта на котором вы сейчас находитесь, но и с тематиками сайтов которые вы посещали ранее и даже с поисковыми запросами введенными ранее в Yandex или Google. Такой таргетинг, опять же, обязан своим существованием куки, ведь именно куки записанные в ваш браузер позволяют рекламной сети выбирать тематику объявлений, которая потенциально может быть интересна именно вам.

5. Корзины в интернет-магазинах
Еще одним ярким примером использования куки, являются корзины в интернет магазинах. Редко какой магазин будет рисковать потенциальным покупателем, вынуждая его регистрироваться, поэтому клиентам разрешено делать покупки введя всего лишь самые необходимые контактные данные. Все бы хорошо, но как быть с покупателями которые не желают регистрироваться, но при этом хотят приобрести несколько товаров? В таком случае, вряд ли удастся сохранить список товаров в их корзине обычным способом, потому для реализации подобного функционала снова прибегают к использованию куки, в которую записывается уникальный идентификатор, соответствующий определенному набору товаров в корзине.

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

Куки — что тестировать?


1.Убедитесь, что в куки не хранится конфиденциальная информация
В идеальном случае конфиденциальных данных в куки быть не должно. Почему? Да потому, что никакого встроенного механизма защиты в куки нет, и, при необходимости, к ним сможет получить доступ кто угодно. Если же у вас нет выбора и в куки приходится хранить подобные данные, то убедитесь, что они не хранятся в открытом виде и, что применяемое шифрование, на самом деле, не является чем-то вроде энкода в Base64.

2. Проверьте количество используемых куки

Четкого ответа на вопрос о том, сколько должно быть куки — нет. Нельзя сказать, что 10 куки — хорошо, а 12 — плохо. Здесь, скорее, нужно руководствоваться принципом — чем меньше тем лучше. Малое количество куки сможет уберечь от нервного срыва многих корпоративных пользователей либо обычных параноиков, у которых в браузере включена опция «Ask me before accepting cookies». Также не стоит забывать, что количество принимаемых браузером куки тоже не бесконечно. Для большинства современных браузеров данная цифра колеблется в районе 50 штук для одного домена. Кстати, если в вашем проекте, количество куки начало приближаться к этой отметке, то... вы явно что-то делаете не так. :)

3. Убедитесь, что приложение сохраняет свою работоспособность при отключенном либо выборочном приеме куки

Если приложение активно использует куки, то, скорее всего, оно не будет функционировать должным образом, в случае если их прием будет отключен в браузере. Но, в то же время, его поведение должно оставаться адекватным, т.е. приложение не должно сыпать эксепшенами и извергать различного рода Server Error'ы, вместо этого оно должно ненавязчиво :) предлагать пользователю включить прием куки. То же самое касается и выборочного приема куки. Для того, чтобы принимать куки выборочно, просто включите в своем браузере опцию «Спрашивать меня перед тем как принимать куки» и попробуйте принять, например, только половину из всех куки отправляемых сайтом.

4. Удостоверьтесь, что приложение адекватно реагирует на удаление куки вручную
Просто закройте тестируемый сайт и удалите все куки записанные им из вашего браузера, после чего снова откройте сайт и наблюдайте за тем, что будет с ним происходить. А происходить... не должно, ровным счетом, ничего. Приложение должно оставаться полностью работоспособным.

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

6. Убедитесь, что куки записываются и удаляются именно на тех страницах на которых это ожидаемо и необходимо
Если в вашем приложении куки используются для отслеживания каких-либо действий пользователя (например, создание тикетов в системах технической поддержки, либо оформление заказов в интернет-магазинах), то вам стоит проверить, что соответствующие куки создаются именно в тот момент, когда пользователь инициирует некоторое новое действие и удаляются после завершения действия. Например, при оформлении заказа в интернет-магазине, при котором пользователю необходимо последовательно заполнить формы на нескольких страницах, куки должны создаваться в момент нажатия на кнопку «Оформить заказ», а удаляться после того, как все необходимые данные будут отправлены на сервер (кстати, при этом должны удаляться не только куки, которые «сопровождали» пользователя в процессе оформления заказа, но и те, которые, отвечают за содержимое корзины с товарами).

7. Проверьте, что куки корректно работают во всех браузерах с которыми будет использоваться приложение
Все уже давно привыкли к кроссбраузерному тестированию, поскольку знают, что у каждого браузера свой норов, и потому поведение приложение может разниться от браузера к браузеру. Но, казалось бы, при чем здесь куки? Вроде бы, все современные браузеры декларируют поддержку DOM1 и предоставляют практически одинаковый механизм доступа к куки. Но, тем не менее, проблемы возможны и здесь, например, в случае если куки устанавливаются/читаются при помощи JavaScript (о кроссбраузерности JS-скриптов, надеюсь, рассказывать не нужно :) ), либо сам браузер имеет свои собственные бзики по этому поводу, к примеру, такие либо эдакие.

8. Проверьте, что доступ к различным частям приложения не может быть осуществлен в обход куки, используемых для аутентификации либо авторизации
Некоторые веб сайты передают идентификаторы пользователей в открытом виде, например, в URL. Естественно, что при подмене этих идентификаторов, не должно быть возможности получения доступа к аккаунтам других пользователей. Чтобы было понятнее о чем идет речь, попробуйте залогиниться и перейти на страницу редактирования своего профиля на этом сайте, после чего попробуйте заменить ваш UserID, указанный в URL на любой другой (например, попробуйте отредактировать вот этот профиль http://iqa.com.ua/user/16/edit).

На этом пожалуй все. Тем кто, ожидал увидеть в этой заметке что-нибудь об XSS, приношу свои извинения :). Думаю, что эта тема хоть и касается куки, но, все же, требует отдельного обсуждения.

Удачного разгрызания печенек, надеюсь, что теперь у ваших зубов больше шансов остаться целыми :)

Мысли навеяны статьей «Website Cookie Testing, Test cases for testing web application cookies?»
 

 

++++++++--

Отправить комментарий

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • Pairs of<blockquote> tags will be styled as a block that indicates a quotation.
  • Textual smileys will be replaced with graphical ones.

Подробнее о форматировании