2013-08-28 92 views
228

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

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

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

+2

Có bạn có thể .. vui lòng xem liên kết bên dưới http://www.codeguru.com/csharp/csharp/cs_internet/article.php/c19417/Sharing-Cookies-Across-Domains.htm –

+0

Liên quan chặt chẽ: http://stackoverflow.com/questions/3089199/can-subdomain-example-com-set-a-cookie-that-can-be-read-by-example-com –

+0

bạn có thể xem câu hỏi này http: // stackoverflow hay không. com/questions/38351769/path-attribute-of-cookie-là-không-ảnh hưởng-cho-tiếp theo-yêu cầu –

Trả lời

348

Hai miền mydomain.comsubdomain.mydomain.com chỉ có thể chia sẻ cookie nếu tên miền được đặt tên rõ ràng trong tiêu đề Set-Cookie. Nếu không, phạm vi của cookie bị hạn chế đối với máy chủ yêu cầu. (Điều này được gọi là một "host-only cookie" Xem What is a host only cookie?.)

Ví dụ, nếu bạn gửi tiêu đề sau đây từ subdomain.mydomain.com:

Set-Cookie: name=value 

Sau đó, cookie sẽ không được gửi cho các yêu cầu đến mydomain.com. Tuy nhiên nếu bạn sử dụng những điều sau đây, nó sẽ được sử dụng trên cả hai lĩnh vực:

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

Trong RFC 2109, một miền mà không có một 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ỉ có 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 yêu cầu là không thể có trong thông số cũ).

Tuy nhiên, tất cả các trình duyệt hiện đại đều tôn trọng đặc điểm kỹ thuật mới RFC 6265 và sẽ bỏ qua bất kỳ dấu chấm đầu nào, 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 từ mydomain.com, nó sẽ có thể truy cập được bởi subdomain.mydomain.com và ngược lại.

Xem thêm:

+0

Câu hỏi của tôi liên quan đến việc chia sẻ cookie giữa 'domain.com' và' subdomain.domain.com', không phải giữa 'www.domain.com' và' subdomain.domain.com'. – adam0101

+1

Cảm ơn; Tôi đã thêm một ghi chú về ý nghĩa của dấu chấm. – cmbuckley

+0

Vì vậy, tôi đã có hai câu hỏi trong bài đăng gốc của mình. Bạn đang nói câu trả lời là "có" cho cả hai, nhưng chỉ trên các trình duyệt mới hơn? – adam0101

-3

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

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

tham số 5 setcookie của quyết định (phụ) Các tên miền cookie là Sẵn sàng cho. Đặt nó vào (EXAMPLE.COM) làm cho nó có sẵn cho bất kỳ tên miền phụ (ví dụ: SUBDOMAIN.EXAMPLE.COM)

tham khảo: http://php.net/manual/en/function.setcookie.php

+5

Câu hỏi này không phải là PHP cụ thể, tôi không nghĩ rằng nó đủ điều kiện hợp lệ. – sergelerator

+0

Sergelerator, tôi không đặt ra câu hỏi. Tôi đã trả lời OP. – Lawes

14

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

Unless the cookie's attributes indicate otherwise, the cookie is 
    returned only to the origin server (and not, for example, to any 
    subdomains), and it expires at the end of the current session (as 
    defined by the user agent). User agents ignore unrecognized cookie 
    attributes (but not the entire cookie). 

Cũng

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 có nghĩa là bạn có thể bảo vệ các tập tin cookie từ được đọc bởi subdomain/miền nhưng không thể ngăn chặn bằng văn bản cookie để các lĩnh vực 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. Đó 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; giá trị di chuyển lên và upvoting /:

+3

Điều đó có vẻ đồng ý với những gì tôi đang nói: trừ khi bạn chỉ định một 'miền', 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 = value' từ' mydomain.com' sẽ không được gửi với các yêu cầu tới các tên miền phụ. Có một vở kịch với [kịch bản thử nghiệm này] (http://scripts.cmbuckley.co.uk/cookies.php). – cmbuckley

+0

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

2

Trong cả hai trường hợp có nó có thể, 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 trong IE. Kịch bản thử nghiệm rất hữu ích của CMBuckley cho thấy rằng trong (nói) Chrome, các cookie không được chia sẻ giữa gốc và tên miền phụ khi không có miền nào được chỉ định. Tuy nhiên, thử nghiệm tương tự trong IE cho thấy rằng chúng được chia sẻ. Trường hợp IE này gần gũi hơn với mô tả về nhà ở 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 servicestack khác nhau trên cả root và subdomain. 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.

4

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

Nếu chúng ta thực thi JavaScript sau:

document.cookie = "key = value"

Nó dường như là giống như thực hiện:

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

Cookie khóa có sẵn (chỉ) trên miền mydomain.com.


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

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

Cookie phím có sẵn cho mydomain.com cũng như subdomain.mydomain.com.


Cuối cùng, nếu bạn đã cố gắng và thực hiện như sau trên subdomain.mydomain.com:

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

Cookie có sẵn để subdomain.mydomain.com không?Tôi hơi ngạc nhiên rằng điều này được cho phép; Tôi đã giả định nó sẽ là một vi phạm an ninh cho một tên miền phụ để có thể thiết lập một cookie trên một tên miền phụ huynh.

+1

Điều này làm cho tôi tự hỏi liệu có thông số kỹ thuật riêng biệt mô tả hành vi của cookie 'httponly' so với loại cookie bạn đang tạo hay không. – adam0101

+1

Các tài liệu bạn đã đăng không đồng ý với các tuyên bố bạn thực hiện. Hai ví dụ đầu tiên là ** không ** tương đương (thuộc tính 'miền' làm cho 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). Các dấu chấm đầu được bỏ qua tốt nhất và chủ động bị chặn ở mức tồi tệ nhất. – cmbuckley