ÐÑки â ÑÑо неболÑÑие ÑÑÑоки даннÑÑ , коÑоÑÑе Ñ ÑанÑÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в бÑаÑзеÑе. Ðни ÑвлÑÑÑÑÑ ÑаÑÑÑÑ HTTP-пÑоÑокола, опÑеделÑнного в ÑпеÑиÑикаÑии RFC 6265.
ÐÑки обÑÑно ÑÑÑанавливаÑÑÑÑ Ð²ÐµÐ±-ÑеÑвеÑом пÑи помоÑи заголовка Set-Cookie. ÐаÑем бÑаÑÐ·ÐµÑ Ð±ÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки добавлÑÑÑ Ð¸Ñ
в (поÑÑи) каждÑй запÑÐ¾Ñ Ð½Ð° ÑÐ¾Ñ Ð¶Ðµ домен пÑи помоÑи заголовка Cookie.
Ðдин из наиболее ÑаÑÑÑÑ ÑлÑÑаев иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÑки â ÑÑо аÑÑенÑиÑикаÑиÑ:
- ÐÑи вÑ
оде на ÑÐ°Ð¹Ñ ÑеÑÐ²ÐµÑ Ð¾ÑÑÑÐ»Ð°ÐµÑ Ð² оÑÐ²ÐµÑ HTTP-заголовок
Set-CookieÐ´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑÑÑановиÑÑ ÐºÑки Ñо ÑпеÑиалÑнÑм ÑникалÑнÑм иденÑиÑикаÑоÑом ÑеÑÑии («session identifier»). - Ðо вÑÐµÐ¼Ñ ÑледÑÑÑего запÑоÑа к ÑÑÐ¾Ð¼Ñ Ð¶Ðµ Ð´Ð¾Ð¼ÐµÐ½Ñ Ð±ÑаÑÐ·ÐµÑ Ð¿Ð¾ÑÑÐ»Ð°ÐµÑ Ð½Ð° ÑеÑÐ²ÐµÑ HTTP-заголовок
Cookie. - Таким обÑазом, ÑеÑÐ²ÐµÑ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÑ, кÑо Ñделал запÑоÑ.
ÐÑ Ñакже можем полÑÑиÑÑ Ð´Ð¾ÑÑÑп к кÑки непоÑÑедÑÑвенно из бÑаÑзеÑа, иÑполÑзÑÑ ÑвойÑÑво document.cookie.
ÐÑки имеÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво оÑобенноÑÑей и ÑонкоÑÑей в иÑполÑзовании, и в ÑÑой главе Ð¼Ñ Ð¿Ð¾Ð´Ñобно Ñ Ð½Ð¸Ð¼Ð¸ ÑазбеÑÑмÑÑ.
ЧÑение из document.cookie
Ð¥ÑÐ°Ð½Ð¸Ñ Ð»Ð¸ Ð²Ð°Ñ Ð±ÑаÑÐ·ÐµÑ ÐºÐ°ÐºÐ¸Ðµ-Ñо кÑки Ñ ÑÑого ÑайÑа? ÐоÑмоÑÑим:
// Ðа javascript.info Ð¼Ñ Ð¸ÑполÑзÑем ÑеÑÐ²Ð¸Ñ Google Analytics Ð´Ð»Ñ ÑбоÑа ÑÑаÑиÑÑики,
// поÑÑÐ¾Ð¼Ñ ÐºÐ°ÐºÐ¸Ðµ-Ñо кÑки Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ
alert( document.cookie ); // cookie1=value1; cookie2=value2;...
ÐнаÑение document.cookie ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· Ð¿Ð°Ñ ÐºÐ»ÑÑ=знаÑение, ÑазделÑннÑÑ
;. ÐÐ°Ð¶Ð´Ð°Ñ Ð¿Ð°Ñа пÑедÑÑавлÑÐµÑ Ñобой оÑделÑное кÑки.
ЧÑÐ¾Ð±Ñ Ð½Ð°Ð¹Ñи опÑеделÑнное кÑки, доÑÑаÑоÑно ÑазбиÑÑ ÑÑÑÐ¾ÐºÑ Ð¸Ð· document.cookie по ;, и заÑем найÑи нÑжнÑй клÑÑ. ÐÐ»Ñ ÑÑого Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÐºÐ°Ðº ÑегÑлÑÑнÑе вÑÑажениÑ, Ñак и ÑÑнкÑии Ð´Ð»Ñ Ð¾Ð±ÑабоÑки маÑÑивов.
ÐÑÑавим ÑÑÑ Ð·Ð°Ð´Ð°ÑÑ ÑиÑаÑÐµÐ»Ñ Ð´Ð»Ñ ÑамоÑÑоÑÑелÑного вÑполнениÑ. ÐÑоме Ñого, в конÑе ÑÑой Ð³Ð»Ð°Ð²Ñ Ð²Ñ Ð½Ð°Ð¹Ð´ÑÑе полезнÑе ÑÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ ÐºÑки.
ÐапиÑÑ Ð² document.cookie
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ пиÑаÑÑ Ð² document.cookie. Ðо ÑÑо не пÑоÑÑо ÑвойÑÑво даннÑÑ
, а акcеÑÑÐ¾Ñ (геÑÑеÑ/ÑеÑÑеÑ). ÐÑиÑваивание к Ð½ÐµÐ¼Ñ Ð¾Ð±ÑабаÑÑваеÑÑÑ Ð¾ÑобÑм обÑазом.
ÐапиÑÑ Ð² document.cookie Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ ÑолÑко ÑпомÑнÑÑÑе в ней кÑки, но пÑи ÑÑом не заÑÑÐ¾Ð½ÐµÑ Ð²Ñе оÑÑалÑнÑе.
ÐапÑимеÑ, ÑÑÐ¾Ñ Ð²Ñзов ÑÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ ÐºÑки Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ user и знаÑением John:
document.cookie = "user=John"; // обновлÑем ÑолÑко кÑки Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ 'user'
alert(document.cookie); // показÑваем вÑе кÑки
ÐÑли Ð²Ñ Ð·Ð°Ð¿ÑÑÑиÑе ÑÑÐ¾Ñ ÐºÐ¾Ð´, Ñо, ÑкоÑее вÑего, ÑвидиÑе множеÑÑво кÑки. ÐÑо пÑоиÑÑ
одиÑ, поÑÐ¾Ð¼Ñ ÑÑо опеÑаÑÐ¸Ñ document.cookie= пеÑезапиÑÐµÑ Ð½Ðµ вÑе кÑки, а лиÑÑ ÐºÑки Ñ Ð²ÑÑеÑпомÑнÑÑÑм именем user.
ТеÑ
ниÑеÑки, и Ð¸Ð¼Ñ Ð¸ знаÑение кÑки могÑÑ ÑоÑÑоÑÑÑ Ð¸Ð· лÑбÑÑ
Ñимволов, Ð´Ð»Ñ Ð¿ÑавилÑного ÑоÑмаÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð²ÑÑÑоеннÑÑ ÑÑнкÑÐ¸Ñ encodeURIComponent:
// ÑпеÑиалÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ (пÑобелÑ), ÑÑебÑеÑÑÑ ÐºÐ¾Ð´Ð¸Ñование
let name = "my name";
let value = "John Smith"
// кодиÑÑÐµÑ Ð² my%20name=John%20Smith
document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value);
alert(document.cookie); // ...; my%20name=John%20Smith
СÑÑеÑÑвÑÐµÑ Ð½ÐµÑколÑко огÑаниÑений:
- ÐоÑле
encodeURIComponentпаÑаname=valueне должна занимаÑÑ Ð±Ð¾Ð»ÐµÐµ 4Ðб. Таким обÑазом, Ð¼Ñ Ð½Ðµ можем Ñ ÑаниÑÑ Ð² кÑки болÑÑие даннÑе. - ÐбÑее колиÑеÑÑво кÑки на один домен огÑаниÑиваеÑÑÑ Ð¿ÑимеÑно 20+. ТоÑное огÑаниÑение завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑного бÑаÑзеÑа.
У кÑки еÑÑÑ ÑÑд наÑÑÑоек, многие из коÑоÑÑÑ Ð²Ð°Ð¶Ð½Ñ Ð¸ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑÑÑановленÑ.
ÐÑи наÑÑÑойки ÑказÑваÑÑÑÑ Ð¿Ð¾Ñле паÑÑ ÐºÐ»ÑÑ=знаÑение и оÑÐ´ÐµÐ»ÐµÐ½Ñ Ð´ÑÑг Ð¾Ñ Ð´ÑÑга ÑазделиÑелем ;, Ð²Ð¾Ñ Ñак:
document.cookie = "user=John; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT"
path
path=/mypath
URL-пÑеÑÐ¸ÐºÑ Ð¿ÑÑи, кÑки бÑдÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð´Ð»Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ ÑÑим пÑÑÑм. Ðолжен бÑÑÑ Ð°Ð±ÑолÑÑнÑм. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ ÑекÑÑий пÑÑÑ.
ÐÑли кÑки ÑÑÑановлено Ñ path=/admin, Ñо оно бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпно на ÑÑÑаниÑаÑ
/admin и /admin/something, но не на ÑÑÑаниÑаÑ
/home или /adminpage.
Ðак пÑавило, ÑказÑваÑÑ Ð² каÑеÑÑве пÑÑи коÑÐµÐ½Ñ path=/, ÑÑÐ¾Ð±Ñ Ð½Ð°Ñе кÑки бÑло доÑÑÑпно на вÑеÑ
ÑÑÑаниÑаÑ
ÑайÑа.
domain
domain=site.com
Ðомен опÑеделÑеÑ, где доÑÑÑпен Ñайл кÑки. Ðднако на пÑакÑике ÑÑÑеÑÑвÑÑÑ Ð¾Ð¿ÑеделÑннÑе огÑаниÑениÑ. ÐÑ Ð½Ðµ можем ÑказаÑÑ Ð·Ð´ÐµÑÑ ÐºÐ°ÐºÐ¾Ð¹ Ñгодно домен.
ÐÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð³Ð¾ ÑпоÑоба ÑазÑеÑиÑÑ Ð´Ð¾ÑÑÑп к Ñайлам кÑки из дÑÑгого домена 2-го ÑÑовнÑ, поÑÑÐ¾Ð¼Ñ other.com никогда не полÑÑÐ¸Ñ ÐºÑки, ÑÑÑановленнÑй по адÑеÑÑ site.com.
ÐÑо огÑаниÑение безопаÑноÑÑи, позволÑÑÑее нам Ñ ÑаниÑÑ ÐºÐ¾Ð½ÑиденÑиалÑнÑе даннÑе в ÑÐ°Ð¹Ð»Ð°Ñ ÐºÑки, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ ÑолÑко на одном ÑайÑе.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÐºÑки доÑÑÑÐ¿Ð½Ñ Ð»Ð¸ÑÑ ÑÐ¾Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ, коÑоÑÑй его ÑÑÑановил.
ÐожалÑйÑÑа, обÑаÑиÑе внимание, ÑÑо по ÑмолÑÐ°Ð½Ð¸Ñ Ñайл кÑки Ñакже не пеÑедаÑÑÑÑ Ð¿Ð¾Ð´Ð´Ð¾Ð¼ÐµÐ½Ñ, напÑÐ¸Ð¼ÐµÑ forum.site.com.
// еÑли Ð¼Ñ ÑÑÑановим Ñайл кÑки на веб-ÑайÑе site.com...
document.cookie = "user=John"
// ...Ð¼Ñ Ð½Ðµ Ñвидим его на forum.site.com
alert(document.cookie); // Ð½ÐµÑ user
â¦Ðо ÑÑо можно измениÑÑ. ÐÑли Ð¼Ñ Ñ
оÑим ÑазÑеÑиÑÑ Ð¿Ð¾Ð´Ð´Ð¾Ð¼ÐµÐ½Ð°Ð¼ Ñипа forum.site.com полÑÑаÑÑ ÐºÑки, ÑÑÑановленнÑе на site.com, ÑÑо возможно.
ЧÑÐ¾Ð±Ñ ÑÑо пÑоизоÑло, пÑи ÑÑÑановке Ñайла кÑки в site.com, Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ñвно ÑÑÑановиÑÑ Ð¿Ð°ÑамеÑÑ domain Ð´Ð»Ñ ÐºÐ¾Ñневого домена: domain=site.com. ÐоÑле ÑÑого вÑе Ð¿Ð¾Ð´Ð´Ð¾Ð¼ÐµÐ½Ñ ÑвидÑÑ Ñакой Ñайл cookie.
ÐапÑимеÑ:
// наÑ
одÑÑÑ Ð½Ð° ÑÑÑаниÑе site.com
// Ñделаем кÑки доÑÑÑпнÑм Ð´Ð»Ñ Ð²ÑеÑ
поддоменов *.site.com:
document.cookie = "user=John; domain=site.com"
// позже
// на forum.site.com
alert(document.cookie); // еÑÑÑ ÐºÑки user=John
Ðо иÑÑоÑиÑеÑким пÑиÑинам ÑÑÑановка domain=.site.com (Ñ ÑоÑкой пеÑед site.com) Ñакже ÑабоÑÐ°ÐµÑ Ð¸ ÑазÑеÑÐ°ÐµÑ Ð´Ð¾ÑÑÑп к кÑки Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð². ÐÑо ÑÑаÑÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ, но можно иÑполÑзоваÑÑ Ð¸ еÑ, еÑли нÑжно, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð´ÐµÑживалиÑÑ Ð¾ÑÐµÐ½Ñ ÑÑаÑÑе бÑаÑзеÑÑ.
Таким обÑазом, опÑÐ¸Ñ domain позволÑÐµÑ Ð½Ð°Ð¼ ÑазÑеÑиÑÑ Ð´Ð¾ÑÑÑп к кÑки Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð².
expires, max-age
Ðо ÑмолÑаниÑ, еÑли кÑки не имеÑÑ Ð½Ð¸ одного из ÑÑÐ¸Ñ Ð¿Ð°ÑамеÑÑов, Ñо они ÑдалÑÑÑÑ Ð¿Ñи закÑÑÑии бÑаÑзеÑа. Такие кÑки назÑваÑÑÑÑ ÑеÑÑионнÑми («session cookies»).
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð¼Ð¾ÑÑ ÐºÑки «пеÑежиÑÑ» закÑÑÑие бÑаÑзеÑа, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑÑÑановиÑÑ Ð·Ð½Ð°Ñение опÑий expires или max-age.
expires=Tue, 19 Jan 2038 03:14:07 GMT
ÐаÑа иÑÑеÑÐµÐ½Ð¸Ñ ÑÑока дейÑÑÐ²Ð¸Ñ ÐºÑки, когда бÑаÑÐ·ÐµÑ ÑÐ´Ð°Ð»Ð¸Ñ ÐµÐ³Ð¾ авÑомаÑиÑеÑки.
ÐаÑа должна бÑÑÑ ÑоÑно в ÑÑом ÑоÑмаÑе, во вÑеменной зоне GMT. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ date.toUTCString, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿ÑавилÑнÑÑ Ð´Ð°ÑÑ. ÐапÑимеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑÑÑановиÑÑ ÑÑок дейÑÑÐ²Ð¸Ñ ÐºÑки на 1 денÑ.
// +1 Ð´ÐµÐ½Ñ Ð¾Ñ ÑекÑÑей даÑÑ
let date = new Date(Date.now() + 86400e3);
date = date.toUTCString();
document.cookie = "user=John; expires=" + date;
ÐÑли Ð¼Ñ ÑÑÑановим в expires пÑоÑедÑÑÑ Ð´Ð°ÑÑ, Ñо кÑки бÑÐ´ÐµÑ Ñдалено.
max-age=3600
ÐлÑÑеÑнаÑива expires, опÑеделÑÐµÑ ÑÑок дейÑÑÐ²Ð¸Ñ ÐºÑки в ÑекÑндаÑ
Ñ ÑекÑÑего моменÑа.
ÐÑли задан Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ оÑÑиÑаÑелÑное знаÑение, Ñо кÑки бÑÐ´ÐµÑ Ñдалено:
// кÑки бÑÐ´ÐµÑ Ñдалено ÑеÑез 1 ÑаÑ
document.cookie = "user=John; max-age=3600";
// Ñдалим кÑки (ÑÑок дейÑÑÐ²Ð¸Ñ Ð¸ÑÑÐµÐºÐ°ÐµÑ Ð¿ÑÑмо ÑейÑаÑ)
document.cookie = "user=John; max-age=0";
secure
secure
ÐÑки ÑледÑÐµÑ Ð¿ÐµÑедаваÑÑ ÑолÑко по HTTPS-пÑоÑоколÑ.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÐºÑки, ÑÑÑановленнÑе ÑайÑом http://site.com, Ñакже бÑдÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð½Ð° ÑайÑе https://site.com и наобоÑоÑ.
То еÑÑÑ, кÑки, по ÑмолÑаниÑ, опиÑаÑÑÑÑ Ð½Ð° доменное имÑ, они не обÑаÑаÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð½Ð° пÑоÑоколÑ.
С ÑÑой наÑÑÑойкой, еÑли кÑки бÑÐ´ÐµÑ ÑÑÑановлено на ÑайÑе https://site.com, Ñо оно не бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпно на Ñом же ÑайÑе Ñ Ð¿ÑоÑоколом HTTP, как http://site.com. Таким обÑазом, еÑли в кÑки Ñ
ÑаниÑÑÑ ÐºÐ¾Ð½ÑиденÑиалÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑиÑ, коÑоÑÑÑ Ð½Ðµ ÑледÑÐµÑ Ð¿ÐµÑедаваÑÑ Ð¿Ð¾ незаÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑоÑÐ¾ÐºÐ¾Ð»Ñ HTTP, Ñо нÑжно ÑÑÑановиÑÑ ÑÑÐ¾Ñ Ñлаг.
// пÑедполагаеÑÑÑ, ÑÑо ÑейÑÐ°Ñ Ð¼Ñ Ð½Ð° https://
// ÑÑÑановим опÑÐ¸Ñ secure Ð´Ð»Ñ ÐºÑки (кÑки доÑÑÑпно ÑолÑко ÑеÑез HTTPS)
document.cookie = "user=John; secure";
samesite
ÐÑо еÑÑ Ð¾Ð´Ð½Ð° наÑÑÑойка безопаÑноÑÑи, пÑименÑеÑÑÑ Ð´Ð»Ñ Ð·Ð°ÑиÑÑ Ð¾Ñ Ñак назÑваемой XSRF-аÑаки (межÑайÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÐ»ÐºÐ° запÑоÑа).
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ, как наÑÑÑойка ÑабоÑÐ°ÐµÑ Ð¸ где Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾Ð¹, поÑмоÑÑим на XSRF-аÑаки.
ÐÑака XSRF
ÐÑедÑÑавÑÑе, Ð²Ñ Ð°Ð²ÑоÑизовалиÑÑ Ð½Ð° ÑайÑе bank.com. То еÑÑÑ: Ñ Ð²Ð°Ñ ÐµÑÑÑ ÐºÑки Ð´Ð»Ñ Ð°ÑÑенÑиÑикаÑии Ñ ÑÑого ÑайÑа. ÐÐ°Ñ Ð±ÑаÑÐ·ÐµÑ Ð¾ÑпÑавлÑÐµÑ ÐµÐ³Ð¾ на ÑÐ°Ð¹Ñ bank.com Ñ ÐºÐ°Ð¶Ð´Ñм запÑоÑом, ÑÑÐ¾Ð±Ñ ÑеÑÐ²ÐµÑ ÑÑого ÑайÑа Ñзнавал Ð²Ð°Ñ Ð¸ вÑполнÑл вÑе конÑиденÑиалÑнÑе ÑинанÑовÑе опеÑаÑии.
ТепеÑÑ, пÑоÑмаÑÑÐ¸Ð²Ð°Ñ Ð²ÐµÐ±-ÑÑÑаниÑÑ Ð² дÑÑгом окне, Ð²Ñ ÑлÑÑайно пеÑеÑ
одиÑе на ÑÐ°Ð¹Ñ evil.com, коÑоÑÑй авÑомаÑиÑеÑки оÑпÑавлÑÐµÑ ÑоÑÐ¼Ñ <form action="https://bank.com/pay"> на ÑÐ°Ð¹Ñ bank.com Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð½Ñми полÑми, коÑоÑÑе иниÑииÑÑÑÑ ÑÑанзакÑÐ¸Ñ Ð½Ð° ÑÑÑÑ Ñ
акеÑа.
ÐÑаÑÐ·ÐµÑ Ð¿Ð¾ÑÑÐ»Ð°ÐµÑ ÐºÑки пÑи каждом поÑеÑении bank.com, даже еÑли ÑоÑма бÑла оÑпÑавлена Ñ evil.com. Таким обÑазом, банк ÑÐ·Ð½Ð°ÐµÑ Ð²Ð°Ñ Ð¸ вÑÐ¿Ð¾Ð»Ð½Ð¸Ñ Ð¿Ð»Ð°ÑÑж.
Ð¢Ð°ÐºÐ°Ñ Ð°Ñака назÑваеÑÑÑ Ð¼ÐµÐ¶ÑайÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÐ»ÐºÐ° запÑоÑа (или Cross-Site Request Forgery, XSRF).
ÐонеÑно же, в ÑеалÑной жизни банки заÑиÑÐµÐ½Ñ Ð¾Ñ Ñакой аÑаки. Ðо вÑеÑ
ÑгенеÑиÑованнÑÑ
ÑайÑом bank.com ÑоÑмаÑ
еÑÑÑ ÑпеÑиалÑное поле, Ñак назÑваемÑй «Ñокен заÑиÑÑ Ð¾Ñ xsrf», коÑоÑÑй вÑедоноÑÐ½Ð°Ñ ÑÑÑаниÑа не Ð¼Ð¾Ð¶ÐµÑ Ð½Ð¸ ÑгенеÑиÑоваÑÑ, ни каким-либо обÑазом извлеÑÑ Ð¸Ð· ÑдалÑнной ÑÑÑаниÑÑ (она Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑпÑавиÑÑ ÑоÑÐ¼Ñ ÑÑда, но не Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð°Ð½Ð½Ñе обÑаÑно). Ð ÑÐ°Ð¹Ñ bank.com пÑи полÑÑении ÑоÑÐ¼Ñ Ð¿ÑовеÑÑÐµÑ ÐµÐ³Ð¾ налиÑие.
Ðо ÑÐ°ÐºÐ°Ñ Ð·Ð°ÑиÑа ÑÑебÑÐµÑ ÑÑилий на ÐµÑ ÑеализаÑиÑ: нам нÑжно ÑбедиÑÑÑÑ, ÑÑо в каждой ÑоÑме еÑÑÑ Ð¿Ð¾Ð»Ðµ Ñ Ñокеном, Ñакже Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑовеÑиÑÑ Ð²Ñе запÑоÑÑ.
ÐаÑÑÑойка samesite
ÐаÑамеÑÑ ÐºÑки samesite пÑедоÑÑавлÑÐµÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ ÑпоÑоб заÑиÑÑ Ð¾Ñ ÑакиÑ
аÑак, коÑоÑÑй (ÑеоÑеÑиÑеÑки) не должен ÑÑебоваÑÑ Â«Ñокенов заÑиÑÑ xsrf».
У него еÑÑÑ Ð´Ð²Ð° возможнÑÑ Ð·Ð½Ð°ÑениÑ:
samesite=strict(или, ÑÑо Ñо же Ñамое,samesiteбез знаÑениÑ)
ÐÑки Ñ samesite=strict никогда не оÑпÑавÑÑÑÑ, еÑли полÑзоваÑÐµÐ»Ñ Ð¿ÑиÑÑл не Ñ ÑÑого же ÑайÑа.
ÐÑÑгими Ñловами, еÑли полÑзоваÑÐµÐ»Ñ Ð¿ÐµÑеÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ ÑÑÑлке из поÑÑÑ, оÑпÑавлÑÐµÑ ÑоÑÐ¼Ñ Ñ evil.com или вÑполнÑÐµÑ Ð»ÑбÑÑ Ð´ÑÑгÑÑ Ð¾Ð¿ÐµÑаÑиÑ, пÑоиÑÑ
одÑÑÑÑ Ñ Ð´ÑÑгого домена, Ñо кÑки не оÑпÑавлÑеÑÑÑ.
ÐÑли кÑки имеÑÑ Ð½Ð°ÑÑÑÐ¾Ð¹ÐºÑ samesite, Ñо аÑака XSRF не Ð¸Ð¼ÐµÐµÑ ÑанÑов на ÑÑпеÑ
, поÑÐ¾Ð¼Ñ ÑÑо оÑпÑавка Ñ ÑайÑа evil.com пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð±ÐµÐ· кÑки. Таким обÑазом, ÑÐ°Ð¹Ñ bank.com не ÑаÑÐ¿Ð¾Ð·Ð½Ð°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸ не пÑоизведÑÑ Ð¿Ð»Ð°ÑÑж.
ÐаÑиÑа доволÑно надÑжнаÑ. ÐÑки Ñ Ð½Ð°ÑÑÑойкой samesite бÑÐ´ÐµÑ Ð¾ÑпÑавлено ÑолÑко в Ñом ÑлÑÑае, еÑли опеÑаÑии пÑоиÑÑ
одÑÑ Ñ ÑайÑа bank.com, напÑÐ¸Ð¼ÐµÑ Ð¾ÑпÑавка ÑоÑÐ¼Ñ Ñделана Ñо ÑÑÑаниÑÑ Ð½Ð° bank.com.
ХоÑÑ ÐµÑÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑие неÑдобÑÑва.
Ðогда полÑзоваÑÐµÐ»Ñ Ð¿ÐµÑейдÑÑ Ð¿Ð¾ ÑÑÑлке на bank.com, напÑÐ¸Ð¼ÐµÑ Ð¸Ð· ÑвоиÑ
замеÑок, он бÑÐ´ÐµÑ ÑдивлÑн, ÑÑо ÑÐ°Ð¹Ñ bank.com не Ñзнал его. ÐейÑÑвиÑелÑно, кÑки Ñ samesite=strict в ÑÑом ÑлÑÑае не оÑпÑавлÑеÑÑÑ.
ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð¾Ð±Ð¾Ð¹Ñи ÑÑо огÑаниÑение, иÑполÑзÑÑ Ð´Ð²Ð° кÑки: одно кÑки Ð´Ð»Ñ Â«Ð¾Ð±Ñего ÑзнаваниÑ», ÑолÑко Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð·Ð´Ð¾ÑоваÑÑÑÑ: «ÐÑивеÑ, Ðжон», и дÑÑгое кÑки Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑий Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
Ñ samesite=strict. Тогда полÑзоваÑелÑ, пÑиÑедÑий на ÑайÑ, ÑÐ²Ð¸Ð´Ð¸Ñ Ð¿ÑивеÑÑÑвие, но плаÑежи нÑжно иниÑииÑоваÑÑ Ñ ÑайÑа банка, ÑÑÐ¾Ð±Ñ Ð¾ÑпÑавилоÑÑ Ð²ÑоÑое кÑки.
samesite=lax
ÐÑо более мÑгкий ваÑианÑ, коÑоÑÑй Ñакже заÑиÑÐ°ÐµÑ Ð¾Ñ XSRF и пÑи ÑÑом не поÑÑÐ¸Ñ Ð²Ð¿ÐµÑаÑление Ð¾Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑайÑа.
Режим Lax Ñак же, как и strict, запÑеÑÐ°ÐµÑ Ð±ÑаÑзеÑÑ Ð¾ÑпÑавлÑÑÑ ÐºÑки, когда запÑÐ¾Ñ Ð¿ÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½Ðµ Ñ ÑайÑа, но добавлÑÐµÑ Ð¾Ð´Ð½Ð¾ иÑклÑÑение.
ÐÑки Ñ samesite=lax оÑпÑавлÑеÑÑÑ, еÑли два ÑÑиÑ
ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð²ÐµÑнÑ:
-
ÐÑполÑзÑÑÑÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑе HTTP-меÑÐ¾Ð´Ñ (напÑимеÑ, GET, но не POST).
ÐолнÑй ÑпиÑок безопаÑнÑÑ HTTP-меÑодов можно поÑмоÑÑеÑÑ Ð² ÑпеÑиÑикаÑии RFC7231. Ðо ÑÑÑи, безопаÑнÑми ÑÑиÑаÑÑÑÑ Ð¼ÐµÑодÑ, коÑоÑÑе обÑÑно иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ ÑÑениÑ, но не Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи даннÑÑ . Ðни не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑполнÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð¾Ð¿ÐµÑаÑий на изменение даннÑÑ . ÐеÑÐµÑ Ð¾Ð´ по ÑÑÑлке ÑвлÑеÑÑÑ Ð²Ñегда GET-меÑодом, Ñо еÑÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑм.
-
ÐпеÑаÑÐ¸Ñ Ð¾ÑÑÑеÑÑвлÑÐµÑ Ð½Ð°Ð²Ð¸Ð³Ð°ÑÐ¸Ñ Ð²ÐµÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ (изменÑÐµÑ URL в адÑеÑной ÑÑÑоке бÑаÑзеÑа).
ÐбÑÑно ÑÑо Ñак, но еÑли навигаÑÐ¸Ñ Ð²ÑполнÑеÑÑÑ Ð²
<iframe>, Ñо ÑÑо не веÑÑ Ð½Ð¸Ð¹ ÑÑовенÑ. ÐÑоме Ñого, JavaScript-меÑÐ¾Ð´Ñ Ð´Ð»Ñ ÑеÑевÑÑ Ð·Ð°Ð¿ÑоÑов не вÑполнÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ навигаÑии, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ не Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ.
Таким обÑазом, Ñежим samesite=lax, позволÑÐµÑ Ñамой ÑаÑпÑоÑÑÑанÑнной опеÑаÑии «пеÑеÑ
од по ÑÑÑлке» пеÑедаваÑÑ ÐºÑки. ÐапÑимеÑ, оÑкÑÑÑие ÑайÑа из замеÑок ÑдовлеÑвоÑÑÐµÑ ÑÑим ÑÑловиÑм.
Ðо ÑÑо-Ñо более Ñложное, напÑимеÑ, ÑеÑевой запÑÐ¾Ñ Ñ Ð´ÑÑгого ÑайÑа или оÑпÑавка ÑоÑмÑ, ÑеÑÑÐµÑ ÐºÑки.
ÐÑли ÑÑо вам подÑ
одиÑ, Ñо добавление samesite=lax, ÑкоÑее вÑего, не иÑпоÑÑÐ¸Ñ Ð²Ð¿ÐµÑаÑление полÑзоваÑелей Ð¾Ñ ÑабоÑÑ Ñ ÑайÑом и Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ Ð·Ð°ÑиÑÑ.
Ð Ñелом, samesite оÑлиÑÐ½Ð°Ñ Ð½Ð°ÑÑÑойка.
Ðо Ñ Ð½ÐµÑ ÐµÑÑÑ Ð²Ð°Ð¶Ð½Ñй недоÑÑаÑок:
samesiteигноÑиÑÑеÑÑÑ (не поддеÑживаеÑÑÑ) ÑÑаÑÑми бÑаÑзеÑами, вÑпÑÑеннÑми до 2017 года и Ñанее.
Так ÑÑо, еÑли Ð¼Ñ Ð±Ñдем полагаÑÑÑÑ Ð¸ÑклÑÑиÑелÑно на samesite, Ñо ÑÑаÑÑе бÑаÑзеÑÑ Ð±ÑдÑÑ ÑÑзвимÑ.
Ðо мÑ, безÑÑловно, можем иÑполÑзоваÑÑ samesite вмеÑÑе Ñ Ð´ÑÑгими меÑодами заÑиÑÑ, Ñакими как XSRF-ÑокенÑ, ÑÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑй Ñлой заÑиÑÑ, а заÑем, в бÑдÑÑем, когда ÑÑаÑÑе бÑаÑзеÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¸ÑÑезнÑÑ, мÑ, веÑоÑÑно, Ñможем полноÑÑÑÑ ÑдалиÑÑ XSRF-ÑокенÑ.
httpOnly
ÐÑа наÑÑÑойка не Ð¸Ð¼ÐµÐµÑ Ð½Ð¸Ñего обÑего Ñ JavaScript, но Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑпомÑнÑÑÑ ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑ Ð¸Ð·Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ.
Ðеб-ÑеÑÐ²ÐµÑ Ð¸ÑполÑзÑÐµÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Set-Cookie Ð´Ð»Ñ ÑÑÑановки кÑки. Рон Ð¼Ð¾Ð¶ÐµÑ ÑÑÑановиÑÑ Ð½Ð°ÑÑÑÐ¾Ð¹ÐºÑ httpOnly.
ÐÑа наÑÑÑойка запÑеÑÐ°ÐµÑ Ð»Ñбой доÑÑÑп к кÑки из JavaScript. ÐÑ Ð½Ðµ можем видеÑÑ Ñакое кÑки или манипÑлиÑоваÑÑ Ð¸Ð¼ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ document.cookie.
ÐÑа наÑÑÑойка иÑполÑзÑеÑÑÑ Ð² каÑеÑÑве меÑÑ Ð¿ÑедоÑÑоÑожноÑÑи Ð¾Ñ Ð¾Ð¿ÑеделÑннÑÑ Ð°Ñак, когда Ñ Ð°ÐºÐµÑ Ð²Ð½ÐµÐ´ÑÑÐµÑ Ñвой ÑобÑÑвеннÑй JavaScript-код в ÑÑÑаниÑÑ Ð¸ ждÑÑ, когда полÑзоваÑÐµÐ»Ñ Ð¿Ð¾ÑеÑÐ¸Ñ ÐµÑ. ÐÑо вообÑе не должно бÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм, Ñ Ð°ÐºÐµÑ Ð½Ðµ должен бÑÑÑ Ð² ÑоÑÑоÑнии внедÑиÑÑ Ñвой код на Ð²Ð°Ñ ÑайÑ, но могÑÑ Ð±ÑÑÑ Ð¾Ñибки, коÑоÑÑе позволÑÑ Ñ Ð°ÐºÐµÑÑ ÑделаÑÑ ÑÑо.
ÐбÑÑно, еÑли Ñакое пÑоиÑÑ
одиÑ, и полÑзоваÑÐµÐ»Ñ Ð·Ð°Ñ
Ð¾Ð´Ð¸Ñ Ð½Ð° ÑÑÑаниÑÑ Ñ JavaScript-кодом Ñ
акеÑа, Ñо ÑÑÐ¾Ñ ÐºÐ¾Ð´ вÑполнÑеÑÑÑ Ð¸ полÑÑÐ°ÐµÑ Ð´Ð¾ÑÑÑп к document.cookie, и Ñем ÑамÑм к кÑки полÑзоваÑелÑ, коÑоÑÑе ÑодеÑÐ¶Ð°Ñ Ð°ÑÑенÑиÑикаÑионнÑÑ Ð¸Ð½ÑоÑмаÑиÑ. ÐÑо плоÑ
о.
Ðо еÑли кÑки Ð¸Ð¼ÐµÐµÑ Ð½Ð°ÑÑÑÐ¾Ð¹ÐºÑ httpOnly, Ñо document.cookie не Ð²Ð¸Ð´Ð¸Ñ ÐµÐ³Ð¾, поÑÑÐ¾Ð¼Ñ Ñакое кÑки заÑиÑено.
ÐÑиложение: ФÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ ÐºÑки
ÐÐ¾Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑой Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий Ð´Ð»Ñ ÑабоÑÑ Ñ ÐºÑки, более ÑдобнÑÑ
, Ñем ÑÑÑÐ½Ð°Ñ Ð¼Ð¾Ð´Ð¸ÑикаÑÐ¸Ñ document.cookie.
ÐÐ»Ñ ÑÑого ÑÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво библиоÑек, Ñак ÑÑо они, ÑкоÑее, в демонÑÑÑаÑионнÑÑ ÑелÑÑ . Ðо пÑи ÑÑом полноÑÑÑÑ ÑабоÑие.
getCookie(name)
СамÑй коÑоÑкий ÑпоÑоб полÑÑиÑÑ Ð´Ð¾ÑÑÑп к кÑки â ÑÑо иÑполÑзоваÑÑ ÑегÑлÑÑнÑе вÑÑажениÑ.
ФÑнкÑÐ¸Ñ getCookie(name) возвÑаÑÐ°ÐµÑ ÐºÑки Ñ ÑказаннÑм name:
// возвÑаÑÐ°ÐµÑ ÐºÑки Ñ ÑказаннÑм name,
// или undefined, еÑли ниÑего не найдено
function getCookie(name) {
let matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : undefined;
}
ÐдеÑÑ new RegExp генеÑиÑÑеÑÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки, ÑÑÐ¾Ð±Ñ Ð½Ð°Ñ
одиÑÑ ; name=<value>.
ÐбÑаÑиÑе внимание, знаÑение кÑки кодиÑÑеÑÑÑ, поÑÑÐ¾Ð¼Ñ getCookie иÑполÑзÑÐµÑ Ð²ÑÑÑоеннÑÑ ÑÑнкÑÐ¸Ñ decodeURIComponent Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸ÑованиÑ.
setCookie(name, value, options)
УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÐºÑки Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ name и знаÑением value, Ñ Ð½Ð°ÑÑÑойкой path=/ по ÑмолÑÐ°Ð½Ð¸Ñ (можно измениÑÑ, ÑÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð´ÑÑгие знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ):
function setCookie(name, value, options = {}) {
options = {
path: '/',
// пÑи необÑ
одимоÑÑи добавÑÑе дÑÑгие знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ
...options
};
if (options.expires instanceof Date) {
options.expires = options.expires.toUTCString();
}
let updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);
for (let optionKey in options) {
updatedCookie += "; " + optionKey;
let optionValue = options[optionKey];
if (optionValue !== true) {
updatedCookie += "=" + optionValue;
}
}
document.cookie = updatedCookie;
}
// ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзованиÑ:
setCookie('user', 'John', {secure: true, 'max-age': 3600});
deleteCookie(name)
ЧÑÐ¾Ð±Ñ ÑдалиÑÑ ÐºÑки, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑÑÑановиÑÑ Ð¾ÑÑиÑаÑелÑнÑÑ Ð´Ð°ÑÑ Ð¸ÑÑеÑÐµÐ½Ð¸Ñ ÑÑока дейÑÑвиÑ:
function deleteCookie(name) {
setCookie(name, "", {
'max-age': -1
})
}
ÐбÑаÑиÑе внимание: когда Ð¼Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»Ñем или ÑдалÑем кÑки, нам ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ ÑолÑко Ñакие же наÑÑÑойки пÑÑи и домена, как пÑи ÑÑÑановке кÑки.
ÐÑÑ Ð²Ð¼ÐµÑÑе: cookie.js.
ÐÑиложение: СÑоÑонние кÑки
ÐÑки назÑваÑÑÑÑ ÑÑоÑонними, еÑли они ÑазмеÑÐµÐ½Ñ Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°, оÑлиÑаÑÑегоÑÑ Ð¾Ñ ÑÑÑаниÑÑ, коÑоÑÑÑ Ð¿Ð¾ÑеÑÐ°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑ.
ÐапÑимеÑ:
-
СÑÑаниÑа
site.comзагÑÑÐ¶Ð°ÐµÑ Ð±Ð°Ð½Ð½ÐµÑ Ñ Ð´ÑÑгого ÑайÑа:<img src="https://ads.com/banner.png">. -
ÐмеÑÑе Ñ Ð±Ð°Ð½Ð½ÐµÑом ÑдалÑннÑй ÑеÑвеÑ
ads.comÐ¼Ð¾Ð¶ÐµÑ ÑÑÑановиÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾ÐºSet-CookieÑ ÐºÑки, напÑимеÑ,id=1234. Такие кÑки ÑоздаÑÑÑÑ Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°ads.comи бÑдÑÑ Ð²Ð¸Ð´Ð½Ñ ÑолÑко на ÑайÑеads.com: -
Ð ÑледÑÑÑий Ñаз пÑи доÑÑÑпе к
ads.comÑдалÑннÑй ÑеÑÐ²ÐµÑ Ð¿Ð¾Ð»ÑÑÐ¸Ñ ÐºÑкиidи ÑаÑÐ¿Ð¾Ð·Ð½Ð°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑ: -
ЧÑо еÑÑ Ð±Ð¾Ð»ÐµÐµ важно, когда полÑзоваÑÐµÐ»Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð¸Ñ Ñ
site.comна дÑÑгой ÑайÑother.com, на коÑоÑом Ñоже еÑÑÑ Ð±Ð°Ð½Ð½ÐµÑ, Ñоads.comполÑÑÐ¸Ñ ÐºÑки, Ñак как они пÑинадлежаÑads.com, Ñаким обÑазомads.comÑаÑÐ¿Ð¾Ð·Ð½Ð°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸ Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑлеживаÑÑ ÐµÐ³Ð¾ пеÑемеÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÑайÑами:
СÑоÑонние кÑки в ÑÐ¸Ð»Ñ Ñвоей ÑпеÑиÑики обÑÑно иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ñелей оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑеÑаемÑÑ Ð¿Ð¾Ð»ÑзоваÑелем ÑÑÑÐ°Ð½Ð¸Ñ Ð¸ показа ÑекламÑ. Ðни пÑивÑÐ·Ð°Ð½Ñ Ðº иÑÑ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ, поÑÑÐ¾Ð¼Ñ ads.com Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑлеживаÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ и Ñого же полÑзоваÑÐµÐ»Ñ Ð½Ð° ÑазнÑÑ ÑайÑÐ°Ñ , еÑли оÑÑÑда идÑÑ Ð¾Ð±ÑаÑение к немÑ.
ÐÑÑеÑÑвенно, некоÑоÑÑм полÑзоваÑелÑм не нÑавиÑÑÑ, когда Ð¸Ñ Ð¾ÑÑлеживаÑÑ, поÑÑÐ¾Ð¼Ñ Ð±ÑаÑзеÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð¾ÑклÑÑаÑÑ Ñакие кÑки.
ÐÑоме Ñого, некоÑоÑÑе ÑовÑеменнÑе бÑаÑзеÑÑ Ð¸ÑполÑзÑÑÑ ÑпеÑиалÑнÑе полиÑики Ð´Ð»Ñ ÑÐ°ÐºÐ¸Ñ ÐºÑки:
- Safari вообÑе не ÑазÑеÑÐ°ÐµÑ ÑÑоÑонние кÑки.
- У Firefox еÑÑÑ Â«ÑÑÑнÑй ÑпиÑок» ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð², ÑÑи ÑÑоÑонние кÑки он блокиÑÑеÑ.
ÐÑли Ð¼Ñ Ð·Ð°Ð³ÑÑжаем ÑкÑÐ¸Ð¿Ñ Ñо ÑÑоÑоннего домена, напÑÐ¸Ð¼ÐµÑ <script src="https://google-analytics.com/analytics.js">, и ÑÑÐ¾Ñ ÑкÑÐ¸Ð¿Ñ Ð¸ÑполÑзÑÐµÑ document.cookie, ÑÑÐ¾Ð±Ñ ÑÑÑановиÑÑ ÐºÑки, Ñо Ñакое кÑки не ÑвлÑеÑÑÑ ÑÑоÑонним.
ÐÑли ÑкÑÐ¸Ð¿Ñ ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÐºÑки, Ñо Ð½ÐµÑ ÑазниÑÑ Ð¾ÑкÑда бÑл загÑÑжен ÑкÑÐ¸Ð¿Ñ â кÑки пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ ÑекÑÑей веб-ÑÑÑаниÑÑ.
ÐÑиложение: GDPR
ÐÑа Ñема вообÑе не ÑвÑзана Ñ JavaScript, но ÑледÑÐµÑ ÐµÑ Ð¸Ð¼ÐµÑÑ Ð² Ð²Ð¸Ð´Ñ Ð¿Ñи ÑÑÑановке кÑки.
Ð ÐвÑопе ÑÑÑеÑÑвÑÐµÑ Ð·Ð°ÐºÐ¾Ð½Ð¾Ð´Ð°ÑелÑÑÑво под названием GDPR, коÑоÑое ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð´Ð»Ñ ÑайÑов ÑÑд пÑавил, обеÑпеÑиваÑÑÐ¸Ñ ÐºÐ¾Ð½ÑиденÑиалÑноÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелей. Родним из ÑÐ°ÐºÐ¸Ñ Ð¿Ñавил ÑвлÑеÑÑÑ ÑÑебование Ñвного ÑазÑеÑÐµÐ½Ð¸Ñ Ð¾Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð½Ð° иÑполÑзование оÑÑлеживаÑÑÐ¸Ñ ÐºÑки.
ÐбÑаÑиÑе внимание, ÑÑо оÑноÑиÑÑÑ ÑолÑко к кÑки, иÑполÑзÑемÑм Ð´Ð»Ñ Ð¾ÑÑлеживаниÑ/иденÑиÑикаÑии/авÑоÑизаÑии.
То еÑÑÑ, еÑли Ð¼Ñ ÑÑÑановим кÑки, коÑоÑÑе пÑоÑÑо ÑÐ¾Ñ ÑанÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð¸Ð½ÑоÑмаÑиÑ, но не оÑÑлеживаÑÑ Ð¸ не иденÑиÑиÑиÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ, Ñо Ð¼Ñ ÑÐ²Ð¾Ð±Ð¾Ð´Ð½Ñ Ð¾Ñ ÑÑого пÑавила.
Ðо еÑли Ð¼Ñ ÑобиÑаемÑÑ ÑÑÑановиÑÑ ÐºÑки Ñ Ð¸Ð½ÑоÑмаÑией об аÑÑенÑиÑикаÑии или Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом оÑÑлеживаниÑ, Ñо полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ Ñвно ÑазÑеÑиÑÑ ÑÑо.
ÐÑÑÑ Ð´Ð²Ð° оÑновнÑÑ Ð²Ð°ÑианÑа как ÑайÑÑ ÑледÑÑÑ GDPR. ÐÑ Ð½Ð°Ð²ÐµÑнÑка Ñже видели Ð¸Ñ Ð² ÑеÑи:
-
ÐÑли ÑÐ°Ð¹Ñ Ñ Ð¾ÑÐµÑ ÑÑÑановиÑÑ ÐºÑки Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÑолÑко Ð´Ð»Ñ Ð°Ð²ÑоÑизованнÑÑ Ð¿Ð¾Ð»ÑзоваÑелей.
То в ÑегиÑÑÑаÑионной ÑоÑме должен бÑÑÑ ÑÑÑановлен Ñлажок «пÑинÑÑÑ Ð¿Ð¾Ð»Ð¸ÑÐ¸ÐºÑ ÐºÐ¾Ð½ÑиденÑиалÑноÑÑи» (коÑоÑÐ°Ñ Ð¾Ð¿ÑеделÑеÑ, как иÑполÑзÑÑÑÑÑ ÐºÑки), полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑÑÑановиÑÑ ÐµÐ³Ð¾, и ÑолÑко Ñогда ÑÐ°Ð¹Ñ ÑÐ¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ Ð°Ð²ÑоÑизаÑионнÑе кÑки.
-
ÐÑли ÑÐ°Ð¹Ñ Ñ Ð¾ÑÐµÑ ÑÑÑановиÑÑ ÐºÑки Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ñем полÑзоваÑелÑм.
ЧÑÐ¾Ð±Ñ ÑделаÑÑ ÑÑо законно, ÑÐ°Ð¹Ñ Ð¿Ð¾ÐºÐ°Ð·ÑÐ²Ð°ÐµÑ Ð¼Ð¾Ð´Ð°Ð»Ñное окно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелей, коÑоÑÑе заÑли в пеÑвÑй Ñаз, и ÑÑебÑÐµÑ Ð¾Ñ Ð½Ð¸Ñ ÑоглаÑие на иÑполÑзование кÑки. ÐаÑем ÑÐ°Ð¹Ñ Ð¼Ð¾Ð¶ÐµÑ ÑÑÑановиÑÑ Ñакие кÑки и показаÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÑодеÑжимое ÑÑÑаниÑÑ. ХоÑÑ ÑÑо ÑоздаÑÑ Ð½ÐµÑдобÑÑва Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ Ð¿Ð¾ÑеÑиÑелей â Ð½Ð¸ÐºÐ¾Ð¼Ñ Ð½Ðµ нÑавиÑÑÑ Ð½Ð°Ð±Ð»ÑдаÑÑ Ð¼Ð¾Ð´Ð°Ð»ÑнÑе окна вмеÑÑо конÑенÑа. Ðо GDPR в данной ÑиÑÑаÑии ÑÑебÑÐµÑ Ñвного ÑоглаÑÐ¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ.
GDPR каÑаеÑÑÑ Ð½Ðµ ÑолÑко кÑки, но и дÑÑÐ³Ð¸Ñ Ð²Ð¾Ð¿ÑоÑов, ÑвÑзаннÑÑ Ñ ÐºÐ¾Ð½ÑиденÑиалÑноÑÑÑÑ, коÑоÑÑе вÑÑ Ð¾Ð´ÑÑ Ð·Ð° Ñамки маÑеÑиала ÑÑой главÑ.
ÐÑого
document.cookie пÑедоÑÑавлÑÐµÑ Ð´Ð¾ÑÑÑп к кÑки.
- ÐпеÑаÑÐ¸Ñ Ð·Ð°Ð¿Ð¸Ñи изменÑÐµÑ ÑолÑко Ñо кÑки, коÑоÑое бÑло Ñказано.
- ÐÐ¼Ñ Ð¸ знаÑение кÑки Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°ÐºÐ¾Ð´Ð¸ÑованÑ.
- Ðдно кÑки вмеÑÐ°ÐµÑ Ð´Ð¾ 4kb даннÑÑ , ÑазÑеÑаеÑÑÑ Ð±Ð¾Ð»ÐµÐµ 20 кÑки на ÑÐ°Ð¹Ñ (завиÑÐ¸Ñ Ð¾Ñ Ð±ÑаÑзеÑа).
ÐаÑÑÑойки кÑки:
path=/, по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑанавливаеÑÑÑ ÑекÑÑий пÑÑÑ, Ð´ÐµÐ»Ð°ÐµÑ ÐºÑки видимÑм ÑолÑко по ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи и ниже.domain=site.com, по ÑмолÑÐ°Ð½Ð¸Ñ ÐºÑки видно ÑолÑко на ÑекÑÑем домене, еÑли Ñвно Ñказан домен, Ñо кÑки видно и на Ð¿Ð¾Ð´Ð´Ð¾Ð¼ÐµÐ½Ð°Ñ .expiresилиmax-ageÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð´Ð°ÑÑ Ð¸ÑÑеÑÐµÐ½Ð¸Ñ ÑÑока дейÑÑвиÑ, без Ð½Ð¸Ñ ÐºÑки ÑмÑÑÑ Ð¿Ñи закÑÑÑии бÑаÑзеÑа.secureÐ´ÐµÐ»Ð°ÐµÑ ÐºÑки доÑÑÑпнÑм ÑолÑко пÑи иÑполÑзовании HTTPS.samesiteзапÑеÑÐ°ÐµÑ Ð±ÑаÑзеÑÑ Ð¾ÑпÑавлÑÑÑ ÐºÑки Ñ Ð·Ð°Ð¿ÑоÑами, поÑÑÑпаÑÑими извне, Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð¿ÑедоÑвÑаÑиÑÑ XSRF-аÑаки.
ÐополниÑелÑно:
- СÑоÑонние кÑки могÑÑ Ð±ÑÑÑ Ð·Ð°Ð¿ÑеÑÐµÐ½Ñ Ð±ÑаÑзеÑом, напÑÐ¸Ð¼ÐµÑ Safari Ð´ÐµÐ»Ð°ÐµÑ ÑÑо по ÑмолÑаниÑ.
- УÑÑановка оÑÑлеживаÑÑÐ¸Ñ ÐºÑки полÑзоваÑелÑм из ÑÑÑан ÐС ÑÑебÑÐµÑ Ð¸Ñ Ñвного ÑоглаÑÐ¸Ñ Ð½Ð° ÑÑо в ÑооÑвеÑÑÑвии Ñ Ð·Ð°ÐºÐ¾Ð½Ð¾Ð´Ð°ÑелÑÑÑвом GDPR.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)