2015-06-09 7 views
10

आज मैं कुछ परेशान देखा जबकि storage/framework/sessions Laravel 5.Laravel - सत्र डेटा बचता लॉग-आउट/लॉग-इन, यहां तक ​​कि विभिन्न उपयोगकर्ताओं के लिए

यहाँ द्वारा बनाई गई फ़ोल्डर में सत्र फ़ाइलों का निरीक्षण क्या हुआ है:

  1. मैं उपयोगकर्ता के रूप में लॉग इन एक
  2. मैं एक पृष्ठ सत्र
  3. मैं लॉग आउट में चर एक्स संग्रहीत करता है पर नेविगेट, लेकिन ब्राउज़र बंद नहीं किया।
  4. storage/framework/sessions में सत्र फ़ाइल अभी भी वहां थी, और ब्राउज़र कुकी जीवित थी।
  5. मैं उपयोगकर्ता बी
  6. में पुरानी सत्र फ़ाइल हटा दी गई और एक नई सत्र फ़ाइल वहां थी।
  7. मैंने नई सत्र फ़ाइल में देखा - आश्चर्य! परिवर्तनीय एक्स लॉग-आउट से बच गया है और अभी भी वहां है, उपयोगकर्ता बी के लिए सुलभ है!

यह सुरक्षा चिंताओं की ओर जाता है, क्योंकि अब उपयोगकर्ता बी

Laravel स्रोत कोड के माध्यम से डिबगिंग जबकि, मुझे पता चला है कि सत्र स्टोर लॉगआउट/लॉगिन के दौरान साफ ​​किया कभी नहीं किया गया है उपयोगकर्ता ए के डेटा तक पहुँच गया है प्रक्रिया। Illuminate\Auth\Guard::clearUserDataFromStorage() विधि में केवल लॉगिन प्रमाण-पत्र हटा दिए जा रहे हैं, लेकिन सभी सत्र स्टोर विशेषताएँ अभी भी वहां हैं, और बाद में $kernel->terminate($request, $response); को कॉल किया जाता है, जो बदले में Illuminate\Session\Middleware\StartSession::terminate()Store::save() पर कॉल करता है, जो इस तथ्य को अनदेखा करते हुए $this->attributes को अंधेरे से बचाता है यह अब किसी अन्य उपयोगकर्ता से संबंधित है।

एक ओर से, यह तार्किक लगता है - लार्वावेल के पास मेरे डेटा के बारे में कोई धारणा नहीं है और क्या मैं इसे प्रमाणीकरण के साथ समाप्त करना चाहता हूं या नहीं। लेकिन यह बहुत अच्छा होगा कि इसे प्रमाणीकरण ऑब्जेक्ट में कुछ संवेदनशील डेटा संलग्न करने के समाधान के साथ कहीं और दस्तावेज किया जाए और इसके साथ समाप्त हो जाए।

इसका मतलब यह है कि मैं एक प्रोग्रामर के रूप में पूरी तरह से वर्तमान सत्र से सभी संवेदनशील डेटा दूर समाशोधन जब एक नया (या समान) उपयोगकर्ता में लॉग इन करने के लिए जिम्मेदार हूँ। लॉग आउट नहीं होगा पर

क्लियरिंग भरोसेमंद, क्योंकि उपयोगकर्ता कभी भी लॉगआउट लिंक पर क्लिक नहीं कर सकता है, लेकिन सत्र को "समाप्त" करने का इंतजार कर सकता है, जिसके लिए लैरावेल अभी भी सत्र को साफ़ नहीं करता है।

ध्यान में रखने के लिए एक और बात: मुझे सत्र को बहुत जल्दी नहीं साफ़ करना चाहिए - एंटीफॉर्गेरी टोकन मौजूद होना चाहिए, या फिर लॉगिन फॉर्म हमेशा विफल रहेगा।

http://laravel.io/forum/04-27-2014-how-to-expire-session-data

मैं इस से उलझन में मिल गया:

मैं एक मंच विषय है जो भी कुछ ऐसी ही समस्या का समाधान करने की कोशिश करता पाया है

मैं एक और उस पर जाना था आज और पता चला कि क्या समस्या यह थी: सत्र :: फ्लश() ऐप बनाता है जो सत्र डेटा को हटाता नहीं है, जैसे शॉपिंग कार्ट विवरण

यदि यह सत्य है, तो सत्र से पूरी तरह से छुटकारा पाने का एकमात्र तरीका PHP मूल session_unset() और session_destroy() का उपयोग करना होगा, लेकिन मैं इस तरह से नहीं जाना चाहूंगा - मैं क्लीनर, लैरवेल-आश समाधान ढूंढना पसंद करूंगा, अगर मुमकिन।

मैं लैरवेल को कैसे बता सकता हूं कि मैं प्रमाणीकरण समाप्त होने या उपयोगकर्ता लॉग आउट होने पर उपयोगकर्ता प्रमाणीकरण डेटा के साथ अपने पुराने सत्र डेटा को एक साथ हटा देना चाहता हूं?

उत्तर

4

laravel docs में यह कहते हैं कि आप कर सकते हैं:

सत्र

Session::forget('key'); 

से एक आइटम निकाल रहा है सत्र से सभी आइटम निकाल रहा है

Session::flush(); 

आप नेविगेट कर सकता है AuthenticatesAndRegistersUsers.php विशेषता के लिए और फिर से लिखने

/** 
    * Log the user out of the application. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function getLogout() 
    { 
     $this->auth->logout(); 

     return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/'); 
    } 

को
/** 
    * Log the user out of the application. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function getLogout() 
    { 
     Session::flush(); 

     $this->auth->logout(); 

     return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/'); 
    } 

मुझे पता नहीं है, तो यह वास्तव में काम करते हैं, लेकिन यह एक कोशिश :)

अद्यतन

According to this answer here on Stack Overflow दे, तो आप सेट कर सकते हैं ब्राउज़र को बंद करने के लिए सत्र, या XXX मिनट के बाद। उपरोक्त समाधान के साथ एक साथ प्रयुक्त, यह समस्या को ठीक करना चाहिए?

config में/session.php

/* 
    |-------------------------------------------------------------------------- 
    | Session Lifetime 
    |-------------------------------------------------------------------------- 
    | 
    | Here you may specify the number of minutes that you wish the session 
    | to be allowed to remain idle before it expires. If you want them 
    | to immediately expire on the browser closing, set that option. 
    | 
    */ 

    'lifetime' => 120, 

    'expire_on_close' => false 
+1

हाँ, यह काम करेगा जब उपयोगकर्ता उद्देश्य पर बाहर लॉग करता है। लेकिन अगर वह सत्र समाप्त होने तक ब्राउज़र को खुले रखता है, तो मुझे उन भूलभुलैया कार्यों को मैन्युअल रूप से कॉल करना होगा। ऐसा लगता है, मैं अकेला नहीं हूं जिसने इस संभावित सुरक्षा समस्या की खोज की है: https://github.com/laravel/framework/issues/8661 – JustAMartin

+0

उत्तर अपडेट किया गया। क्या यह आपके लिए इस मुद्दे को ठीक करता है? – MartinJH

+0

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

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