2013-02-27 24 views
18

IE10 dường như xử lý cookie và tên miền phụ khác với các trình duyệt chính khác (IE8, IE9, Firefox, Chrome, Safari).IE10 chia sẻ cookie trên các tên miền phụ theo mặc định

Chúng tôi sử dụng tên miền phụ rộng rãi cho các môi trường kiểm tra, ví dụ:

  • user1.devel.example.com
  • user2.devel.example.com
  • qa.example.com

Và môi trường sản xuất của chúng tôi sống ở đầu, ví dụ example.com (và về mặt kỹ thuật tại www.example.com).

Chúng tôi sử dụng hàm php setcookie($name, $value, $expires) một cách ngây thơ (không có đường dẫn hoặc miền rõ ràng) để đặt cookie và sau đó xóa cookie (khi người dùng đăng xuất) bằng cách gán chuỗi trống cho giá trị. Điều này luôn hoạt động tốt và mỗi tên miền phụ duy nhất sử dụng cookie của riêng họ.

IE10 hiện tại "chia sẻ" cookie được đặt trong TLD với tất cả các tên miền phụ. Các triệu chứng ban đầu chúng tôi quan sát được là không ai có thể đăng xuất khỏi tên miền phụ. Chúng tôi đã quan sát một vài điều:

  • Mặc dù chia sẻ giá trị, không có tên miền phụ nào có thể xóa cookie.
  • Khi TLD xóa cookie, nó sẽ bị xóa ngay lập tức khỏi tất cả các tên miền phụ.

Có ai khác đã quan sát hành vi tương tự như cách IE10 lưu trữ/áp dụng cookie liên quan đến tên miền phụ không? Có cách giải quyết nào khác ngoài việc rõ ràng về tên miền mà cookie áp dụng khi gửi tiêu đề Set-Cookie ban đầu không?

+0

Tôi đã gặp phải sự cố với IE10 và cookie. Tôi không biết nếu vấn đề của bạn là như nhau. Xem ở đây để biết thêm thông tin về vấn đề của tôi: http://stackoverflow.com/questions/15856886/ajax-on-ie10-dont-send-cookies – jmcollin92

+0

Hành vi này cũng có trong IE8 và IE9. –

Trả lời

15

Tôi vừa gặp sự cố này.

Dưới đây là một liên kết đến một ai đó khám phá lỗi này/vấn đề: Cookies with and without the Domain Specified (browser inconsistency)

này cũng có thể liên quan: Cookie set for subdomain, but IE Developer Tools show cookie at root domain. What am I missing?

Kết luận của tôi là khi thiết lập một cookie từ một tên miền gốc không www (http://sites.com), trong IE, đây được xem là một cookie ký tự đại diện cho tất cả các tên miền phụ. Chrome và Firefox không hiển thị hành vi này - chúng kết hợp một tập hợp cookie từ một miền gốc không phải www vì chỉ được liên kết với thư mục gốc đó.

Tôi đã mã hóa các trang web mẫu bằng cách sử dụng biểu mẫu web .net, IIS và tệp máy chủ của tôi. Tôi có 3 trang web: a.site.com, b.site.com và site.com. Họ đều phục vụ các tập tin cookie với cùng tên chính xác. Hãy gọi nó là "ShoppingCart".

Bạn có thể đặt nhiều thuộc tính trên cookie, bao gồm tên miền mà cookie phải được liên kết. Tôi rời thuộc tính này để được xác định/không xác định bởi .net. Khi Chrome nhận được cookie từ mỗi trang web, Chrome sẽ hiển thị tên miền của cookie như một cách rõ ràng từ tên miền được liệt kê trong thanh địa chỉ của trình duyệt. Trong IE, điều này không đúng. IE xử lý cookie từ http://sites.com như được định nghĩa là ".sites.com" và theo RFC cho cookie, điều này có nghĩa là cookie có thể truy cập được từ tất cả các tên miền phụ.

Cũng trong IE, nếu nhiều cookie được đặt cùng tên, IE sẽ trả lại chúng cho máy chủ theo thứ tự chúng được đặt. Vì vậy, nếu tôi truy cập http://sites.com trước và sau đó truy cập http://a.sites.com và sau đó làm mới, IE sẽ xem cookie từ http://sites.com dưới dạng cookie hợp lệ để gửi tới máy chủ theo yêu cầu http://a.sites.com được gửi cùng với cookie cho http://a.sites.com, ngoại trừ cookie cho http://sites.com đầu tiên trong danh sách.

Trong .net, từ những gì tôi đã thấy, cookie thường được truy cập bằng tên khóa chứ không phải theo chỉ mục. Vì vậy, khi mã phía máy chủ cố gắng truy cập vào giá trị cho khóa có tên là "ShoppingCart", nó sẽ lấy giá trị cho trang web đầu tiên đặt giá trị cookie - ở đây sẽ là http://sites.com.

Tóm tắt - không sử dụng miền không phải www khi bạn có tên miền phụ tất cả chia sẻ cùng tên khóa cookie vì, trong khi Chrome/Firefox xử lý liên kết tên miền như bạn mong đợi, IE gây ra hành vi lỗi.

Chỉnh sửa--

Chỉ cần làm rõ cho bất kỳ ai đọc điều này, tôi đã sử dụng IE10 để khám phá vấn đề này.

0

Tôi gặp vấn đề tương tự trong IE 11.0.9600 cho cookie phiên php: Internet Explorer đang gửi cookie miền gốc tới tất cả các tên miền phụ của nó. Để giải quyết điều này, tôi lưu trữ tên miền trong một biến phiên:

$_SESSION['URL'] = str_replace('www.', '', $_SERVER['HTTP_HOST']); 

Sau đó cho mọi yêu cầu, tôi kiểm tra các biến session:

if (str_replace('www.', '', $_SERVER['HTTP_HOST']) != $_SESSION['URL']) { 
    session_regenerate_id(true); 
    $_SESSION = array(); 
    $_SESSION['URL'] = str_replace('www.', '', $_SERVER['HTTP_HOST']); 
} 

Sau đó, khi chúng tôi di chuyển từ tên miền gốc đến tên miền phụ, chúng tôi sẽ không 'trong' cùng một phiên.

3

cách siêu dễ dàng để sửa lỗi này nếu bạn có nhiều trang web PHP trên một miền .

Ví dụ - nếu bạn có Wordpress trên thư mục gốc (example.com) và bạn có một ứng dụng PHP tùy chỉnh trên tên miền phụ (a.example.com) thì trong ứng dụng hoặc Wordpress bạn cần đặt một Tên phiên khác .

Thêm session_name() trước khi session_start() của bạn mà nên cung cấp hai tên riêng biệt với phiên giao dịch và do đó không xung đột.

session_name('AppSession'); 
session_start(); 

Dễ dàng.

+0

Có cảm ơn bạn điều này hoàn toàn làm việc cho tôi. Tôi có example.com và webapp.example.com và các cookie từ example.com đã gặp phải trong IE nên tôi không thể đăng nhập vào webapp.example.com. Điều này cố định nó cho tôi, tôi chỉ cần ném tên miền vào tên phiên. '$ sesName = (isset ($ _ SERVER ['HTTP_HOST'])? $ _SERVER ['HTTP_HOST']: $ _SERVER ['SERVER_NAME']); $ sesName = str_replace ('.',' ', $ sesName); $ sesName = str_replace ('-', '', $ sesName); $ sesName = str_replace (':', '', $ sesName); session_name ($ sesName); ' –

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