2012-05-12 9 views
8

मेरे पास वर्तमान में मेरी वेबसाइट पर प्रत्येक पृष्ठ के लिए निम्न कोड है। कृपया कोई भी पुष्टि कर सकता है कि PHP सत्र शुरू करने और जारी रखने के लिए यह एक अच्छा अभ्यास है या नहीं?तेज़ और कुशल PHP सत्र

//************************************************************ 
//Session Settings 
//************************************************************ 

$session_name = 'PHPSESSID'; 
$session_exp_time = 10000; 

$previous_name = session_name($session_name); 

//Set garbage collection parameters 
ini_set('session.gc_maxlifetime', $session_exp_time); 
ini_set('session.gc_probability', '1'); 
ini_set('session.gc_divisor', '100'); 

ini_set('session.name', $session_name); 
ini_set('session.cookie_domain', ''); //Session set to not be available to subdomains 
ini_set('session.cookie_lifetime', 0); 

//Set the session cookie parameters 
session_set_cookie_params($session_exp_time, '/', ''); 

//Start or continue a session... 
@session_start(); 

if (isset($_COOKIE[$session_name])) 
setcookie($session_name, $_COOKIE[$session_name], 2147483647, ''); 

कृपया ध्यान दें कि यह स्क्रिप्ट प्रत्येक पृष्ठ में शामिल है।

एक अन्य संबंधित प्रश्न:

मैं एक कस्टम सत्र सेट करनी चाहिए पथ को बचाने या मैं सिर्फ पथ बचाने सर्वर के डिफ़ॉल्ट सत्र इस्तेमाल करना चाहिए? पक्ष और विपक्ष क्या होते हैं? जो मैं समझता हूं, यदि आप एक कस्टम सत्र पथ को सहेजते नहीं हैं, तो संभावना है कि आपके पास साझा होस्टिंग पर किसी तरह का संघर्ष हो सकता है? कृपया प्रबुद्ध मदद करें।

अग्रिम धन्यवाद!

+1

क्या आपके पास सर्वर के php.ini तक पहुंच है? या यह .htaccess फ़ाइलों का समर्थन करता है? यदि हां, तो उनमें से कई आईएनआई प्रविष्टियां जा सकती हैं। –

+1

आप इसे एक पीएचपी फ़ाइल में भी धक्का दे सकते हैं ताकि प्रत्येक बार प्रत्येक बार प्रत्येक कोड में फ़ाइल शामिल न हो। जब तक आप पहले से ही ऐसा नहीं कर रहे हैं। और जैसे @ जैक ने कहा php।ini या htaccess अन्य स्थान हैं जिन्हें आप उस कोड को जोड़ सकते हैं। हालांकि यदि आप इसे अपनी स्वयं की PHP फ़ाइल में दबाते हैं और इसे प्रति पृष्ठ एक बार शामिल करते हैं, तो यह अच्छी तरह से अभ्यास है कि आप 1 फ़ाइल में 1 परिवर्तन करते हैं और यह फ़ाइल को संदर्भित हर जगह स्वचालित रूप से अपडेट किया जाता है। – Danny

उत्तर

5

आपके कई विवरणों में सत्र कॉन्फ़िगरेशन सेटिंग्स शामिल हैं; जिन्हें आमतौर पर सर्वर के php.ini या शीर्ष-स्तर .htaccess (अपाचे) में स्थानांतरित किया जा सकता है।

session.name = PHPSESSID 
session.gc_maxlifetime = 10000 

session.gc_probability = 1 
session.gc_divisor = 1000 

session.cookie_domain = 
session.cookie_path =/
session.cookie_httponly = 1 
session.cookie_lifetime = 0 

आपको तब तक सत्र नहीं करना चाहिए जब तक आप (2038 में समाप्ति); सत्र सामान्य रूप से सत्र कुकीज़ के साथ बनाए जाते हैं (जो तब तक चलता है जब ब्राउज़र बंद हो जाता है, तकनीकी रूप से)। यदि आप "मुझे याद रखें" सुविधा को कार्यान्वित करना चाहते हैं, तो मेरा सुझाव है कि आप इसे अपने सत्रों के शीर्ष पर जोड़ दें, जैसा कि यहां बताया गया है: http://jaspan.com/improved_persistent_login_cookie_best_practice

मुझे एक नया सत्र शुरू करने और मौजूदा को फिर से शुरू करने के बीच अंतर करना महत्वपूर्ण लगता है, खासकर ऐसे मामलों में जहां सत्र केवल साइन इन प्रक्रिया के हिस्से के रूप में बनाए जाते हैं। जब कोई सत्र फिर से शुरू नहीं किया जा सकता है, तो कुछ गलत हो गया और उपयोगकर्ता को लॉगिन पृष्ठ (या मुखपृष्ठ) पर रीडायरेक्ट किया जाना चाहिए।

PHP समझ में नहीं आता है कि अंतर, session_start स्वचालित रूप से सत्र बना देगा यदि यह वहां नहीं है, और इससे भी बदतर, यदि कोई मनमाना सत्र आईडी दी जाती है; उत्तरार्द्ध यहां सत्र गोद लेने के हमलों की अनुमति देता है जैसा कि यहां उल्लिखित है: http://gihyo.jp/dev/serial/01/php-security/0025 - यह जापानी में है, आपको इसे अपने ब्राउज़र से अनुवाद करना होगा।

यह पता लगाने के लिए कि कोई सत्र फिर से शुरू किया जा सकता है, आपको एक विशेष कुंजी (उदा। $_SESSION['_id'] = session_id()) जोड़कर हर नए सत्र को प्राथमिकता देने की आवश्यकता है। यदि वह कुंजी पाई जाती है, तो सत्र पहले से मौजूद है और आप इसे फिर से शुरू कर सकते हैं; यदि नहीं, तो सत्र या तो मौजूद नहीं था या कोई आपको गलत आईडी खाने की कोशिश कर रहा है।

नया सत्र शुरू करने के लिए, आप पहले देखते हैं कि इसे फिर से शुरू किया जा सकता है; यदि नहीं, तो आप सत्र आईडी को बदलने के लिए session_regenerate_id(true) का उपयोग करें (इससे किसी हमलावर के लिए सत्र को हाइजैक करना मुश्किल हो जाता है)।

आखिरकार, किसी साझा सर्वर पर सत्र सहेजने के पथ आपके घर के फ़ोल्डर के नीचे लिखे जा सकते हैं, लेकिन यह केवल तभी समझ में आता है जब आपका साझा होस्ट प्रति वर्चुअल होस्ट (यानी suexec) के समर्पित उपयोगकर्ता के साथ चलता है। अन्यथा, अपने सत्र को स्नूपिंग हमलों से बचाने के लिए आपको सत्र डेटा (और शायद कुंजी भी) को एन्कोड करना होगा। mcrypt एक्सटेंशन देखें: http://sg.php.net/mcrypt - आपको ऑनलाइन उदाहरण ढूंढने में सक्षम होना चाहिए।

मुझे आशा है कि यह आपके प्रश्न का अधिक या कम जवाब देगा। अगर आपको कुछ भी अस्वस्थ लगता है तो मुझे बताएं।

+0

मदद करने के लिए समय लेने के लिए धन्यवाद, जैक। बहुत सराहना करते हैं। मुझे यह जानने में परेशानी हो रही है कि सत्र फिर से शुरू किया जा सकता है या नहीं। मैंने इसका उपयोग करने का प्रयास किया: यदि (सत्र_आईडी() == '') यह देखने के लिए कि सत्र शुरू हो गया है, लेकिन यह हमेशा सत्य लौटाता है, भले ही सत्र पहले ही शुरू हो चुका है? –

+0

आप हमेशा session_start() को कॉल कर सकते हैं, फिर वर्णित अनुसार उस सत्र में एक कुंजी की जांच करें, यानी जारी करें ($ _ सत्र ['_ start']) –

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