(044) 362 48 16 (098) 294 41 60
|
|
|
Что такое куки После появления веба и масового внедрения HTML страниц девелоперы столкнулись с серьёзной проблемой - невозмжностью отслеживания последовательных запросов пользователей. Всё дело в том, что после того как броузер послал запрос и получил ответ, HTTP соединение закрывается и больше о пользователе никто ничего не знает. Компания Netscape Communications разработала новую технологию Cookies и внедрила её в свои веб-серверы (Web Planet) и броузеры (Netscape Navigator). Позднее почти все серверы и броузеры начали поддерживать куки
Кука - это информация которая хранится в броузере (изначально в NN - файл cookies.txt) и каждый раз передается от клиента серверу вместе с запросом и другими заголовками (HTTP Request Headers). Таким образом при последующих запросах сервер может получить значения переменных, установленные на посещенных ранее страницах. Также читайте RFC2965, RFC2109
<h6>Синтаксис Set-Cookie заголовка ответа</h6> <pre>set-cookie = "Set-Cookie:" cookies cookies = 1#cookie cookie = NAME "=" VALUE *(";" cookie-av) NAME = attr VALUE = value cookie-av = "Comment" "=" value | "Domain" "=" value | "Max-Age" "=" value | "Path" "=" value | "Secure" | "Version" "=" 1*DIGIT</pre> Неофициально, Set-Cookie заголовок включает выбранный Set-Cookie:, за которым следует перечень одной или более кук. Каждая кука начинается с пары NAME=VALUE, за которыми следуют ноль или больше пар аттрибут-значение, разделенных точками с запятой. Синтаксис для пар аттрибут-значение был приведен выше. Пара NAME=VALUE должна быть самой первой в объявлении куки. Все другие могут следовать в любом порядке. Стандарт не предусматривает поведение при неоднократном использовании одной и той же пары аттрибут-значение.
<h5>NAME=VALUE</h5> Обязателен. Имя куки - NAME, и её значение - VALUE. NAMEs которые начинаются на знак $ зарезервированы для других целей и не должны использоваться. <br> Значение VALUE должно быть безразлично клиенту и сервером может быть установлено любое значение в выбранной ASCII кодировке. "Безразлично" означает что содержимое должно интересовать только исходный сервер. Фактически, оно может быть прочитано кем-либо ктоанализирует Set-Cookie заголовок. <h5>Comment=comment</h5> Необязательный. Because cookies can contain private information about a user, the Cookie attribute allows an origin server to document its intended use of a cookie. The user can inspect the information to decide whether to initiate or continue a session with this cookie. <h5>Domain=domain</h5> Необязательный. The Domain attribute specifies the domain for which the cookie is valid. An explicitly specified domain must always start with a dot. <h5>Max-Age=delta-seconds</h5> Необязательный. The Max-Age attribute defines the lifetime of the cookie, in seconds. The delta-seconds value is a decimal non- negative integer. After delta-seconds seconds elapse, the client should discard the cookie. A value of zero means the cookie should be discarded immediately. <h5>Path=path</h5> Необязательный. The Path attribute specifies the subset of URLs to which this cookie applies. <h5>Secure</h5> Необязательный. The Secure attribute (with no value) directs the user agent to use only (unspecified) secure means to contact the origin server whenever it sends back this cookie. <br> The user agent (possibly under the user's control) may determine what level of security it considers appropriate for "secure" cookies. The Secure attribute should be considered security advice from the server to the user agent, indicating that it is in the session's interest to protect the cookie contents. <h5>Version=version</h5> Обязателен. The Version attribute, a decimal integer, identifies to which version of the state management specification the cookie conforms. For this specification, Version=1 applies.
Как установить куку Кука устанавливается тремя способами:
- Веб сервером (при включении соответствующих настроек)
- Через заголовки ответа CGI приложения (например Perl, PHP, C, Sh)
- Через клиентский скрипт (javascript а также vbscript под IE4+)
Установка куки сервером Apache При наличии модуля mod_cookies сервер Apache дает возможность через установку директивы CookieLog filename записывать в filename уникальные куки клиента. Таким образом, после анализа этого лог-файла мы можем проследить активность пользователя, или его clickstream. Начиная с Apache 1.2 этот модуль был заменен на mod_usertrack и была убрана возможность создавать отдельный куки-лог. Для этого предполагается в общем лог-файле использовать "%{cookie}n" параметр. Например так CustomLog logs/clickstream "%{cookie}n %r %t" Дополнительно можно устанавливать такие директивы (в server congif или virtual host)
- CookieExpires
- CookieName имя куки (также можно указать в .htaccess или directory)
- CookieTracking on | off (также можно указать в .htaccess или directory)
Установка куки CGI приложением Установить куку из CGI приложения можно послав следующий заголовок (т.е. послав строку до начала вывода собственно содержимого, которое идет после заголовка "Content-type:")
<pre>Set-Cookie: name=value [;EXPIRES=dateValue] [;DOMAIN=domainName] [;PATH=pathName] [;SECURE]</pre> Рассмотрим параметры установки куки:
- name=value установка для переменнной name значения value
- [;EXPIRES=dateValue] если указан, то это дата когда действие куки истекает, т.е она уничтожается из броузера. Если не указан, кука уничтожается после закрытия окна броузера. В последнем случае куку часто называют сессионной. Формат даты такой:
Wdy, DD-Mon-YY HH:MM:SS GMT
- [;DOMAIN=domainName] Если указан, то это домен в пределах которого броузер будет отсылать куку серверу. Например, если установлен в example.com, то кука отошлется и на example.com и на pupkin.example.com. По умолчанию устанавливается на текущий домен.
- [;PATH=pathName] Если указан, то это виртуальный каталог сервера, в пределах которого броузер будет посылать куку. Например, если установлен в /user, то кука отошлется и на example.com/user/ и на example.com/user/pupkin/ но НЕ на example.com/smith/. По умолчанию берется виртуальный каталог страницы, которая посылает куку.
Когда используете куки и <b>mod_rewrite</b> будьте бдительны! Ставьте этот параметр например в "/" иначе скрипты, расположенные в одной директории не смогут использовать общие куки, т.к. вызываются через mod_rewrite. Также типичная ошибка - установка куки из скрипта в поддиректории с последующим обращением из скрипта в родительской директории. Если не установить PATH, кука не будет доступна!
- [;SECURE] если установлен, то предотвращает передачу куки по незащищенным каналам. Незащищенными являются все протоколы кроме https:// Единственный броузер который не понимает эту директиву - Konquerror
Установка куки в PHP
Читание значения куки в PHP
Удаление куки в PHP
Установка и чтение куки из javascript
Помните, что не все клиенты поддерживают javascript, точнее не на всех броузерах выполнение javascript разрешено
<script language="javascript"> function GetValue(Offset){ var End=document.cookie.indexOf (";", Offset); if (End==-1) End=document.cookie.length; return unescape(document.cookie.substring(Offset, End)); }
function GetCookie(Name){ var Len=Name.length; var i=0; while (i<document.cookie.length){ var j=i+Len+1; if (document.cookie.substring(i,j)==(Name+"=")) return GetValue(j); i=document.cookie.indexOf(" ", 1)+1; if (i==0) break; } return null; }
function SetCookie(Name, Value, Expire){ var Exp="Friday,25-Feb-2000 12:00:00 GMT"; document.cookie=Name+"="+escape(value)+";expires="+Expire; }
</script>
Удаление куки в javascript
Кеширование кук прокси серверами Исходный сервер должен быть осведомлен о ефекте возможного кешировния как возвращаемых, так и посылаемых Set-Cookie заголовков. Кешировние "public" страниц желательно. Для примера, если исходный сервер хочет использовать публичный документ, такой как "визитная страница" для отправки куки сессии, для чего он отправляет Set-Cookie заголовок, страница должна быть размещена в кеше "pre-expired" так что исходный сервер увидит последующие запросы. "Private" страницы, наоборот, не должны быть кешированными. Если кука применяется для отдельного пользователя, Set-cookie заголовок не должен быть кешированным. Set-cookie заголвок используемый совместно многими пользователями может быть кешированным.
Исходный сервер должен послать следующий дополнительный HTTP/1.1 заголовок ответа, в зависимости от обстоятельств:
Чтобы подавить кеширование Set-Cookie заголовка:
Cache-control: no-cache="set-cookie"
и один из следующих:
- Подавить кеширование private document in shared caches:
Cache-control: private
- Разрешить кеширование документа и требовать проверки перед показом
Cache-control: must-revalidate
- Разрешить кеширование документа, но требовать от кеширующих прокси-серверов (не кеша броузера)
проверки документа перед посылкой клиенту
Cache-control: proxy-revalidate
- To allow caching of a document and request that it be validated
before returning it to the client (by "pre-expiring" it):
Cache-control: max-age=0
Not all caches will revalidate the document in every case.
HTTP/1.1 servers must send Expires: old-date (where old-date is a date long in the past) on responses containing Set-Cookie response headers unless they know for certain (by out of band means) that there are no downsteam HTTP/1.0 proxies. HTTP/1.1 servers may send other Cache-Control directives that permit caching by HTTP/1.1 proxies in addition to the
Expires: old-date directive; the Cache-Control directive will override the Expires: old-date for HTTP/1.1 proxies.
Неправильные куки С целью защитить клиента от возможного нарушения тайны частной информации броузер должен отклонять куки (не сохранять ифнормацию о них) в любом из следующих случаев:
- The value for the Path attribute is not a prefix of the request-URI.
- The value for the Domain attribute contains no embedded dots or does not start with a dot.
- The value for the request-host does not domain-match the Domain attribute.
- The request-host is a FQDN (not IP address) and has the form HD, where D is the value of the Domain attribute, and H is a string that contains one or more dots.
Примеры:
- A Set-Cookie from request-host y.x.foo.com for Domain=.foo.com would be rejected, because H is y.x and contains a dot.
- A Set-Cookie from request-host x.foo.com for Domain=.foo.com would be accepted.
- A Set-Cookie with Domain=.com or Domain=.com., will always be rejected, because there is no embedded dot.
- A Set-Cookie with Domain=ajax.com will be rejected because the value for Domain does not begin with a dot.
Безопасность кук Возможность подделки кук (Cookie Spoofing).
Правильно разработанные программы могут избежать атак с использованием подделанных кук c соседних доменов. К примеру:
<ol> <li>Броузер делает запрос на ламер_петя.host.com, и получает куку session_id="1234" с доменом ламер_петя.host.com <li>Броузер делает запрос на хацкер_вася.host.com, и получает куку<br> <b>session-id="1111", Domain=".host.com"</b> <li>Тот же броузер делает запрос на ламер_петя.host.com и посылает <pre> Cookie: $Version="1"; session_id="1234"; session_id="1111"; $Domain=".host.com"</pre> Сервер на ламер_петя.host. должен вычислить что вторая кука пришла с другого домена и проигнорировать ее.
Пример два
Ламер Петя имеет два сайте на шаровом хосте .host.com. Он использует куки на своих 2 сайтах и хочет чтобы они были общими, устанавливает домен .host.com. Хацкер Вася хостится рядом и убеждает ламера Петю посетить/заценить его сайт. Так как у Пети домен куки общий, она отошлется и хацкеру Васе, где он сможет получить личную информацию Пети, например сессионный ключ на администрирование сайта и поиздеваться над Петей сколько душе будет угодно.
Privacy ? куки. Internet Exploer 6 сейчас требует от сайтов, которые посылают куки, иметь P3P политику. Вот что говорит Microsoft:
"Internet Explorer 6 имеет развитую фильтрацию кук которая базируется на спецификации Platform for Privacy Preferences (P3P). По умолчанию, Internet Explorer 6 блокирует сторонние куки которые не имеют краткой политики (краткий отчет о безопасности в понятной компьютеру форме) или сторонние куки, в описании которых не указано что они используют вашу личную информацию без вашего явного согласия. Исходные куки, в описании которых не указано что они используют вашу личную информацию без вашего явного согласия удаляются после закрытия окна броузера. First-party cookies that do not have a compact policy are leashed (restricted so that they can only be read in the first-party context)."<br> Также смотрите: <a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;q260971&GSSNB=1">Сайт Microsoft</a>
|
|