Chia sẻ cookie giữa tên miền phụ và tên miền


420

Tôi có hai câu hỏi. Tôi hiểu rằng nếu tôi chỉ định tên miền là .mydomain.com(với dấu chấm hàng đầu) trong cookie thì tất cả tên miền phụ có thể chia sẻ cookie.

Có thể subdomain.mydomain.comtruy cập cookie được tạo trong mydomain.com(không có wwwtên miền phụ) không?

Có thể mydomain.com(không có wwwtên miền phụ) truy cập cookie nếu được tạo trong subdomain.mydomain.comkhông?


3
Có, bạn có thể .. vui lòng xem liên kết bên dưới codeguru.com/csharp/csharp/cs_iNET/article.php/c19417/ Kẻ
Rahul Jain

Liên quan chặt chẽ: stackoverflow.com/questions/3089199/
Mạnh

bạn có thể vui lòng xem câu hỏi này stackoverflow.com/questions/38351769/ từ
Jayavardhan Gange

1
@ adam0101 Điều gì xảy ra nếu tên miền và tên miền phụ được lưu trữ trên các máy chủ khác nhau?
dùng3782114

3
@ user3782114, không vấn đề gì nếu chúng ở trên các máy chủ khác nhau. Trong trường hợp của tôi, chúng không chỉ trên các máy chủ khác nhau, mà mỗi miền được cân bằng tải trên nhiều máy chủ. Một điều khiến chúng tôi gặp khó khăn một chút là các môi trường thấp hơn (dev, test, uat, v.v.) cũng bắt đầu chia sẻ cùng một cookie khi chúng tôi thực hiện điều này vì chúng tôi đã đặt tên cho chúng là "dev.oursite.com", "test. oursite.com ", v.v. Thủ thuật ở đó (ít nhất là trong .Net) là có một khóa máy riêng biệt được tạo cho từng môi trường và lưu nó trong Web.config của bạn (giả sử bạn chuyển đổi cấu hình cho từng môi trường).
adam0101

Câu trả lời:


653

2 tên miền mydomain.comsubdomain.mydomain.comchỉ có thể chia sẻ cookie nếu tên miền được đặt tên rõ ràng trong Set-Cookietiêu đề. Mặt khác, phạm vi của cookie được giới hạn trong máy chủ yêu cầu. (Điều này được gọi là "cookie chỉ dành cho máy chủ". Xem cookie chỉ dành cho máy chủ là gì? )

Ví dụ: nếu bạn đã gửi tiêu đề sau từ subdomain.mydomain.comthì cookie sẽ không được gửi cho các yêu cầu tới mydomain.com:

Set-Cookie: name=value

Tuy nhiên, nếu bạn sử dụng như sau, nó sẽ có thể sử dụng được trên cả hai miền:

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

Cookie này sẽ được gửi cho bất kỳ tên miền phụ nào của mydomain.com, bao gồm các tên miền phụ được lồng như thế nào subsub.subdomain.mydomain.com.

Trong RFC 2109 , một tên miền không có dấu chấm hàng đầu có nghĩa là nó không thể được sử dụng trên các tên miền phụ và chỉ một dấu chấm hàng đầu ( .mydomain.com) sẽ cho phép nó được sử dụng trên nhiều tên miền phụ (nhưng không phải là tên miền cấp cao nhất, vì vậy những gì bạn hỏi là không thể trong thông số cũ hơn).

Tuy nhiên, tất cả các trình duyệt hiện đại đều tôn trọng thông số kỹ thuật mới hơn RFC 6265 và sẽ bỏ qua mọi dấu chấm hàng đầu, nghĩa là bạn có thể sử dụng cookie trên tên miền phụ cũng như tên miền cấp cao nhất.

Tóm lại, nếu bạn đặt cookie như ví dụ thứ hai ở trên mydomain.com, nó sẽ có thể truy cập được subdomain.mydomain.comvà ngược lại. Điều này cũng có thể được sử dụng để cho phép sub1.mydomain.comsub2.mydomain.comchia sẻ cookie.

Xem thêm:


3
Cảm ơn; Tôi đã thêm một lưu ý về tầm quan trọng của dấu chấm.
cmbuckley

2
Tôi không hiểu tại sao bạn không chỉ dẫn đầu "." trên miền để tương thích tối đa với cũ và mới
Alan Macdonald

12
Trong tiêu chuẩn cũ, một cookie với domain=.mydomain.comkhông hợp lệ cho mydomain.com trần, do đó hai RFC không tương thích với nhau.
cmbuckley

4
@Frank, vâng tôi biết. Nhận xét của tôi là để làm rõ rằng câu hỏi của tôi liên quan đến việc chia sẻ cookie giữa một tên miền và tên miền phụ, KHÔNG phải giữa hai tên miền phụ.
adam0101

3
Tôi không chắc chắn nơi để đặt điều này vì vậy tôi đang chọn ý kiến ​​của câu trả lời được chấp nhận. Phải mất nhiều thời gian và các thử nghiệm thất bại để chứng minh những điều trên trên localhost của tôi, cho đến khi tôi nhận ra rằng tôi nên gọi localhost với một dấu chấm trong tên. Giống như "localhost.com" hoặc đại loại như thế. Sau đó, tất cả các hành vi "đặt cookie" bắt đầu theo các giải thích được viết ở đây trong câu trả lời này. Hy vọng điều này có thể giúp ai đó.
Cesc

32

Tôi không chắc câu trả lời @cmbuckley đang hiển thị hình ảnh đầy đủ. Những gì tôi đọc là:

Trừ khi các thuộc tính của cookie biểu thị khác, cookie chỉ được trả về máy chủ gốc (và không, ví dụ, cho bất kỳ tên miền phụ nào) và nó sẽ hết hạn vào cuối phiên hiện tại (như được xác định bởi tác nhân người dùng). Tác nhân người dùng bỏ qua cookie không được nhận dạng.

RFC 6265

Cũng thế

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.

Đối với tôi điều đó có nghĩa là bạn có thể bảo vệ cookie khỏi bị đọc bởi tên miền phụ / tên miền nhưng không thể ngăn việc viết cookie sang các tên miền khác. Vì vậy, ai đó có thể viết lại cookie trang web của bạn bằng cách kiểm soát một tên miền phụ khác được truy cập bởi cùng một trình duyệt. Mà có thể không phải là một mối quan tâm lớn.

Trang web kiểm tra cookie tuyệt vời được cung cấp bởi @cmbuckley / cho những người đã bỏ lỡ nó trong câu trả lời của anh ấy như tôi; đáng để cuộn lên và nâng cấp /:


4
Điều đó có vẻ đồng ý với những gì tôi đang nói: trừ khi bạn chỉ định a domain, cookie chỉ được sử dụng cho máy chủ yêu cầu. Điều này có nghĩa là Set-Cookie: name=valuetừ mydomain.comsẽ không được gửi với yêu cầu đến tên miền phụ. Có một vở kịch với kịch bản thử nghiệm này quá.
cmbuckley

@cmbuckley, ok, những gì bạn nói có vẻ đúng. Tôi sẽ điều chỉnh lại câu trả lời của tôi. Cảm ơn bạn đã chỉ ra rằng.
akostadinov

Cần phải chỉ ra rằng, phần 4.1.2 (trích dẫn đầu tiên) là không quy tắc ...
Velda

cảm ơn vì liên kết cmbuckley. Rất vui để kiểm tra làm thế nào nó hoạt động nhanh chóng.
lawph photo

22

Dưới đây là một ví dụ sử dụng API cookie DOM ( https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie ), để chúng ta có thể tự mình nhìn thấy hành vi.

Nếu chúng tôi thực thi JavaScript sau:

document.cookie = "key = value"

Nó dường như giống như thực thi:

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

Cookie chủ chốt trở nên có sẵn (chỉ) trên miền mydomain.com .


Bây giờ, nếu bạn thực thi JavaScript sau trên mydomain.com:

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

Cookie chủ chốt trở nên có sẵn để mydomain.com cũng như subdomain.mydomain.com .


Cuối cùng, nếu bạn đã thử và thực hiện các thao tác sau trên subomain.mydomain.com:

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

Khóa cookie có khả dụng với tên miền phụ.mydomain.com không? Tôi hơi ngạc nhiên khi điều này được cho phép; Tôi đã cho rằng đó là vi phạm bảo mật cho tên miền phụ để có thể đặt cookie trên tên miền mẹ.


1
Điều này khiến tôi tự hỏi nếu có các thông số kỹ thuật riêng biệt mô tả hành vi của httponlycookie so với loại cookie bạn đang tạo.
adam0101

3
Các tài liệu bạn đã đăng không đồng ý với các tuyên bố bạn đưa ra. 2 ví dụ đầu tiên không tương đương (một domainthuộc tính khiến cookie hoạt động trên các tên miền phụ; không có thuộc tính nào như vậy). Dấu chấm hàng đầu được bỏ qua ở mức tốt nhất và chủ động bị chặn ở mức tồi tệ nhất.
cmbuckley

đây là giải pháp tốt nhất nếu bạn không muốn dựa vào tiêu đề máy chủ. Tôi đã kiểm tra nó và nó hoạt động
Szymon

14

Xin mọi người lưu ý rằng bạn có thể đặt cookie từ tên miền phụ trên tên miền.

(được gửi trong phản hồi để yêu cầu subdomain.mydomain.com)

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

Nhưng bạn không thể đặt cookie từ một tên miền trên tên miền phụ.

(được gửi trong phản hồi để yêu cầu mydomain.com)

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

TẠI SAO ?

Theo thông số kỹ thuật RFC 6265 phần 5.3.6 Mô hình lưu trữ

Nếu máy chủ yêu cầu được chuẩn hóa không khớp với thuộc tính miền: Bỏ qua hoàn toàn cookie và hủy bỏ các bước này.

RFC 6265 phần 5.1.3 Kết hợp tên miền

Kết hợp tên miền

Một chuỗi miền khớp với một chuỗi miền đã cho nếu có ít nhất một trong các điều kiện sau:

  1. Chuỗi tên miền và chuỗi giống hệt nhau. (Lưu ý rằng cả chuỗi miền và chuỗi sẽ được hợp quy hóa thành chữ thường vào thời điểm này.)

  2. Tất cả các điều kiện sau đây giữ:

    • Chuỗi tên miền là hậu tố của chuỗi.

    • Ký tự cuối cùng của chuỗi không được bao gồm trong chuỗi miền là ký tự% x2E (".").

    • Chuỗi là tên máy chủ (nghĩa là không phải địa chỉ IP).

Vì vậy, tên miền "subomain.mydomain.com" khớp với "mydomain.com", nhưng "mydomain.com" KHÔNG khớp tên miền "tên miền.mydomain.com"

Kiểm tra câu trả lời này cũng.


Đây là câu trả lời hữu ích nhất cho tôi.
Toby

3

Trong cả hai trường hợp, có, và đây là hành vi mặc định cho cả IE và Edge.

Các câu trả lời khác thêm thông tin chi tiết có giá trị nhưng chủ yếu mô tả hành vi trong Chrome. Điều quan trọng cần lưu ý là hành vi hoàn toàn khác nhau trong IE. Tập lệnh kiểm tra rất hữu ích của CMBuckley chứng minh rằng trong (giả sử) Chrome, cookie không được chia sẻ giữa tên miền gốc và tên miền phụ khi không có tên miền nào được chỉ định. Tuy nhiên, thử nghiệm tương tự trong IE cho thấy chúng được chia sẻ. Trường hợp IE này gần với mô tả mang về nhà hơn trong liên kết www-or-not-www của CMBuckley. Tôi biết đây là trường hợp vì chúng tôi có một hệ thống sử dụng các cookie dịch vụ khác nhau trên cả tên miền gốc và tên miền phụ. Tất cả đều hoạt động tốt cho đến khi ai đó truy cập nó trong IE và hai hệ thống đã chiến đấu với cookie phiên của họ sẽ giành chiến thắng cho đến khi chúng tôi xóa bộ nhớ cache.


0

Hãy cẩn thận nếu bạn đang làm việc trên localhost! Nếu bạn lưu trữ cookie của bạn trong js như thế này:

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

Nó có thể không truy cập được vào tên miền phụ của bạn, như sub.localhost. Để giải quyết vấn đề này, bạn cần sử dụng Máy chủ ảo . Ví dụ, bạn có thể định cấu hình máy chủ ảo của mình ServerName localhost.comsau đó bạn sẽ có thể lưu trữ cookie của mình trên tên miền và tên miền phụ như thế này:

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

-12

Giải pháp đơn giản

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

Tham số thứ 5 của Setcookie xác định tên miền (phụ) mà cookie có sẵn. Đặt nó thành (EXAMPLE.COM) làm cho nó có sẵn cho bất kỳ tên miền phụ nào (ví dụ: SUBDOMAIN.EXAMPLE.COM)

Tham khảo: http://php.net/manual/en/feft.setcookie.php


17
Câu hỏi này không cụ thể về PHP, tôi không nghĩ nó đủ điều kiện hợp lệ.
Máy đo tốc độ

1
Sergelerator, tôi không đặt ra một câu hỏi. Tôi đã trả lời OP.
Luật

4
@Lawes Tôi tin rằng sergelator có nghĩa là câu hỏi của OP không phải là PHP cụ thể trong khi câu trả lời của bạn dường như chỉ là giải pháp của PHP, do đó nó không đủ điều kiện cho câu hỏi của OP.
Mirage
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.