2009-11-05 19 views
5

के बाद नष्ट नहीं हो रहा है मैं अपने PHP अनुप्रयोग के लिए प्रमाणीकरण तंत्र बनाने की कोशिश कर रहा हूं और मुझे सत्र को नष्ट करने में कठिनाई हो रही है। मैं प्रमाणीकरण टोकन जो पहले सत्र सरणी के भीतर स्थापित किया गया था unsetting औरPHP सत्र उपयोगकर्ता लॉगआउट

session_destroy के माध्यम से सत्र को नष्ट करने,

के साथ ही सत्र नष्ट करने से पहले पूरी तरह से सत्र सरणी रीसेट करने की कोशिश की है। मैं हेडर फ़ंक्शन को कॉल कर रहा हूं और फ़ंक्शन कॉल के अंत में अपने index.php पेज पर वापस जा रहा हूं। मैं भी सत्र को समाप्त करने को संभालने के लिए

session_write_close

कोशिश की है। जब मैं उपयोगकर्ता को लॉग आउट करता हूं, तो मैं सत्र का वार्डम्प करता हूं, और यह कोई डेटा मौजूद नहीं दिखाता है, हालांकि जब मैं index.php पेज पर वापस जाता हूं, तो मैं उपयोगकर्ता प्रमाणीकरण डेटा वापस ले रहा हूं। मैंने यह सुनिश्चित करने के लिए पोस्ट डेटा का वर्डम्प भी किया है कि मैं पोस्ट प्रमाणीकरण हैंडलर को किसी भी तरह से पुनः सबमिट नहीं कर रहा हूं।

यहां क्या करना है इसके बारे में कोई सुझाव?

+0

आपको सामान्यतः उपयोगकर्ता प्रमाणीकरण के लिए session_write_close() का उपयोग करने की आवश्यकता नहीं है। Logout.php पेज पर session_start को कॉल न करने के लिए – mauris

उत्तर

6

सबसे पहले मत भूलना, सुनिश्चित करें कि आपकॉल कर रहे हैं बनाने के session_destroy(); पर कॉल करने से पहलेक्योंकि यह केवल एक चेतावनी जारी करेगा यदि आप नहीं करते हैं।

इसके अलावा, PHP: session_destroy से:

आदेश, कुल मिलाकर सत्र को मारने उपयोगकर्ता को लॉग आउट करना चाहते करने के लिए, सत्र id भी सेट नहीं किया जाना चाहिए। यदि सत्र आईडी (डिफ़ॉल्ट व्यवहार) को प्रसारित करने के लिए कुकी का उपयोग किया जाता है, तो सत्र कुकी हटा दी जानी चाहिए। इसके लिए setcookie() का उपयोग किया जा सकता है।
+4

+1। – jkushner

+0

यदि आपने नामित सत्रों का उपयोग किया है तो session_name का भी उपयोग करना न भूलें! – Calmarius

0

मैं जाँच करेगा क्या सर्वर से ब्राउज़र भेज रहा है फ़िडलर और यह भी जाँच क्या जानकारी आप अपनी session.save_path में संग्रहीत किए गए हैं

0

क्या आप वाकई पेज कैश्ड नहीं होता हैं का उपयोग कर? प्रमाणीकरण टोकन से अधिक

लिखें:

session_start(); 
$_SESSION['varName'] = null; 
$_SESSION = array(); 
session_destroy(); 
0

लेकिन जब मैं index.php पृष्ठ

लिए वापस जाने के विशेष पृष्ठ बस ब्राउज़र से अनुरोध किया गया नहीं है कैश? पृष्ठ के हार्ड रीफ्रेश करें (CTRL+F5 अधिकांश वेबब्रोसर में)।

हैं कि पता चला है कारण हो और आप, अनुरोध कैशिंग निष्क्रिय करने के लिए शीर्ष लेख के निम्नलिखित सेट जोड़ने <head> अपने पृष्ठ HTML हैं: PHP के header() समारोह का उपयोग कर

<meta http-equiv="cache-control" content="no-cache,no-store,must-revalidate"> 
<meta http-equiv="pragma" content="no-cache"> 
<meta http-equiv="expires" content="0"> 

या PHP कोड में,:

header('cache-control: no-cache,no-store,must-revalidate'); // HTTP 1.1. 
header('pragma: no-cache'); // HTTP 1.0. 
header('expires: 0'); // Proxies. 

परीक्षण से पहले ब्राउज़र का कैश साफ़ करने के लिए :)

2

PHP सत्रों के बारे में भी ध्यान देने योग्य, session_unset()>session_destroy(); मुझे नहीं पता क्यों।PHP Manual entry on session_destroy() पढ़ने के बाद, ऐसा लगता है कि वर्तमान संदर्भ में केवल डेटा को हटाया गया है, और वास्तव में इसे फ्लैट सत्र फ़ाइल से साफ़ नहीं किया गया है, इसलिए यदि आपने कुकी को साफ़ नहीं किया है तो आप इसे वापस प्राप्त कर सकते हैं। यह अत्यधिक काउंटर-अंतर्ज्ञानी लगता है (जैसा कि PHP अक्सर होता है), और शायद कारण है कि मैंने session_unset()session_destroy() पर हमेशा session_unset() का उपयोग करने के लिए (और फिर कारण को भूल गए) का फैसला किया।

साथ ही, सुनिश्चित करें कि आपके द्वारा इस सत्र सत्र बकवास करने के बाद आपका रीडायरेक्ट हो रहा है, क्योंकि PHP उन तरीकों से कार्य करता है जो सभी डेवलपर अपेक्षा करते हैं। बेस्ट प्रैक्टिस, IMO,) आप केवल session_unset (का उपयोग करते हैं एक die;

1

के साथ हर header('Location: ...'); कॉल का पालन करने के तो गाड़ी IE अभी भी डेटा रखता है मेरे सुझाव दोनों का उपयोग करने के लिए है है।

संबंधित मुद्दे