Bagikan cookie antara subdomain dan domain

422

Saya punya dua pertanyaan. Saya mengerti bahwa jika saya menentukan domain sebagai .mydomain.com(dengan titik terkemuka) di cookie yang semua subdomain dapat membagikan cookie.

Bisakah subdomain.mydomain.commengakses cookie yang dibuat di mydomain.com(tanpa wwwsubdomain)?

Bisakah mydomain.com(tanpa wwwsubdomain) mengakses cookie jika dibuat subdomain.mydomain.com?

adam0101
sumber
3
Ya Anda bisa .. silakan lihat tautan di bawah ini codeguru.com/csharp/csharp/cs_internet/article.php/c19417/…
Rahul Jain
Terkait erat: stackoverflow.com/questions/3089199/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件
dapatkah Anda melihat pertanyaan ini stackoverflow.com/questions/38351769/…
Jayavardhan Gange
1
@ adam0101 Bagaimana jika domain dan sub-domain di-host di server yang berbeda?
user3782114
3
@ user3782114, tidak masalah jika mereka berada di server yang berbeda. Dalam kasus saya, mereka tidak hanya di server yang berbeda, tetapi setiap domain seimbang di beberapa server. Satu hal yang membuat kami sedikit tersandung adalah bahwa lingkungan yang lebih rendah (dev, test, uat, dll) mulai berbagi cookie yang sama juga setelah kami melakukan ini karena kami menamakannya seperti "dev.oursite.com", "test. oursite.com ", dll. Kuncinya di sana (setidaknya dalam .Net) adalah memiliki kunci mesin terpisah yang dihasilkan untuk setiap lingkungan dan menyimpannya di Web.config Anda (dengan asumsi Anda mengubah konfigurasi untuk setiap lingkungan).
adam0101

Jawaban:

655

2 domain mydomain.comdan subdomain.mydomain.comhanya dapat membagikan cookie jika domain secara eksplisit disebutkan di Set-Cookieheader. Kalau tidak, ruang lingkup cookie dibatasi untuk host permintaan. (Ini disebut sebagai "cookie hanya host". Lihat Apa itu cookie hanya host? )

Misalnya, jika Anda mengirim tajuk berikut dari subdomain.mydomain.com, maka cookie tidak akan dikirim untuk permintaan ke mydomain.com:

Set-Cookie: name=value

Namun jika Anda menggunakan yang berikut ini, itu akan dapat digunakan di kedua domain:

Set-Cookie: name=value; domain=mydomain.com

Cookie ini akan dikirim untuk setiap subdomain dari mydomain.com, termasuk subdomain bersarang seperti subsub.subdomain.mydomain.com.

Di RFC 2109 , domain tanpa titik awal berarti bahwa itu tidak dapat digunakan pada subdomain, dan hanya titik terkemuka ( .mydomain.com) yang akan memungkinkannya untuk digunakan di beberapa subdomain (tetapi bukan domain tingkat atas, jadi yang Anda tanyakan adalah tidak mungkin di spec yang lebih lama).

Namun, semua browser modern menghormati spesifikasi RFC 6265 yang lebih baru , dan akan mengabaikan titik awal apa pun, artinya Anda dapat menggunakan cookie pada subdomain dan juga domain tingkat atas.

Singkatnya, jika Anda menetapkan cookie seperti contoh kedua di atas mydomain.com, cookie dapat diakses oleh subdomain.mydomain.com, dan sebaliknya. Ini juga dapat digunakan untuk mengizinkan sub1.mydomain.comdan sub2.mydomain.comberbagi cookie.

Lihat juga:

cmbuckley
sumber
3
Terima kasih; Saya menambahkan catatan tentang pentingnya titik.
cmbuckley
2
Saya tidak mengerti mengapa Anda tidak akan hanya memimpin "." di domain untuk kompatibilitas maksimum dengan yang lama dan yang baru
Alan Macdonald
12
Dalam standar lama, cookie dengan domain=.mydomain.comtidak berlaku untuk mydomain.com kosong, sehingga dua RFC tidak kompatibel satu sama lain.
cmbuckley
4
@ Jujur, ya saya tahu. Komentar saya adalah untuk mengklarifikasi bahwa pertanyaan saya adalah tentang berbagi cookie antara domain dan subdomain, BUKAN antara dua subdomain.
adam0101
3
Saya tidak yakin di mana harus meletakkan ini, jadi saya memilih komentar dari jawaban yang diterima. Butuh waktu lama dan percobaan gagal untuk membuktikan hal di atas di localhost saya, sampai terpikir oleh saya bahwa saya harus memanggil localhost dengan titik di namanya. Seperti "localhost.com" atau semacamnya. Kemudian semua perilaku "set cookie" mulai mengikuti penjelasan yang ditulis di sini dalam jawaban ini. Berharap ini bisa membantu seseorang.
Cesc
32

Saya tidak yakin jawaban @cmbuckley menunjukkan gambar penuh Yang saya baca adalah:

Kecuali jika atribut cookie menunjukkan sebaliknya, cookie hanya dikembalikan ke server asal (dan tidak, misalnya, ke subdomain apa pun), dan cookie berakhir pada akhir sesi saat ini (sebagaimana ditentukan oleh agen pengguna). Agen pengguna mengabaikan cookie yang tidak dikenal.

RFC 6265

Juga

8.6.  Weak Integrity

   Cookies do not provide integrity guarantees for sibling domains (and
   their subdomains).  For example, consider foo.example.com and
   bar.example.com.  The foo.example.com server can set a cookie with a
   Domain attribute of "example.com" (possibly overwriting an existing
   "example.com" cookie set by bar.example.com), and the user agent will
   include that cookie in HTTP requests to bar.example.com.  In the
   worst case, bar.example.com will be unable to distinguish this cookie
   from a cookie it set itself.  The foo.example.com server might be
   able to leverage this ability to mount an attack against
   bar.example.com.

Bagi saya itu berarti Anda dapat melindungi cookie agar tidak dibaca oleh subdomain / domain tetapi tidak dapat mencegah penulisan cookie ke domain lain. Jadi seseorang dapat menulis ulang cookie situs Anda dengan mengendalikan subdomain lain yang dikunjungi oleh browser yang sama. Yang mungkin bukan masalah besar.

Situs uji cookie luar biasa yang disediakan oleh @cmbuckley / untuk mereka yang melewatkannya dalam jawabannya seperti saya; layak bergulir ke atas dan ke atas /:

akostadinov
sumber
4
Tampaknya setuju dengan apa yang saya katakan: kecuali Anda menentukan domain, cookie hanya digunakan untuk host permintaan. Ini berarti bahwa Set-Cookie: name=valuedari mydomain.comtidak akan dikirim dengan permintaan ke subdomain. Selamat bermain dengan skrip tes ini juga.
cmbuckley
@ cmbuckley, ok, apa yang Anda katakan tampaknya benar. Saya akan menulis ulang jawaban saya. Terima kasih telah menunjukkannya.
akostadinov
Perlu untuk menunjukkan, bahwa bagian 4.1.2 (kutipan pertama) tidak normatif ...
Velda
terima kasih atas tautan cmbuckley. bagus untuk menguji cara kerjanya dengan cepat.
lawphotog
22

Berikut adalah contoh menggunakan API cookie DOM ( https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie ), sehingga kita dapat melihat sendiri perilaku tersebut.

Jika kami menjalankan JavaScript berikut:

document.cookie = "key = value"

Tampaknya sama dengan mengeksekusi:

document.cookie = "key = value; domain = mydomain.com"

Kunci cookie tersedia (hanya) di domain mydomain.com .


Sekarang, jika Anda menjalankan JavaScript berikut di mydomain.com:

document.cookie = "key = value; domain = .mydomain.com"

Kunci cookie tersedia untuk mydomain.com dan juga subdomain.mydomain.com .


Terakhir, jika Anda mencoba dan menjalankan yang berikut di subdomain.mydomain.com:

document.cookie = "key = value; domain = .mydomain.com"

Apakah kunci cookie tersedia untuk subdomain.mydomain.com ? Saya sedikit terkejut bahwa ini diperbolehkan; Saya menduga itu akan menjadi pelanggaran keamanan bagi subdomain untuk dapat mengatur cookie pada domain induk.

llambda
sumber
1
Ini membuat saya bertanya-tanya apakah ada spesifikasi terpisah yang menjelaskan perilaku httponlycookie versus jenis cookie yang Anda buat.
adam0101
3
Dokumen yang Anda poskan tidak setuju dengan pernyataan yang Anda buat. 2 contoh pertama tidak setara ( domainatribut menyebabkan cookie berfungsi di subdomain; tidak ada atribut yang tidak). Titik-titik terkemuka diabaikan paling baik dan paling aktif diblokir.
cmbuckley
ini adalah solusi terbaik jika Anda tidak ingin bergantung pada header host. Saya memeriksanya dan berfungsi
Szymon
14

Harap semua orang perhatikan bahwa Anda dapat mengatur cookie dari subdomain pada domain.

(dikirim sebagai respons untuk meminta subdomain.mydomain.com)

Set-Cookie: name=value; Domain=mydomain.com // GOOD

Tetapi Anda TIDAK BISA mengatur cookie dari domain pada subdomain.

(dikirim sebagai respons untuk meminta mydomain.com)

Set-Cookie: name=value; Domain=subdomain.mydomain.com // Browser rejects cookie

MENGAPA?

Menurut spesifikasi RFC 6265 bagian 5.3.6 Model Penyimpanan

Jika host-host yang dikanonisasi tidak cocok dengan domain-atribut domain: Abaikan cookie sepenuhnya dan batalkan langkah-langkah ini.

dan RFC 6265 bagian 5.1.3 Pencocokan Domain

Pencocokan Domain

String domain-cocok dengan string domain yang diberikan jika setidaknya salah satu dari kondisi berikut ini berlaku:

  1. String domain dan string identik. (Perhatikan bahwa string domain dan string akan dikanonikalisasi menjadi huruf kecil pada saat ini.)

  2. Semua kondisi berikut berlaku:

    • String domain adalah sufiks dari string.

    • Karakter terakhir dari string yang tidak termasuk dalam string domain adalah karakter% x2E (".").

    • String adalah nama host (yaitu, bukan alamat IP).

Jadi "subdomain.mydomain.com" cocok dengan domain "mydomain.com", tetapi "mydomain.com" TIDAK cocok dengan domain "subdomain.mydomain.com"

Periksa jawaban ini juga.

Akuntan م
sumber
Ini adalah jawaban yang paling membantu saya.
Toby
3

Dalam kedua kasus ya itu bisa, dan ini adalah perilaku default untuk IE dan Edge.

Jawaban lainnya menambah wawasan yang berharga tetapi terutama menggambarkan perilaku di Chrome. Penting untuk dicatat bahwa perilakunya sangat berbeda di IE. Skrip pengujian CMBuckley yang sangat membantu menunjukkan bahwa di (katakanlah) Chrome, cookie tidak dibagi antara root dan subdomain ketika tidak ada domain yang ditentukan. Namun tes yang sama di IE menunjukkan bahwa mereka dibagikan. Kasing IE ini lebih dekat dengan deskripsi take-home di tautan CMBuckley www-atau-tidak-www. Saya tahu ini masalahnya karena kami memiliki sistem yang menggunakan cookie servicestack yang berbeda pada root dan subdomain. Semuanya bekerja dengan baik sampai seseorang mengaksesnya di IE dan dua sistem memperebutkan cookie sesi siapa yang akan menang sampai kita meledakkan cache.

DannyW
sumber
0

Hati-hati jika Anda bekerja di localhost! Jika Anda menyimpan cookie Anda di js seperti ini:

document.cookie = "key=value;domain=localhost"

Mungkin tidak dapat diakses ke subdomain Anda, seperti sub.localhost. Untuk mengatasi masalah ini, Anda perlu menggunakan Virtual Host . Sebagai contoh, Anda dapat mengonfigurasi host virtual Anda dengan ServerName localhost.commaka Anda akan dapat menyimpan cookie Anda di domain dan subdomain Anda seperti ini:

document.cookie = "key=value;domain=localhost.com"
Alexandre97122
sumber
-12

Solusi sederhana

setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM);

Parameter ke-5 Setcookie menentukan (sub) domain tempat cookie tersedia. Menetapkannya ke (EXAMPLE.COM) membuatnya tersedia untuk subdomain apa pun (misalnya: SUBDOMAIN.EXAMPLE.COM)

Referensi: http://php.net/manual/en/function.setcookie.php

Hukum
sumber
18
Pertanyaan ini bukan khusus untuk PHP, saya rasa itu tidak sah.
sergelerator
1
Sergelerator, saya tidak mengajukan pertanyaan. Saya merespons OP.
Lawes
4
@ Hukum Saya percaya sergelator berarti pertanyaan OP bukan PHP khusus sedangkan jawaban Anda tampaknya hanya solusi PHP, karenanya tidak akan memenuhi syarat untuk pertanyaan OP.
Mirage