2008-12-07 46 views
26

Tôi đang làm việc trên một trang web có nhiều tên miền phụ, một số trong đó phải có phiên riêng của họ.PHP: Kiểm soát miền tên miền/tên miền phụ

Tôi nghĩ rằng tôi đã có nó làm việc ra, nhưng đã nhận thấy một cái gì đó về xử lý cookie mà tôi không hiểu. Tôi không thấy bất cứ điều gì trong các tài liệu giải thích nó, vì vậy nghĩ rằng tôi sẽ thấy nếu bất cứ ai ở đây có một số ánh sáng để đổ vào câu hỏi.

Nếu tôi chỉ làm:

session_start(); 

tôi kết thúc với một cookie phiên như thế này:

subdomain.example.net

Tuy nhiên, nếu tôi thực hiện mọi nỗ lực để thiết lập cookie tên miền của tôi, hoặc giống như

ini_set('session.cookie_domain', 'subdomain.example.net'); 

hoặc như

session_set_cookie_params(0, "/", "subdomain.example.net", false, false); 

Tôi kết thúc bằng cookie cho .subdomain.example.net (lưu ý dấu chấm mở), điều tôi tin là "khớp với tất cả các tên miền phụ (hoặc trong trường hợp phụ tên miền phụ này).

Điều này dường như xảy ra với tất cả cookie của tôi thực sự, không chỉ phiên. Nếu tôi tự đặt tên miền cookie, nó sẽ tự động có chấm được thêm vào trước, có nghĩa là miền này và tất cả các miền phụ của nó. Nếu tôi không đặt tên miền, thì nó sẽ làm cho nó đúng bằng cách chỉ sử dụng miền hiện tại.

Bất kỳ ý tưởng nào gây ra điều này và những gì tôi có thể làm để kiểm soát dấu chấm trước đó?

Cảm ơn!

+0

Bạn không phải kiểm soát dấu chấm hàng đầu bởi vì nó chỉ bị * bỏ qua * bởi trình duyệt, theo RFC 6265, đó là những gì mọi trình duyệt hiện đại thực hiện. Vì vậy, chỉ cần không nghĩ về dấu chấm đầu. Ngoài ra, đặt tên miền cookie một cách rõ ràng hoặc đặt nó thành một chuỗi rỗng để giới hạn nó cho máy chủ yêu cầu hiện tại. Thư viện https://github.com/delight-im/PHP-Cookie có một số điều khiển thuận tiện cho điều đó. – caw

Trả lời

24

Chức năng cookie của PHP sẽ tự động thêm tiền tố $ tên miền có dấu chấm. Nếu bạn không muốn hành vi này, bạn có thể sử dụng chức năng. Ví dụ:

header("Set-Cookie: cookiename=cookievalue; expires=Tue, 06-Jan-2009 23:39:49 GMT; path=/; domain=subdomain.example.net"); 
+12

Nếu bạn đọc tất cả RFC 6265, bạn sẽ nhận ra rằng cách thích hợp duy nhất để có cookie "chỉ lưu trữ", KHÔNG được đặt thuộc tính miền. http://tools.ietf.org/html/rfc6265#section-5.4 – stolsvik

+1

"cách thích hợp duy nhất để có cookie" chỉ lưu trữ trên máy chủ "là KHÔNG đặt thuộc tính miền" Không cụ thể cho PHP, nhưng điều này đã giúp tôi giải quyết vấn đề khi chúng tôi chuyển từ HOST chỉ cookie sang cookie x-tên miền phụ và tôi đã cố gắng xóa cookie chỉ lưu trữ trong javascript bằng cách chỉ định miền đầy đủ và JavaScript đã được thêm một dấu chấm khiến miền của cookie hiện tại không phù hợp và kết quả là không bị xóa. –

16

Nếu bạn chạy script PHP của bạn dưới "http://subdomain.example.net", không sử dụng tham số miền:

setcookie('cookiename','cookievalue',time()+(3600*24),'/'); 

Bạn sẽ nhận được một cookie với "subdomain.example.net "(và không" .subdomain.example.net ")

+0

Sự khác nhau giữa tên miền rõ ràng được đặt thành subdomain.example.net và tên miền nào không được đặt? – Pacerier

+0

nếu bạn đặt, bạn sẽ nhận được dấu chấm ở trước khớp với tất cả tên miền phụ, thay vì chỉ khớp tên miền phụ hiện tại – troseman

2

Điều này có thể giúp ai đó (tôi dành một số giờ để tìm hiểu điều này). Sau khi thực hiện các thay đổi trong tệp nguồn và trước khi bạn kiểm tra, hãy đóng trình duyệt của bạn để hủy đúng PHPSESSIONID trong tất cả các miền và tên miền phụ.

Hy vọng điều này sẽ tiết kiệm thời gian!

+1

Bạn cũng có thể sử dụng phần phiên của Firebug nếu bạn muốn quản lý cookie phiên một cách rõ ràng. – Eli

+2

Đối với tôi, cửa sổ ẩn danh mới hoạt động rất tốt để thử nghiệm. –

12

Nếu bạn đọc tất cả RFC 6265, bạn sẽ nhận ra rằng cách thích hợp duy nhất để có cookie "chỉ lưu trữ" là KHÔNG đặt thuộc tính miền.

http://tools.ietf.org/html/rfc6265#section-5.4

+0

Đặt tên miền thành ".example.com" sẽ chỉ đặt tên miền là máy chủ lưu trữ. – noahnu

7

Tôi nhận ra đây là một câu hỏi cũ nhưng tôi đã có vấn đề này và không ai trong số các câu trả lời ở trên khá đã làm nó.

Tôi muốn đặt cookie phiên cho tên miền phụ, nhưng cũng bật httponly và bảo mật.

Để tránh hàng đầu. trước mặt của tên miền phụ, Kevin và stolsvik là chính xác không đặt thuộc tính miền.

Vì vậy, để làm được điều này và vẫn có thể thiết lập HttpOnly và chế độ an toàn, thiết lập tên miền để NULL như sau:

session_set_cookie_params(0, '/', NULL, TRUE, TRUE); 

Bây giờ bạn sẽ có một cookie phiên, cho một tên miền phụ cụ thể (mà không có một hàng đầu .) với httponly và bảo mật được đặt thành true.

Các vấn đề liên quan