2016-05-06 6 views
10

मेरा php सत्र एक अपमानजनक व्यवहार दिखा रहा है। स्थिति:सत्र अचानक व्यवहार दिखा रहा है

(https://example.com) में
  • उपयोगकर्ता लॉग आवेदन
  • सत्र कुकी वैधता 7 दिनों के लिए निर्धारित किया है। (https के बिना) (ब्राउज़र कुकी जीवनकाल से सत्यापित) किसी अन्य डोमेन में
  • उपयोगकर्ता चाल
  • उपयोगकर्ता आवेदन लिंक पर क्लिक करके कुछ समय बाद वापस आने के लिए कोशिश करता है, सत्र को नष्ट कर दिया जाता है।
  • व्यवहार अचानक है। कभी-कभी, यह वैध रहता है।

    if(!$this->session_manager_issession_set()) { 
          $this->set_ini_config(); 
          session_name($this->session_manager_name); 
          session_set_cookie_params($this->session_cookie_life, "/"); //Required for browser cookie cleanup 
    } 
    
    session_start(); 
    
    if(empty($_SESSION)) 
        { 
         $output['status'] = false; 
        } 
        else{ 
         // Fetch the variables 
        } 
    
    public function session_manager_issession_set(){ 
         $output = true; 
    
         $session_status = session_status(); 
         switch($session_status){ 
          case PHP_SESSION_ACTIVE : 
    
          break; 
          default: 
           $output = false; 
         } 
    
         return $output; 
        } 
    
    private function set_ini_config(){ 
        $output = true; 
    
        ini_set('session.gc_probability', 1); //If session expires then ensure that session is flushed and cleared at all instances 
        ini_set('session.gc_divisor', 100);  //If session expires then ensure that session is flushed and cleared at all instances 
    
        ini_set('session.gc_maxlifetime', 7*24*60*60); //MAx life of session cookie 
        ini_set('session.cookie_secure', true); 
    
        return $output; 
    } 
    

    क्या कारण हो सकता है:

यहाँ कैसे मैं सत्र शुरू होता है? क्या मैंने सत्र को गलत तरीके से कार्यान्वित किया है?

+0

चलती 'session_start() करके देख सकते हैं '। इसके अलावा, शायद आपको [दस्तावेज़ीकरण] (http://us3.php.net/function.session-start) –

+0

पर ध्यान देना चाहिए जब आप कहते हैं कि "उपयोगकर्ता दूसरे डोमेन पर जाता है", तो इसका मतलब है एक अलग वेब सर्वर, है ना? – Webomatik

+0

@EagleEye, session_name() के नाम से जाना session_start से पहले() – Webomatik

उत्तर

0

आप अपने प्रश्न में और टिप्पणियों में उल्लेख किया है, उपयोगकर्ता केवल एक अलग डोमेन में जाने नहीं है, लेकिन कुल मिलाकर एक अलग सर्वर के लिए (इसलिए http से https करने के लिए परिवर्तन हमें पाठकों के लिए और अधिक समझ में आता है)। $_SESSION एक सुपरग्लोबल है जो सर्वर पर सहेजा गया है, इसलिए सर्वर बदलना सबसे संभावित कारण है कि आपका $_SESSION मान नष्ट हो रहा है।

तथ्य में, यह अभी भी मौजूद है, लेकिन जब से तुम एक अलग सर्वर से उस तक पहुंच की कोशिश कर रहे हैं, तो सर्वर यह नहीं मिल और इसलिए आप (या सर्वर) नेतृत्व पर विश्वास करने के लिए यह नष्ट हो गया था सकता है (के बाद से यह मूल सर्वर पर रह रहा है जिसने सत्र शुरू किया)। यह समझाएगा कि यह कभी-कभी क्यों काम करता है और कभी-कभी ऐसा नहीं करता है, क्योंकि आप सर्वर के बीच स्विच कर सकते हैं और कभी-कभी आप भाग्यशाली हो जाते हैं और उसी सर्वर पर होते हैं जिसने सत्र को पहले स्थान पर बनाया था।

+0

मैं किसी भिन्न सर्वर से सत्र तक पहुंचने की कोशिश नहीं करता लेकिन उसी सर्वर से जिसने इसे बनाया है। उपयोगकर्ता एक अलग सर्वर पर चलता है और जब वह उसी सर्वर पर वापस आता है, तो सत्र मान्य होता है। –

+0

@ करुका क्या आपका मतलब है कि सत्र मान्य नहीं है? क्योंकि अगर यह मान्य किया गया था तो यह ठीक से चिंतित होगा, जो यह सही नहीं है? – Webeng

+0

द्वारा मान्य मैं कहना है, '$ _SESSION' चेक किया गया है अगर यह सत्र चर या नहीं शामिल था। –

0

कृपया session.cookie_secure के बारे में php.net manual

यह एक सुरक्षित (ताकि https) कनेक्शन केवल करने के लिए अपने सत्र कुकी सीमा पर पढ़ें। सत्र हानि हो जाती है जब https से स्विच अपने सभी समारोह session_manager_issession_set() के खाते में http

+0

लेकिन जब 'https' पर वापस आते हैं तो क्या यह सत्र को पुनरारंभ नहीं करना चाहिए? –

+0

हाँ, यह ** ** होना चाहिए - अगर ऐसा नहीं है तो ऑनटॉप पर कुछ और चल रहा है। लेकिन सबसे पहले आपको 'session.cookie_secure' सेटिंग्स की जांच करनी चाहिए। – pocketrocket

+0

यदि आप एक ही डोमेन नाम के साथ एक गैर-एसएसएल vhost * में एक ही नाम के साथ एक नई कुकी के साथ इसे ओवरराइट नहीं करते हैं * – symcbean

1

पहले मूल रूप से जाँच करता है, तो सत्र शुरू नहीं किया गया है (session_status() != PHP_SESSION_ACTIVE), लेकिन फिर आप तथ्य यह है कि सत्र सकता है चल रहे हैं अनदेखी सत्र शुरू करते हैं।

एक सत्र नाम आप के लिए महत्वपूर्ण है, तो आप इसे लागू करना होगा:

if ($this->session_manager_issession_set()) { 
    // session has already started, but we haven't set a name for it! 
    throw new Exception("Session started prematurely"); 
} 

// all fine, session isn't running; continue with setup 
$this->set_ini_config(); 
session_name($this->session_manager_name); 
session_set_cookie_params($this->session_cookie_life, "/"); 
// and finally start the session 
session_start(); 

session.name के बाद से दुकान सत्र आईडी के लिए एक कुकी के लिए एक नाम सेट करता है, और आप इसके लिए एक गैर डिफ़ॉल्ट नाम का उपयोग करें, मेरा अनुमान है कि कुछ ऐसा करने से पहले सत्र शुरू होता है, इसलिए आप पहले से शुरू होने वाले सत्र के साथ जुड़े सत्र को नहीं देख सकते हैं।

अन्य विकल्प सभी कोड रखने के लिए, और

session_name($this->session_manager_name); 

साथ केवल एक ही लाइन निकाल देते हैं तो यह मदद करता है, तो मैं सही होना चाहिए है।

1

के अपने सत्र मापदंडों जाँच की किसी भी चेक करने से पहले,, मूलभूत बातों से प्रारंभ की तरह उदाहरण के लिए बस

print_r($_SESSION); 

द्वारा यह होगा बस उत्पादन सत्र चर तुम वहाँ में है शुरू करते हैं, इस तरह आप मौसम को देखने के सर्वर सत्र और इसके चर,

अगला, मुझे लगता है कि यहां कुछ जवाब कुछ हैं, आप गीलेर की जांच कर रहे हैं कि आपका सत्र शुरू हो गया है लेकिन आप गीलेर को देखना चाहते हैं कि एक सत्र अभी भी जीवित है (समान नहीं चीज) ...

तो आपको लगता है कि सत्र चर में एक निश्चित कुंजी हमेशा उपलब्ध नहीं होगा, तो बस का उपयोग करके जाँच पता है:

if(isset($_SESSION['your_key'])) { 
// Your code if session has been made already 
} 

मैं जानता हूँ कि यह लगता है जैसे कि यह साधारण है, लेकिन हे मूल बातें करने के लिए लौटने में कोड नहीं है necessairily एक बुरी बात है जब आप अपनी गलतियों यह पता लगाने की कोशिश कर रहे हैं :) तो यह कोशिश करते हैं और अगर आप तो आप कुछ गलत बयान है कि झूठी भले ही अपने सत्र चर बरकरार हैं प्रयोग कर रहे हैं के लिए ऊपर काम के दोनों ...:)

0

राफेल कह रही है कि आप पुन: बनाने और एक सरल कोड आधार के साथ समस्या को हल करने का प्रयास करना चाहिए में सही है। ब्राउज़र द्वारा लौटाए जाने वाले कुकीज़ को खोजने के लिए आपको अपने कोड का भी उपकरण बनाना चाहिए।

मैं गलत तरीके से सत्र से लागू किया है?

हां।

कोड को पढ़ने के लिए मुश्किल है, एक स्विच बयान innappropriately का उपयोग करता है, कोई अच्छे कारण के लिए प्रणाली config, और कई अन्य अजीब बातें ओवरराइड करता है। कम से कम नहीं है कि यह एक विशेष रूप से असामान्य उपयोग के मामले जहाँ आप एक सत्र की आवश्यकता होती है चाहिए इतने लंबे समय के लिए सक्रिय (एक "मुझे याद रखें" क्षमता एक सत्र से बहुत अलग है) होने के लिए है। ?, आपकी फ़ाइल के शीर्ष करने के `बस के बाद`

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