Методы похищения файлов cookie. Хранение данных Javascript как передавать значения в cookies
Всем привет!
JS не предоставляет удобного API для работы с cookies. И это в принципе не плохо, могло бы быть и хуже (например js вообще не реализовывал бы работы с куками), но все же, лучше, когда можно читать куки с помощью одной инструкции (чего пока нативным js - невозможно).
Существует множество framework"ов и plugin"ов к ним, которые восполняют данный недостаток. Однако бывают проекты где нецелесообразно подключать framework лишь для удобства работы с куками.
Собственно мною была поставлена и реализована задача создания методов по управлению куками, с красивыми аксессорами типа:
Cookie.set("bla", "blabla");
cookie.get("bla");
code.google.com/p/jscookie - страничка на гуглокоде
Немножечко теории о механизме предоставляемом js"ом для работы с cookie:
Все что у нас есть - свойство document.cookie, оно не реализует за собой никаких привычных рядовому программисту методов, типа document.cookie.get("bla");
Чтение cookie document.cookie содержит набор значений cookie_name=cookie_value; (разделенных между собой "; " (точка с запятой плюс пробел)), отсюда следует, что бы получить значение конкретной куки - необходимо пропарсить всю строку и выдернуть необходимые данные. Что примечательно, в свойстве содержится пары имя=значение, никаких дополнительный данных о куках таких как: expires time, path, domain, secure - не содержит.Создание/обновление cookie document.cookie ведет себя как строка, но не обычная. представим что у нас есть 2 куки key1 = val1 и key2 = val2.Alert(document.cookie) //key1=val1; key2=val2;
Для того что бы добавить новую куку key3 = val3
Document.cookie= "key3=val3; ";
alert(document.cookie) //key1=val1; key2=val2; key3=val3;
Для того что бы обновить куку, зададим key2 значение hello world
Document.cookie= "key2=hello world; ";
alert(document.cookie) //key1=val1; key2=hello world; key3=val3;
Кука помимо названия и значения имеет в своем арсенале еще несколько важных свойств, а именно:
Expires - время, после которого кука удаляется.
domain - домен для которого кука действительна, грубо говоря, если кука была создана на домене js.com, то ни на каком другом домене она не будет видна.
path - множество документов, при запросе на которые браузер будет посылать куку
secure - свойство-флаг разрешающий посылать браузуру куку только при https соединении
Вообщем все это записывается в виде document.cookie = "key4=val4;
Фокус с удалением куки состоит в том что бы обновить куку со свойством expires указывающим в прошлое, например:
Document.cookie= "key2=; expires=Mon, 05 Jul 1982 16:37:55 GMT; ";
alert(document.cookie)//key1=val1; key3=val3;
Собственно все
UPD: это мой первый пост, прошу сильно не пинать. Надеюсь кому то будет полезно
Последнее обновление: 1.11.2015
Одну из возможностей сохранения данных в javascript представляет использование куки. Для работы с куками в объекте document предназначено свойство cookie .
Для установки куков достаточно свойству document.cookie присвоить строку с куками:
document.cookie = "login=tom32;";
В данном случае устанавливается кука, которая называется "login" и которая имеет значение "tom32". И в большинстве браузеров мы можем посмотреть ее, узнать всю информацию о ней и в дальнейшем ее можно использовать в приложении:
Строка куки принимает до шести различных параметров: имя куки, значение, срок окончания действия (expires), путь (path), домен (domain) и secure. Выше использовались только два параметра: имя куки и значение. То есть в случае со строкой "login=tom32;" куки имеет имя login и значение tom32.
Но подобная куки имеет очень ограниченный срок жизни: если явным образом не установить срок действия, то кука будет удалена с закрытием браузера. Подобная ситуация, возможно, идеальна для тех случаев, когда необходимо удалять всю информацию после завершения работы с веб-приложением и закрытия браузера. Однако данное поведение не всегда подходит.
И в этом случае нам надо установить параметр expires , то есть срок действия куков:
То есть срок действия куки login истекает в понедельник 31 августа 2015 года в 00:00. Формат параметра expires очень важен. Однако его можно сгенерировать программно. Для этого мы можем использовать метод toUTCString() объекта Date:
Var expire = new Date(); expire.setHours(expire.getHours() + 4); document.cookie = "login=tom32;expires=" + expire.toUTCString() + ";";
В данном случае срок действия куки будет составлять 4 часа.
Если в друг нам надо установить куки для какого-то определенного пути на сайте, то мы можем использовать параметр path . Например, мы хотим установить куки только для пути www.mysite.com/home :
В этом случае для других путей на сайте, например, www.mysite.com/shop , эти куки будут недоступны.
Если на нашем сайте есть несколько доменов, и мы хотим установить куки непосредственно для определенного домена, тогда можно использовать параметр domain . Например, у нас на сайте есть поддомен blog.mysite.com :
Document.cookie = "login=tom32;expires=Mon, 31 Aug 2015 00:00:00 GMT;path=/;domain=blog.mysite.com;";
Параметр path=/ указывает, что куки будут доступны для всех директорий и путей поддомена blog.mysite.com.
Последний параметр - secure задает использование SSL (SecureSockets Layer) и подходит для сайтов, использующих протокол https. Если значение этого параметра равно true , то куки будут использоваться только при установке защищенного соединения ssl. По умолчанию данный параметр равен false.
Document.cookie = "login=tom32;expires=Mon, 31 Aug 2015 00:00:00 GMT;path=/;domain=blog.mysite.com;secure=true;";
Получение кукиДля простейшего извлечения куки из браузера достаточно обратиться к свойству document.cookie :
Var expire = new Date(); expire.setHours(expire.getHours() + 4); document.cookie = "city=Berlin;expires="+expire.toUTCString()+";"; document.cookie = "country=Germany;expires="+expire.toUTCString()+";"; document.cookie = "login=tom32;"; document.write(document.cookie);
Здесь были установлены три куки, и браузер выведет нам все эти куки:
Извлеченные куки не включают параметры expires, path, domain и secure . Кроме того, сами куки разделяются точкой с запятой, поэтому нужно еще провести некоторые преобразования, чтобы получить их имя и значение:
Var cookies = document.cookie.split(";"); for(var i=0; i