2010-04-05 10 views
9

में कुकी नवीकरण/ओवरराइटिंग नहीं है I IE में कुकीज़ के साथ एक अजीब quirk है। जब कोई उपयोगकर्ता साइट पर लॉग इन करता है, तो मैं एक नया सत्र आईडी उत्पन्न कर रहा हूं और इसलिए कुकी को ओवरराइट करने की आवश्यकता है। प्रवाह मूल रूप से है:आईई

  1. क्लाइंट, https://secure.example.com/users/login पृष्ठ पर जाता है स्वचालित रूप से एक सत्र id
  2. क्लाइंट पदों में एक ही पते पर साख के लिए लॉग इन
  3. ग्राहक एक 302 रीडायरेक्ट के साथ एक साथ निम्नलिखित सेट कुकी शीर्ष लेख प्राप्त करता है प्राप्त करने के लिए https://secure.example.com/users/mypage:

    CAKEPHP = हटाया गया; समाप्ति = सूर्य, 05-अप्रैल -2009 04:50:35 जीएमटी; पथ =/
    CAKEPHP = 98hnIO23 ...; समाप्ति = सोम, 12 अप्रैल 2010 04:50:36 जीएमटी; पथ = /; सुरक्षित

  4. क्लाइंट को https://secure.example.com/users/mypage पर जाना है, जो नया सत्र आईडी प्रस्तुत करता है।

यह सभी ब्राउज़रों में काम करता है, IE को छोड़कर (7 & 8 में परीक्षण किया गया)। आईई पुरानी, ​​अनधिकृत सत्र आईडी को बरकरार रखता है, और इसे वापस लॉगिन पृष्ठ पर रीडायरेक्ट किया जाता है। यह मेरे स्थानीय परीक्षण पर्यावरण पर काम करता है (https://localhost:8443/... पर एक स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग करके), लेकिन लाइव सर्वर पर नहीं।

मैं केकेपीएचपी का उपयोग कर रहा हूं और बस $this->Session->renew() जारी करता हूं, जो उपर्युक्त कुकी हेडर उत्पन्न करता है।

कोई भी विचार नई कुकी को स्वीकार करने के लिए आईई कैसे प्राप्त करें?

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 

मुझे लगता है कि मैं इस समस्या पाया है:


यहाँ पूरा हैडर है आईई समान नाम के दो कुकीज़ भेज रहा है। यहाँ सर्वर के बगल में अनुरोध है: यह दो कुकीज़, एक उस में प्रवेश करने के बाद प्राप्त किया, लेकिन यह भी एक पुरानी भेजता

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... 

सूचना है कि। इसे मुख्य पृष्ठ example.com पर पुराना प्राप्त हुआ, path=/ के साथ सेट किया गया। यह secure.example.com के अनुरोधों के लिए भी भेज रहा है। इसे उपरोक्त शीर्षलेख द्वारा प्रतिस्थापित नहीं किया जाता है, इसके बजाय यह इसे अतिरिक्त कुकी के रूप में जोड़ता है। मैं इसे करने से कैसे रोक सकता हूं?

+0

शायद नया बनाने से पहले पुरानी कुकी को हटाने का प्रयास करें? –

+0

@ डेविड मैंने सोचा कि मैं यही कर रहा हूं। मैं उसी हेडर में और कैसे करूं? – deceze

उत्तर

3

सुनिश्चित करें कि कुकी अपने आधार डोमेन के लिए उत्सर्जित कर रहे हैं।

यह वही समस्या है, क्योंकि यह व्यवहार निश्चित रूप से विभिन्न ब्राउज़रों में भिन्न होता है।

मैं इसे CakePHP में नहीं किया है, लेकिन this should work

+0

हाँ, यह समस्या थी। मैंने लिंक की विधि के माध्यम से 'ini_set ('session.cookie_domain', '.example.com') जोड़ा। धन्यवाद! – deceze

+2

लिंक मर चुका है! –

4

एक आम समस्या यह है कि कुकी सेट करने का दूसरा प्रयास उचित पी 3 पी शीर्षलेख की कमी है और इस प्रकार कुकी को छूने का प्रयास अनदेखा किया जाता है।

अगर आप कुल प्रवाह के शीर्ष लेख पोस्ट यह मददगार होगा (जैसे फ़िडलर का उपयोग को पकड़ने और देखने के लिए)

+0

फिडलर के साथ झुकाव के बाद मुझे लगता है कि मुझे समस्या की जड़ मिली है, कृपया फिर से सवाल देखें। – deceze

+2

सामान्य समस्या जब आपके पास एक ही नाम की दो कुकीज़ होती है तो आप या तो एक ही कुकी को दो अलग-अलग पथ गुणों के साथ सेट करते हैं, या आप एक ही कुकी को दो अलग-अलग DOMAIN विशेषताओं के साथ सेट करते हैं। उत्तरार्द्ध अक्सर तब होता है जब कोई उपयोगकर्ता //example.com के रूप में आपकी साइट पर जाता है और बाद में //www.example.com के रूप में पुनरीक्षण करता है। यदि आपकी साइट कुकी सेट किए बिना www.example.com पर हमेशा रीडायरेक्ट करने के लिए सावधान नहीं है, तो आप दो के साथ समाप्त होते हैं। कुकी डोमेन विरासत की प्रकृति के कारण, जब आप www.example.com पर जाते हैं तो दोनों भेजे जाते हैं। जांचने का सबसे आसान तरीका? //example.com पर जाएं और जांचें! – EricLaw

+0

जैसा कि मैंने आपके प्रश्न को और अधिक बारीकी से पढ़ा है, यह मुझे लगता है जैसे आप पहले ही जानते हैं कि यह समस्या है। इसे ठीक करने के लिए, अपने सभी सेट-कुकी प्रतिक्रिया शीर्षलेखों में DOMAIN = example.com विशेषता जोड़ें। – EricLaw

2

आप दो मुद्दों यहाँ हो सकता है।सबसे पहले, एक शॉट पोस्टिंग @ freddy-rios में लिंक दें। अगर ऐसा नहीं होता है, तो आप आईई "पुनर्निर्देशन कुकी बग" का अनुभव कर सकते हैं।

आईई हमेशा पुनर्निर्देशन के दौरान कुकी संशोधन का सम्मान नहीं करता है। यदि आप लॉगिन फॉर्म पर सत्र आईडी असाइन करते हैं, और इसे नहीं बदलते हैं, तो रीडायरेक्ट को ठीक काम करना चाहिए। यदि आप रीडायरेक्ट पर कुकी को बदल रहे हैं, तो आप शायद पुराने सत्र के साथ समाप्त हो जाएंगे ... ब्राउज़र बस पुरानी कुकी को नए यूआरएल में सबमिट करेगा (तर्कसंगत रूप से, यह क्या करना है ... मूल अनुरोध को रीडायरेक्ट करें)।

इससे निपटने के कुछ तरीके हैं। सबसे दूर तक, जावास्क्रिप्ट या मेटा टैग रीडायरेक्ट का उपयोग करना है। जब तक आप उन कुकीज के साथ गैर-300 पास करते हैं, ब्राउज़र लगभग हमेशा उन्हें स्वीकार करेगा।

यदि आप $this->Session->renew() का उपयोग कर रहे हैं, तो बस इसे हटाकर आपकी सभी समस्याओं का समाधान हो सकता है ... विशेष रूप से यदि यह हुड के नीचे session_regenerate_id() पर कॉल कर रहा है।

मैं रीडायरेक्ट को हटाने और यह देखने में सुझाव देता हूं कि यह अभी भी एक समस्या है। यदि ऐसा है, तो आप जो भी कहा मैंने उसे अनदेखा कर सकते हैं। :)