Рейтинг
0.00
голосов:
0
avatar

Путь война  

Ограничения на Cookie

Давно хотел разобраться с тем какие ограничения накладывают браузеры на хранение куков (cookie). Сегодня смог выкроить на это время и провести несколько простых тестов. Так как на полноту эксперимента я не претендую, то для исследования взял только три браузера — Opera 9, FireFox 3, InternetExplorer 8. Далее о том, какие результаты получены.


Для начала я прошелся по стандартным вещам — максимальный суммарный размер данных для всех куков на один домен и их общее количество.

В плане размера все браузеры показали примерно одинаковые результаты — 4096 симовлов (это включая знак равенства и имя самой куки). Что касается количества, то тут результаты разные:

  •  FireFox 3 — 50 куков на домен;
  •  Opera 9 — 30 куков на домен;
  •  InternetExplorer — 50 куков на домен. (напомню, что в IE6 можно было хранить не более 20 куков на домен)



Затем, мне стало интересно, а что будет если количество куков, полученных от сервера, превысит указанные ограничения. Логично предположить, что в таком случае браузер удалит самую старую куку и добавит одну из новых. Данное предположение оказалось истинным только для IE8 и Opera 9, а вот FireFox повел себя странным образом начав удалять куки в произвольном порядке.

Последний вопрос, который меня интересовал заключается в следующем: существует ли ограничение на общее количество хранимых куков. Фактически я хотел определить сколько различных сайтов можно посетить не боясь, что часть куков будет потеряна. Может быть кто-то помнит, в Netscape-их спецификациях было указано, что суммарное количество хранимых куков должно быть не менее 300.

Прежде чем я приведу результаты проверки, пара слов о том как я ее проводил. Для имитации большого числа различных доменов, я внес в файл хостов (hosts) порядка 30 тыс. доменов, следующего вида «dXXXXX.ru», где вместо XXXXX — указывается порядковый номер домена. Затем, с помощью небольшого скрипта на JS, загруженного в браузере, я последовательно обошел все домены и установил максимально разрешенное количество куков. После чего, другим скриптом проверил какие куки были сохранены.

В итоге у меня получились следующие ограничения (еще раз обращаю внимание, что приведенные ниже цифры отражают максимальное количество куков, которое может запомнить браузер!):

  • FireFox 3 — 3000 куков;
  • Opera 9 — 65535 куков;
  • InternetExplorer — неограниченное число куков (мне надоело проверять после того как были успешно установлено 150 тыс. куков).



Честно говоря, меня очень разочаровал показатель полученный в FireFox, ведь при установке 50 куков на один домен можно хранить информацию только от 60 сайтов, а это мало. С другой стороны, на практике даже скромного значения в 3000 куков оказывается вполне достаточно. Главное понимать для чего нужны куки и как их правильно использовать.

Полученные сведения, еще раз доказывают, что использовать куки нужно без фанатизма, так как у них существуют весьма значительные ограничения (особенно в FireFox).

Пара мыслей об анлизе и планировании проекта

Давно уже хочется что-нибудь написать о том, с чего и как начинают программный проект «взрослые» дяди. Но все как-то руки не доходили. И вот час «Х» настал.

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

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

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

Обычно анализ делят на две части — это «Анализ требований» и «Объектный анализ». В первом случае перед разработчиком ставят цель осознать, что нужно будет сделать, а во втором выделить объекты участвующие в проекте.

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

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

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

Как получить HTTP заголовки с помощью WireShark

Шаг нулевой. Вступительный

Для того, чтобы получить заголовки HTTP запросов и ответов нам понадобится две вещи. Первое — это снифер WireShark. Второе — браузер который наиболее всего соответсвует вашему вкусу. В моем случае выбор пал на FireFox.

Но прежде чем начнем, давайте усвоим несколько вещей:

RFC 2616 (равно как и все остальные RFC) — лучше всего использовать как справочник, а не как учебник по HTTP протоколу.


Большая часть информации, описанной в RFC 2616 никогда Вам не понадобится.


Лучший способ научиться писать программы использующие HTTP-протокол — это посмотреть какие заголовки (и в каких случаях) используют другие аналогичные программы.


Суть всего сказанного сводится к тому, что если ты хочешь начать работу с HTTP-протоколом, то не забивай себе голову ерундой, а просто посмотри как эту же работу делают FireFox, Opera или IE.

Шаг первый. Теоретический

Для того, чтобы браузер мог получать информацию с веб-сервера используется протокол который называется HTTP (Hypertext Transfer Protocol). Данный протокол создавался для решения широкого круга задач, поэтому содержит некоторую избыточность. Например, кроме наиболее часто используемых в вебе методов "GET" и "POST", есть такие методы как "PUT", "DELETE" и другие. Которые, повторюсь, никогда вам не понадобятся.

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

Например:
GET http://www.phptips.ru/pages/about HTTP/1.1

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

Шаг второй. Практический

Для того, чтобы не приводить все возможные варианты запросов браузера к веб-серверу. Опишу способ как их можно получить самостоятельно.

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

Чтобы ограничить этот список в строке «Filter:» вводит аббревиатуру «http» и нажимаем «enter». В итоге у нас остаются только HTTP запросы:


Сейчас снифер собирает все HTTP запросы, которые получает компьютер. Для того, чтобы понять какие запросы уходят на конкретный адрес. Переходим в FireFox и набираем строку «www.phptips.ru», после чего смело жмем на «Enter».

Переключившись обратно на WireShark мы видим кучу сообщений направленных и полученных по HTTP запросу.

Для того, чтобы понять что было отправлено и получено браузером щелкаем правой кнопкой мыши по любому из сообщений и выбираем пункт «Follow TCP Stream». В итоге WireShark анализирует весь трафик и выдает нам ответ в отдельном окне. Где красным помечен запрос, который был отправлен на сервер, а синим ответ, полученный с сервера:

Теперь, когда заголовки получены остается понять, что с ними делать.

Шаг третий. Завершающий

Для начала посмотрим, на запрос, который был направлен на сервер:

GET / HTTP/1.1

Host: www.phptips.ru

User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.1b4) Gecko/20090427 Fedora/3.5-0.20.beta4.fc11 Firefox/3.5b4

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: ru,en-us;q=0.7,en;q=0.3

Accept-Encoding: gzip,deflate

Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive


здесь наиболее важны первые две строки: GET и HOST именно по ним, сервер понимает какую страницу нужно отдать клиенту. В данном случае — это корневая страница сайта www.phptips.ru.

Все остальное уже менее важно, в том смысле, что запрос скорее всего был бы корректно обработан и без оставшихся строк. Здесь браузер указывает информацию о себе (User-agent), в каком виде браузер готов принять ответ (accept), на каком языке может быть выдан контент (accept-language), как закодировать ответ (Accept-Encoding), в какой кодировке должно быть содержимое страницы (Accept-Charset), что соединение может быть не разорвано после передачи страницы (keep-alive).

Чтобы узнать о данных параметрах более подробно можно воспользоваться RFC.

Теперь об ответе сервера на данный запрос. Первой строкой идет информация о том, что страница найдена (HTTP/1.1 200 OK), а дальше параметры ответа. В качестве задания для самопроверки, рекомендую самостоятельно узнать, что это за параметры.

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

Как сделать ZIP архив средствами PHP

Многие думают, что создать ZIP архив средствами PHP сложно. На самом деле это не так. Все, что нужно — это несколько строк кода и готовая библиотека PclZip.lib.

Алгоритм работы с библиотекой следующий:

1. Подключаем к проекту модуль pclzip.lib.php;
2. Создаем экземпляр класса PclZip;
3. Выполняем необходимые действия по внесению или извлечению данных из архива;
4. Обрабатываем возможные ошибки.

Для примера, рассмотрим скрипт, который извлекает файлы из заранее подготовленного архива:


require_once('pclzip.lib.php'); //подключаем pclzip.lib
// определяем директорию куда загружен файл z.zip
// по-умолчанию считаем что это та директория в которой лежит распаковочный скрипт
$upload_dir = dirname( __FILE__ ); 
$filename = 'z.zip'; 

// распаковываем в ту же директорию куда загружен файл z.zip
$zip_dir = ''; 

// распаковка делается посредством инстанса специального класса PclZip
$archive = new PclZip($filename); 

if ($archive->extract(PCLZIP_OPT_PATH, $upload_dir.'/'.$zip_dir) == 0)
// в "реальном" скрипте было бы неплохо выдавать сообщение об ошибке которая возникла в процессе распаковки
	die("Error\n"); 
echo "Ok\n";