2010-09-18 26 views
47

क्या कोई तरीका है कि मैं सत्र कुकी के प्लेसमेंट के बिना PHP में लगातार सत्र शुरू कर सकता हूं? क्या आईपी एड्रेस-आधारित समाधान जैसे पृष्ठों पर सत्र बनाए रखने के अन्य तरीके हैं?कुकीज़ के बिना PHP सत्र

पूछने का मेरा कारण यह है कि हालांकि अधिकांश उपयोगकर्ताओं के पास कुकीज़ है, मैं देखना चाहता हूं कि लॉग इन सिस्टम के लिए अक्षम लोगों के लिए काम करने का कोई तरीका है (भले ही मुझे लगता है कि कुकीज को अक्षम करना सिर्फ अनावश्यक परावर्तक है, व्यक्तिगत रूप से)।

ini_set('session.use_cookies', 0); 
ini_set('session.use_only_cookies', 0); 
ini_set('session.use_trans_sid', 1); 
session_start(); 
// IP check 
if($_SESSION['ip_check'] != $_SERVER['REMOTE_ADDR']){ 
    session_regenerate_id(); 
    session_destroy(); 
    session_start(); 
} 
$_SESSION['ip_check'] = $_SERVER['REMOTE_ADDR']; 
// session stuff 

नोट::

उत्तर

50

मैं इसे कुकीज़ सक्षम करने के लिए अपने उपयोगकर्ताओं को पूछने के लिए बहुत ज्यादा है नहीं लगता। जब लोग उन्हें पूरी तरह बंद कर देते हैं तो मुझे मूर्खता मिलती है।

अन्यथा, आप अपने session.use_only_cookies को "0" पर सेट कर सकते हैं ताकि आपके PHP में यूआरएल के सत्र आईडी के परिशिष्ट को मजबूर किया जा सके। हालांकि, इस दृष्टिकोण में कई ड्रॉ बैक हैं। मुख्य रूप से यूके के भीतर राज्य को रखने के लिए, कुकी हेडर के विपरीत। यदि कोई उपयोगकर्ता उस पृष्ठ के यूआरएल को कॉपी और पेस्ट करना चाहता था, और कोई और उस पर क्लिक करना था, तो वे दोनों एक ही सत्र का उपयोग करेंगे।

<?php 
    ini_set("session.use_cookies", 0); 
    ini_set("session.use_only_cookies", 0); 
    ini_set("session.use_trans_sid", 1); 
    ini_set("session.cache_limiter", ""); 
    session_start(); 
+1

मेरा मानना ​​है कि ओपी 'session.use_cookies' को 1 –

+4

पर सेट करना चाहता था और यह ध्यान दिया जाना चाहिए कि ये सेटिंग्स PHP कोड में जेएस हाइपरलिंक्स और स्थान शीर्षलेखों को परिवर्तित नहीं करती हैं। –

+0

वास्तव में, जो 2010 में कुकीज़ के साथ अभी भी ब्राउज़ करता है? हालांकि यह अभी भी संभव है, मुझे संदेह है कि कोई भी यह करता है; और इस प्रकार सवाल अकादमिक है। (यहां तक ​​कि मकड़ियों को अब कुकीज़ हो सकती है) – Piskvor

3

आप के साथ अक्षम करने कुकीज़ URL में सत्र आईडी के साथ काम कर सकते हैं, और यह अत्यधिक URL में सत्र आईडी का उपयोग करने के discougared है। वायरलेस कार्ड के साथ यात्रा करते समय आईपी पते बदल सकते हैं और प्रॉक्सी सर्वरों का एक ही आईपी पता होता है। 'पुराना यूआरएल' (पुराने सत्र आईडी के साथ) पर क्लिक करते समय यह आसानी से टूटा हुआ है।

आप अपना स्वयं का सत्र हैंडलिंग फ़ंक्शन (डेटाबेस के साथ संयोजन में) बनाने में रुचि भी ले सकते हैं। आप सत्र आईडी को अनदेखा करेंगे, और इसे आईपी पते से बांध देंगे। (http://php.net/manual/en/function.session-set-save-handler.php में उदाहरण देखें)

संदर्भ:

+5

किसी आईपी पते पर बाध्यकारी जाने का एक बुरा तरीका लगता है। कुछ (कॉर्पोरेट?) उपयोगकर्ता प्रॉक्सी के पीछे स्थित हो सकते हैं, जहां एकाधिक उपयोगकर्ताओं के पास एक ही आईपी एड्रेस हो सकता है। – Leander

+3

@ लिंडर वूर्ड! इससे बहुत बुरी परिस्थितियां हो सकती हैं, जहां पूरी कंपनी/परिवार/छात्र रहने वाले परिसर के पास आपके उपयोगकर्ता के खाते तक पहुंच है। – Sliq

+1

यहां जर्मनी में सबसे बड़ा आईएसपी (टेलीकॉम) भी एक प्रॉक्सी प्राप्त हुआ है जिसमें बहुत से लोग उपयोग करते हैं। तो सबसे बुरे मामले में एक छेद आईएसपी नेटवर्क एक खाते का उपयोग करेगा। यह वास्तव में कष्टप्रद है क्योंकि यह आईपी पतों पर प्रतिबंध लगाने के लिए लगभग असंभव बनाता है यदि आप एक्स-एचटीटीपी-फॉरवर्डेड-हेडर के लिए भरोसा नहीं करना चाहते हैं। – Gellweiler

4

आपको हर यूआरएल के लिए सत्र id जोड़कर सक्रिय करने के लिए सही पर session.use_trans_sid का आरं-मूल्य निर्धारित कर सकते हैं। this पर एक नज़र डालें।

सुरक्षा उद्देश्यों के लिए आपको सत्र को बनाए गए आईपी में सत्र को सीमित करना चाहिए। हालांकि यह पूरी तरह से सुरक्षित नहीं है, क्योंकि एक ही आईपी (प्रॉक्सी के पीछे) के साथ कोई भी उसी सत्र का पुन: उपयोग कर सकता है।

1

आप डेटाबेस में आईपी प्रति सत्र id को बचा सकता है: SESSION_ID, आईपी और अद्वितीय अस्थायी कुंजी (लॉग इन उपयोगकर्ताओं के लिए) या किसी अन्य शर्त आप की तरह:

तीन क्षेत्रों के साथ एक mysql तालिका बनाएं। फिर सत्र कुकीज़ और use_trans_sid बंद करें।

फिर इस नई तालिका के आधार पर सत्र व्यवहार प्रबंधित करने के लिए एक कोड बनाएं!

session_start() के बाद

बचाने तालिका में SESSION_ID और बाद में मेज से (आईपी और किसी भी अन्य स्थिति से) इसे प्राप्त करने और उसके बाद अधिक जानकारी और पूर्ण गाइड के लिए

session_id($in_table_session_id); 

फोन देखें: https://gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe

+0

फिर से, यह बाध्यकारी है आईपी ​​और पूरी तरह से प्रभावी नहीं, विशेष रूप से उन क्षेत्रों के लिए जहां एकाधिक उपयोगकर्ता एक ही आईपी साझा करते हैं (उदाहरण के लिए विश्वविद्यालय, कंपनी या संगठन प्रॉक्सी, आदि) –

0

आप कर सकते थे डेटाबेस रिकॉर्ड या अस्थायी फ़ाइल बनाएं और प्रत्येक पृष्ठ लोड पर अनुरोध के विरुद्ध $_SERVER वर्र्स देखें। यह एक सुरक्षा जोखिम है, लेकिन पर्याप्त चर के साथ (सूची here पर एक नज़र डालें) आपको लगता है कि आपको एक स्वीकार्य स्तर पर हाइजैक करने का मौका मिला है; केवल आप ही जानते हैं कि आपके ऐप को कितना सुरक्षित होना चाहिए।

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