Добавляем...


Файлы cookie и JavaScript
Приятной особенностью файлов cookie является то, что почти каждый браузер, поддерживающий JavaScript, обеспечивает и доступ сценариев к строкам cookie. Строки cookie представляются свойством cookie объекта Document. Это свойство доступно как для чтения, так и для записи.

Установка строк cookie
Когда вы присваиваете строку свойству document. cookie, браузер анализирует ее как строку файла cookie и добавляет ее в список строк cookie.

document.cookie = "username=fritz; expires=Sun, 01-Dec-2005 08:00:00 GMT; path=/home";

Например,устанавливает перманентную строку cookie с именем username и значением " fritz", срок действия которой истекает в 2005 году, и эта строка будет посылаться серверу каждый раз, когда запрашивается файл из каталога "/home" текущего Web-сервера. Если в строке cookie опущены необязательные поля (например, secure или domain), браузер добавляет их автоматически, указывая для них принимаемые по умолчанию значения (например, доменное имя текущего URL или путь к текущему документу).

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

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

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

Довольно часто значения полей cookie шифруются, что может оказаться проблемой при вставке их в строку cookie. Для работы обычно достаточно глобальных методов escape ( ) и unescape ( ), доступных во всех популярных браузерах. Эти функции выполняют URL-кодирование и декодирование строк, которые передаются им в качестве аргументов, возвращая соответствующий результат.

Проблемные символы типа пробелов, запятых и точек с запятой заменяются их эквивалентами в управляющих кодах URL. Например, пробел кодируется в виде %20. Следующий фрагмент программы иллюстрирует применение таких кодов:


var problemString = "Избавиться от , ; и ?";
var encodedString = escape(problemString);
alert("Закодировано: " + encodedString + "\n" + "Декодировано:" + unesca
pe(encodedString));

Согда вы присваиваете новое значение свойству document.cookie, текущая строка cookie не заменяется. Новое значение cookie анализируется, и соответствующая пара имя/значение добавляется в список. Исключение имеет место только тогда, когда вы указываете новое значение cookie с уже существующим именем (и теми же доменом и значением пути, если они заданы). В этом случае старое значение заменяется новым. Например, для


document.cookie = "username=fritz";
document.cookie = "username=thomas";
alert ("Строка cookie: " + document. cookie);


Чтение строк cookie
Как можно видеть из предыдущего примера, чтобы прочитать строки cookie, следует проанализировать document. cookie. Ввиду того что браузер автоматически анализирует и добавляет строки cookie, устанавливаемые с помощью указанного свойства, оно всегда содержит самые последние пары имя/значение файла cookie текущего документа. Единственной проблемой является анализ соответствующей строки, из которой требуется извлечь нужную информацию. Рассмотрим следующий программный код:


document.cookie = "username=fritz";
document.cookie = "favoritecolor=green";
document.cookie = "jsprogrammer=true";

Значением document. cookie после выполнения этого фрагмента программного кода будет


"username=fritz; favoritecolor=green; jsprogrammer=true"

Если вас интересует элемент cookie с именем favoritecolor, можете вручную извлечь подстроку, начинающуюся после favoritecolor= и заканчивающуюся перед ; jsprogrammer=true. Однако почти всегда гораздо лучше создать специальную функцию, которая сделает это автоматически.

Анализ строк cookie. Следующий программный код анализирует текущие строки cookie и размещает соответствующие элементы в ассоциативном массиве, индексированном по полю имя. При этом предполагается, что браузер поддерживает ECMAScript (такими являются почти все современные браузеры).
// правило индексации ассоциативного массива: cookies["имя"]="значение"


var cookies = new Object( );
function extractCookies( )
{
var name, value;
var beginning, middle, end;
for (name in cookies)
{ // если имеются значения, удалить их
cookies = new Object ( );
break;
(
beginning =0; // начать с начала строки cookie
while (beginning < document.cookie.length)
{
middle = document.cookie.indexOf('=', beginning); // найти '='
end ¦ document.cookie.indexOf(';', beginning); // найти ';'
if (end =* -1) // если нет ';', то это последнее поле cookie
end = document.cookie.length;
if ( (middle > end) || (middle == -1) )
{ // если поле cookie не имеет значения...
name = document.cookie.substring(beginning, end) ;
value = "";
(
else
{ // извлечь значение поля
name = document.cookie.substring(beginning, middle);
value = document.cookie.substring(middle + 1, end);
}
cookies[name] = unescape(value); // добавить в массив
beginning = end + 2; // пропуск до начала следующего поля
(
(


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

Вы можете поинтересоваться, является ли необходимой в предыдущем примере специальная проверка для знака равенства. Ясно, что она необходима. Рассмотрим следующий пример:


document.cookie = "first=valuel"
document.cookie = "second=";
document.cookie = "third";
document.cookie = "fourth=value4";
alert("Строка cookie: " +.document.cookie);


Как видите, поле cookie может существовать без явного значения. Кроме того, представления поля cookie с именем "second" в IE и Mozilla различны. Но, хотя всегда можно использовать полные пары имя/значение в файлах cookie, устанавливаемых с помощью JavaScript, некоторые из файлов cookie браузер может устанавливать с помощью CGI-сценариев, над которыми вы не имеете контроля.

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

Удаление строк cookie
Строка cookie удаляется с помощью установки для соответствующего имени cookie (с соответствующим доменом и значением пути, если они были установлены) даты истечения срока действия, соответствующей уже прошедшей дате.

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

document.cookie = "username=nothing; expires=Thu, 01-Jan-1970 00:00:01 GMT";

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

document.cookie = "username"; document.cookie = "username; expires=Thu, O1-Jan-1970 00:00:01 GMT";

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


function deleteCookie(name)
{
document.cookie = name + "=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT";
document.cookie = name + "; expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

Если строка cookie была установлена с указанными доменом или значением пути, то необходимо включить соответствующие лексемы и в строку cookie, которая используется для удаления.

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

Предположим, вы установили в файле cookie имя пользователя для Web-узла электронной почты. В отсутствие дополнительной защиты ничто не запретит пользователю со строкой cookie "username=fritz" поменять указанное значение на "username=thomas ", чтобы получить доступ к чужой учетной записи.

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

Некоторые серверные Web-платформы, в частности ASP.Net, могут обеспечивать защиту автоматически, но если вам придется делать это самостоятельно, необходимо получить консультацию эксперта по безопасности или использовать в качестве учебника материалы соответствующей книги или Web-узла, чтобы правильно решить указанную задачу. Хорошей стартовой площадкой в этом случае является узел Open Web Application Security Project

(Открытый проект по защите Web-приложений, http://www.owasp.org/), на страницах которого предлагаются документы, освещающие проблему защиты, и много чего другого.


добавить комментарий
(без перезагрузки и регистрации)


10 случайных разделов

Что ищем на сайте ?


Примеры кода на сайте







@ 2008-2011 Amber
При использовании материалов ссылка на сайт обязательна
Яндекс.Метрика