2010-04-05 27 views
9

Tôi có một quirk lạ với cookie trong IE. Khi người dùng đăng nhập vào trang web, tôi tạo một id phiên mới và do đó cần phải ghi đè lên cookie. Dòng chảy cơ bản là:Cookie không gia hạn/ghi đè trong IE

  1. Khách hàng đi vào https://secure.example.com/users/login trang, tự động nhận một phiên id
  2. POSTS khách hàng thông tin đăng nhập với cùng địa chỉ
  3. Khách hàng nhận các tiêu đề thiết lập cookie sau cùng với một chuyển hướng 302 để https://secure.example.com/users/mypage:

    CAKEPHP = đã xóa; hết hạn = CN, 05-Apr-2009 04:50:35 GMT; đường dẫn =/
    CAKEPHP = 98hnIO23 ...; hết hạn = Thứ Hai, 12 tháng 4 năm 2010 04:50:36 GMT; path = /; an toàn

  4. Khách hàng được yêu cầu truy cập https://secure.example.com/users/mypage, trình bày id phiên mới.

Tính năng này hoạt động trên tất cả các trình duyệt, ngoại trừ IE (được thử nghiệm trong 7 & 8). IE giữ lại id phiên cũ, không được xác thực và được chuyển hướng trở lại trang đăng nhập. Nó hoạt động trên môi trường thử nghiệm cục bộ của tôi (sử dụng chứng chỉ tự ký tại https://localhost:8443/...), nhưng không hoạt động trên máy chủ trực tiếp.

Tôi đang sử dụng CakePHP và chỉ cần phát hành $this->Session->renew(), sản xuất các tiêu đề cookie ở trên.

Bất kỳ ý tưởng nào về cách yêu cầu IE chấp nhận cookie mới?


Đây là tiêu đề đầy đủ:

HTTP/1.0 302 Moved Temporarily 
Date: Thu, 08 Apr 2010 02:54:30 GMT 
Server: Apache 
Expires: Mon, 26 Jul 1997 05:00:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM" 
Set-Cookie: CAKEPHP=deleted; expires=Wed, 08-Apr-2009 02:54:30 GMT; path=/ 
Set-Cookie: CAKEPHP=d55c...; expires=Thu, 15 Apr 2010 02:54:31 GMT; path=/; secure 
Last-Modified: Thu, 08 Apr 2010 02:54:30 GMT 
Location: https://secure.example.com/users/mypage 
Vary: Accept-Encoding 
Content-Length: 0 
Connection: close 
Content-Type: text/html; charset=utf-8 

Tôi nghĩ rằng tôi đã tìm thấy các vấn đề: IE đang gửi hai cookie của tên giống hệt nhau. Đây là yêu cầu tiếp theo đối với máy chủ:

GET /users/mypage HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, */ * 
Referer: https://secure.example.com/users/login 
Accept-Language: en-gb 
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322) 
Accept-Encoding: gzip, deflate 
Host: secure.example.com 
Connection: Keep-Alive 
Cache-Control: no-cache 
Cookie: CAKEPHP=19c6...; CAKEPHP=d55c... 

Lưu ý rằng nó sẽ gửi hai cookie, cookie nhận được sau khi đăng nhập, nhưng cũng là cookie cũ. Nó đã nhận được một cái cũ ở trang chính example.com, được thiết lập với path=/. Nó cũng gửi nó cho các yêu cầu đến secure.example.com. Nó không được thay thế bằng tiêu đề ở trên, thay vào đó nó thêm nó làm cookie bổ sung. Làm thế nào tôi có thể ngăn chặn nó làm điều đó?

+0

Có thể thử xóa cụ thể cookie cũ trước khi tạo cookie mới? –

+0

@ David Tôi nghĩ đó là những gì tôi đang làm. Làm thế nào khác tôi sẽ làm điều đó trong cùng một tiêu đề? – deceze

Trả lời

3

Hãy chắc chắn rằng các tập tin cookie được phát ra cho tên miền cơ sở của bạn.

Đó có thể là vấn đề, vì hành vi này chắc chắn thay đổi trong các trình duyệt khác nhau.

tôi đã không thực hiện nó trong CakePHP, nhưng this should work

+0

Đúng, đó là vấn đề. Tôi đã thêm 'ini_set ('session.cookie_domain', '.example.com')' thông qua phương thức được liên kết. Cảm ơn! – deceze

+2

Liên kết đã chết! –

4

Một vấn đề phổ biến là nỗ lực thứ hai để đặt cookie thiếu tiêu đề P3P thích hợp và do đó, nỗ lực chạm vào cookie sẽ bị bỏ qua.

Nó sẽ rất hữu ích nếu bạn đăng các tiêu đề của dòng chảy chung (ví dụ sử dụng Fiddler để nắm bắt và tìm kiếm)

+0

Sau khi chơi đùa với Fiddler, tôi nghĩ rằng tôi đã tìm ra gốc rễ của vấn đề, xin hãy xem lại câu hỏi. – deceze

+2

Vấn đề điển hình khi bạn có hai cookie cùng tên là bạn đặt cùng một cookie với hai thuộc tính PATH khác nhau hoặc bạn đặt cùng một cookie với hai thuộc tính DOMAIN khác nhau. Thông tin sau thường xảy ra khi người dùng truy cập trang web của bạn dưới dạng //example.com và sau đó truy cập lại dưới dạng //www.example.com. Nếu trang web của bạn không cẩn thận để luôn chuyển hướng đến www.example.com mà không cần đặt cookie, bạn sẽ kết thúc bằng hai. Do bản chất của sự thừa hưởng miền cookie, cả hai đều được gửi khi bạn truy cập www.example.com. Cách đơn giản nhất để kiểm tra? Truy cập //example.com và kiểm tra! – EricLaw

+0

Khi tôi đọc câu hỏi của bạn chặt chẽ hơn, có vẻ như tôi đã biết rằng đây là vấn đề. Để khắc phục, hãy thêm thuộc tính DOMAIN = example.com vào tất cả các tiêu đề phản hồi SET-COOKIE của bạn. – EricLaw

2

Bạn có thể có hai vấn đề ở đây.Trước tiên, hãy cung cấp liên kết trong @ freddy-rios đăng một ảnh. Nếu điều đó không làm điều đó, thì bạn có thể gặp lỗi "lỗi cookie chuyển hướng" của IE. "

IE không phải lúc nào cũng tôn trọng sửa đổi cookie trong khi chuyển hướng. Nếu bạn chỉ định ID phiên trên biểu mẫu đăng nhập và không thay đổi nó, thì chuyển hướng sẽ hoạt động tốt. Nếu bạn đang thay đổi cookie trên chuyển hướng, thì có thể bạn sẽ kết thúc với phiên cũ ... trình duyệt sẽ chỉ cần gửi cookie cũ đến URL mới (có thể cho là, nó phải làm gì ... chuyển hướng yêu cầu ban đầu).

Có một số cách để giải quyết vấn đề này. Điều xấu nhất, cho đến nay, là sử dụng chuyển hướng thẻ Javascript hoặc META. Miễn là bạn vượt qua 300 không với các cookie đó, trình duyệt hầu như sẽ luôn chấp nhận chúng.

Nếu bạn đang sử dụng $this->Session->renew(), chỉ cần xóa nó có thể giải quyết tất cả các vấn đề của bạn ... đặc biệt là nếu nó gọi session_regenerate_id() dưới mui xe.

Tôi muốn đề xuất xóa chuyển hướng và xem liệu đó có phải là sự cố hay không. Nếu có, thì bạn có thể bỏ qua mọi thứ tôi đã nói. :)

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