Làm thế nào để tên miền cookie trình duyệt hoạt động?


380

Do các vấn đề cookie tên miền / tên miền lạ mà tôi gặp phải, tôi muốn biết cách trình duyệt xử lý cookie. Nếu họ làm theo những cách khác nhau, sẽ rất tốt nếu biết sự khác biệt.

Nói cách khác - khi trình duyệt nhận được cookie, cookie đó CÓ THỂ có tên miền và đường dẫn được đính kèm. Hoặc không, trong trường hợp đó trình duyệt có thể thay thế một số mặc định cho chúng. Câu 1: chúng là gì?

Sau đó, khi trình duyệt sắp thực hiện một yêu cầu, nó sẽ kiểm tra cookie của nó và lọc ra những cái mà nó sẽ gửi cho yêu cầu đó. Nó làm như vậy bằng cách khớp chúng với đường dẫn và miền yêu cầu. Câu 2: các quy tắc phù hợp là gì?


Thêm:

Lý do tôi hỏi điều này là vì tôi quan tâm đến một số trường hợp cạnh. Giống:

  • Một cookie .example.comsẽ có sẵn cho www.example.com?
  • Một cookie .example.comsẽ có sẵn cho example.com?
  • Một cookie example.comsẽ có sẵn cho www.example.com?
  • Một cookie example.comsẽ có sẵn cho anotherexample.com?
  • Sẽ www.example.comcó thể đặt cookie cho example.com?
  • Sẽ www.example.comcó thể đặt cookie cho www2.example.com?
  • Sẽ www.example.comcó thể đặt cookie cho .com?
  • Vân vân.

Đã thêm 2:

Ngoài ra, ai đó có thể đề xuất cách tôi nên đặt cookie để:

  • Nó có thể được thiết lập bởi một trong hai www.example.comhoặc example.com;
  • Nó có thể truy cập bởi cả hai www.example.comexample.com.

Câu trả lời:


367

Mặc dù có RFC 2965 ( Set-Cookie2, đã bị lỗi RFC 2109 ) nên đã xác định cookie hiện nay, hầu hết các trình duyệt không hỗ trợ đầy đủ điều đó mà chỉ tuân thủ thông số ban đầu của Netscape .

Có một sự khác biệt giữa giá trị thuộc tính Miền và miền hiệu quả: cái trước được lấy từ trường Set-Cookietiêu đề và cái sau là giải thích giá trị thuộc tính đó. Theo RFC 2965, nên áp dụng như sau:

  • Nếu trường tiêu đề Set-Cookie không có thuộc tính Miền , thì miền hiệu quả là miền của yêu cầu.
  • Nếu có một thuộc tính Miền , giá trị của nó sẽ được sử dụng làm miền hiệu quả (nếu giá trị không bắt đầu bằng một thuộc tính .sẽ được thêm bởi máy khách).

Để có tên miền hiệu quả, nó cũng phải khớp với miền được yêu cầu hiện tại để được đặt; nếu không thì cookie sẽ được sửa đổi. Quy tắc tương tự áp dụng cho việc chọn cookie sẽ được gửi trong yêu cầu.


Ánh xạ kiến ​​thức này vào câu hỏi của bạn, nên áp dụng như sau:

  • Cookie với Domain=.example.com sẽ có sẵn cho www.example.com
  • Cookie với Domain=.example.com sẽ có sẵn cho example.com
  • Cookie có Domain=example.comsẽ được chuyển đổi sang .example.comvà do đó sẽ cũng có sẵn cho www.example.com
  • Cookie với Domain=example.comsẽ không có sẵn cho Anotherexample.com
  • www.example.com sẽ có thể đặt cookie cho example.com
  • www.example.com sẽ không thể đặt cookie cho www2.example.com
  • www.example.com sẽ không thể đặt cookie cho .com

Và để đặt và đọc cookie cho / by www.example.comexample.com , hãy đặt nó cho .www.example.com.example.comtương ứng. Nhưng tên đầu tiên ( .www.example.com) sẽ chỉ có thể truy cập được đối với các tên miền khác bên dưới tên miền đó (ví dụ: foo.www.example.com hoặc bar.www.example.com ), nơi .example.comcũng có thể được truy cập bởi bất kỳ tên miền nào khác bên dưới example.com (ví dụ: foo. example.com hoặc bar.example.com ).


@Gumbo Vậy abcexample.com có ​​thể truy cập cookie với tên miền c.example.com không?
Pacerier

2
rất muộn theo dõi câu hỏi này. Kinh nghiệm của riêng tôi và điều này: webmasters.stackexchange.com/questions/55790/ gợi ý rằng tên miền của example.com sẽ không có sẵn cho www.example.com, nhưng ví dụ này gợi ý khác. Là ví dụ này sai, hoặc tôi (hoàn toàn có thể) hiểu lầm. Xin lỗi vì sự cần thiết của chủ đề nhưng muốn đảm bảo câu trả lời tuyệt vời này chính xác 100% cho những người mới bối rối trong tương lai như tôi :)
errah

7
Câu trả lời này hơi lỗi thời; xem câu trả lời của tôi dưới đây
ZhongYu

1
tại sao không thiết lập cho example.com có ​​sẵn cho www.example.com? (vì nó là phụ "www" của example.com?
Nabeel Khan

Set-Cookie2 đã lỗi thời. Tiếp tục sử dụng Set-Cookie.
joeforker

122

Các câu trả lời trước là một chút lỗi thời.

RFC 6265 được xuất bản năm 2011, dựa trên sự đồng thuận của trình duyệt tại thời điểm đó. Kể từ đó, đã có một số phức tạp với các miền hậu tố công cộng. Tôi đã viết một bài viết giải thích tình hình hiện tại - http://bayou.io/draft/cookie.domain.html

Để tóm tắt, các quy tắc phải tuân theo về tên miền cookie:

  • Miền gốc của cookie là miền của yêu cầu khởi tạo.

  • Nếu miền gốc là IP, thuộc tính miền của cookie không được đặt.

  • Nếu thuộc tính miền của cookie không được đặt, cookie chỉ áp dụng cho miền gốc của nó.

  • Nếu thuộc tính miền của cookie được đặt,

    • cookie có thể áp dụng cho tên miền đó và tất cả các tên miền phụ của nó;
    • tên miền của cookie phải giống với hoặc cha mẹ của tên miền gốc
    • tên miền của cookie không được là TLD, hậu tố công khai hoặc cha mẹ của hậu tố công khai.

Có thể suy ra rằng một cookie luôn được áp dụng cho miền gốc của nó.

Tên miền cookie không nên có dấu chấm hàng đầu, như trong .foo.com- chỉ cần sử dụngfoo.com

Ví dụ

  • x.y.z.comcó thể thiết lập một tên miền cookie để bản thân hoặc bố mẹ - x.y.z.com, y.z.com, z.com. Nhưng khôngcom , đó là một hậu tố công cộng.
  • một cookie với domain = y.z.comđược áp dụng cho y.z.com, x.y.z.com, a.x.y.z.com, vv

Ví dụ về các hậu tố nào - com, edu, uk, co.uk, blogspot.com,compute.amazonaws.com


5
@roelleor - đó là cách khác. rfc6265 được viết để tóm tắt cách xử lý cookie thực tế trong thực tế :) vâng, rfc là một sự phản ánh khá chính xác về cách các trình duyệt chính hoạt động. các thử nghiệm gần đây của tôi trên các trình duyệt đã xác nhận rằng. mặc dù, chúng có thể khác nhau về các trường hợp góc liên quan đến hậu tố công cộng.
ZhongYu

2
Hậu quả của một dấu chấm hàng đầu là gì?
UpTheCux

3
@UpTheCalet - theo rfc6265, dấu chấm hàng đầu nên bị khách hàng bỏ qua
ZhongYu

2
Không có gì lạ khi x.y.z.comcó thể đặt cookie z.com?
Royi Namir 18/03/19

1
Vì vậy, nếu xyzcom có ​​thể đặt cookie thành yzcom và cookie có tên miền yzcom có ​​thể áp dụng cho wyzcom ... Điều đó có nghĩa là xyzcom có ​​thể đặt cookie thành wyzcom không?
Ioanna

9

Đối với một phạm vi bảo hiểm rộng rãi xem xét nội dung của RFC2965 . Tất nhiên điều đó không nhất thiết có nghĩa là tất cả các trình duyệt hoạt động chính xác theo cùng một cách.

Tuy nhiên, nói chung, quy tắc cho Đường dẫn mặc định nếu không có quy định nào trong cookie là đường dẫn trong URL mà tiêu đề Set-Cookie xuất hiện. Tương tự, mặc định cho Miền là tên máy chủ đầy đủ trong URL mà Set-Cookie đến.

Các quy tắc khớp cho tên miền yêu cầu Tên miền cookie phù hợp với máy chủ lưu trữ yêu cầu. Cookie có thể chỉ định đối sánh miền rộng hơn bằng cách bao gồm *. trong thuộc tính miền của Set-Cookie (khu vực này mà các trình duyệt có thể thay đổi). Khớp đường dẫn (giả sử tên miền khớp) là một vấn đề đơn giản là đường dẫn được yêu cầu phải nằm trong đường dẫn được chỉ định trên cookie. Thông thường cookie phiên được đặt với path = / hoặc path = / applicationName / để cookie có sẵn cho tất cả các yêu cầu vào ứng dụng.


Phản hồi với Đã thêm:

  • Một cookie cho .example.com sẽ có sẵn cho www.example.com chứ? Đúng
  • Một cookie cho .example.com sẽ có sẵn cho example.com chứ? Không biết
  • Một cookie cho example.com sẽ có sẵn cho www.example.com chứ? Không nên nhưng ... *
  • Một cookie cho example.com sẽ có sẵn cho Anotherexample.com chứ? Không
  • Www.example.com có ​​thể đặt cookie cho example.com không? Đúng
  • Www.example.com có ​​thể đặt cookie cho www2.example.com không? Không (Ngoại trừ thông qua .example.com)
  • Www.example.com có ​​thể đặt cookie cho .com không? Không (Không thể đặt cookie này lên cao không gian tên và bạn cũng không thể đặt cookie cho một cái gì đó như .co.uk) .

*Tôi không thể kiểm tra điều này ngay bây giờ nhưng tôi có một ý kiến ​​mơ hồ rằng ít nhất IE7 / 6 sẽ đối xử với con đường example.comnhư thể nó là như vậy .example.com.


Tôi đã thêm một số trường hợp cạnh thú vị trong câu hỏi của tôi. Bạn có thể khen ngợi điều gì đó không?
Vilx-

8

RFC cuối cùng (thứ ba chính xác) cho vấn đề này là RFC-6265 (Obsoletes RFC-2965, lần lượt là lỗi thời RFC-2109).

Theo nó, nếu máy chủ bỏ qua thuộc tính Miền, tác nhân người dùng sẽ chỉ trả lại cookie cho máy chủ gốc (máy chủ chứa tài nguyên đã cho). Nhưng nó cũng cảnh báo rằng một số tác nhân người dùng hiện tại đối xử với thuộc tính Miền vắng mặt như thể thuộc tính Miền có mặt và chứa tên máy chủ hiện tại (Ví dụ: if example.com trả về tiêu đề Set-Cookie không có thuộc tính Miền, các tác nhân người dùng này sẽ gửi nhầm cookie đến www.example.com là tốt).

Khi thuộc tính Miền đã được chỉ định, nó sẽ được coi là tên miền hoàn chỉnh (nếu có dấu chấm hàng đầu trong thuộc tính thì nó sẽ bị bỏ qua). Máy chủ phải phù hợp với tên miền được chỉ định trong thuộc tính (có chính xác cùng tên miền hoặc là tên miền phụ của nó) để có được cookie này. Chính xác hơn nó được chỉ định ở đây .

Ví dụ:

  • thuộc tính cookie Domain=.example.comtương đương vớiDomain=example.com
  • cookie có thuộc tính Miền như vậy sẽ có sẵn cho example.comwww.example.com
  • cookie có thuộc tính Miền như vậy sẽ không có sẵn cho other-example.com
  • chỉ định thuộc tính cookie như Domain=www.example.comsẽ đóng đường cho www4.example.com

PS: dấu phẩy trong thuộc tính Miền sẽ khiến tác nhân người dùng bỏ qua thuộc tính = (


6

Tôi đã thử nghiệm tất cả các trường hợp trong Chrome, Firefox, Safari mới nhất vào năm 2019.

Phản hồi với Đã thêm:

  • Một cookie cho .example.com sẽ có sẵn cho www.example.com chứ? ĐÚNG
  • Một cookie cho .example.com sẽ có sẵn cho example.com chứ? ĐÚNG
  • Một cookie cho example.com sẽ có sẵn cho www.example.com chứ? KHÔNG , Tên miền không có ký tự đại diện chỉ khớp với chính nó.
  • Một cookie cho example.com sẽ có sẵn cho Anotherexample.com chứ? KHÔNG
  • Www.example.com có ​​thể đặt cookie cho example.com không? KHÔNG , nó sẽ có thể đặt cookie cho '.example.com', nhưng không phải 'example.com'.
  • Www.example.com có ​​thể đặt cookie cho www2.example.com không? NO . Nhưng nó có thể đặt cookie cho .example.com, mà www2.example.com có ​​thể truy cập.
  • Www.example.com có ​​thể đặt cookie cho .com không? KHÔNG


3

Có các quy tắc xác định xem trình duyệt có chấp nhận tiêu đề phản hồi tiêu đề Set (viết cookie phía máy chủ) hay không, một quy tắc / diễn giải hơi khác đối với bộ cookie sử dụng Javascript (Tôi chưa kiểm tra VBScript).

Sau đó, có các quy tắc xác định xem trình duyệt sẽ gửi cookie cùng với yêu cầu trang.

Có sự khác biệt giữa các công cụ trình duyệt chính về cách xử lý đối sánh miền và cách các tham số trong giá trị đường dẫn được diễn giải. Bạn có thể tìm thấy một số bằng chứng thực nghiệm trong bài viết Cách các trình duyệt khác nhau xử lý cookie khác nhau


2

Tôi đã rất ngạc nhiên khi đọc phần 3.3.2 về việc từ chối cookie:

http://tools.ietf.org/html/rfc2965

Điều đó nói rằng một trình duyệt nên từ chối cookie từ xyzcom với tên miền .z.com, vì 'xy' chứa một dấu chấm. Vì vậy, trừ khi tôi hiểu sai về RFC và / hoặc các câu hỏi ở trên, có thể có các câu hỏi được thêm vào:

Một cookie cho .example.com sẽ có sẵn cho www.yyy.example.com chứ? Không.

Một cookie được đặt bởi máy chủ gốc www.yyy.example.com, với tên miền .example.com, có phải giá trị của nó được gửi bởi tác nhân người dùng đến xxx.example.com không? Không.


2
rfc đó đã lỗi thời. rfc 6265 mới, dựa trên sự đồng thuận của trình duyệt, cho phép z.comáp dụng cookie với z.comtất cả các tên miền phụ.
ZhongYu

1

Sẽ www.example.comcó thể đặt cookie cho .com?

Không, nhưng example.com.frcó thể đặt cookie cho example2.com.fr. Firefox bảo vệ chống lại điều này bằng cách duy trì một danh sách các TLD: http://securitylabs.websense.com/content/Blogs/3108.aspx

Rõ ràng Internet Explorer không cho phép các tên miền hai chữ cái đặt cookie, mà tôi cho rằng giải thích tại sao o2.iechỉ đơn giản là chuyển hướng đến o2online.ie. Tôi thường tự hỏi rằng.


"com.fr" là konwn là "hậu tố công cộng". tên miền cookie không thể là hậu tố công khai. xem rfc
ZhongYu

Vâng, có một giải pháp, nhưng đó là một giải pháp cực kỳ lộn xộn. Loại nhãn này phải được ghi vào DNS, không được thực hiện trên cơ sở đặc biệt.
TRiG

Đúng, và có thể bạn đang đề cập đến "d lãnh". Nhưng điều đó có thể tạo ra nhiều vấn đề hơn; như, đặt ra một thách thức cho việc triển khai ứng dụng khách http.
ZhongYu

Sẽ hữu ích nếu thông tin này được tiết lộ theo một cách nào đó từ trình duyệt đến javascript. Mặt khác, không thể xác định theo chương trình liệu bạn có thể đặt cookie ở một cấp độ miền nhất định hay không. Rốt cuộc, bạn không thể kiểm tra danh sách đó với mỗi cuộc gọi!
Dtipson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.