2008-09-26 16 views
86

कितना अनूठा है PHP सत्र आईडी कितना अनूठा है? मुझे विभिन्न चीजों से छाप मिली है जो मैंने पढ़ा है कि मुझे दो उपयोगकर्ताओं पर भरोसा नहीं करना चाहिए जो कभी भी वही सत्र नहीं प्राप्त करते हैं। क्या यह एक GUID नहीं है?PHP सत्र आईडी

उत्तर

32

सत्र_आईडी वास्तव में डुप्लिकेट किया जा सकता है, लेकिन संभावना बहुत कम है। यदि आपके पास उचित ट्रैफ़िक वाली वेबसाइट है, तो यह आपके वेब साइट पर एक बार हो सकती है, और केवल एक सत्र के लिए एक उपयोगकर्ता को परेशान करेगी।

यह तब तक ध्यान देने योग्य नहीं है जब तक आप बैंक उद्योग के लिए बहुत अधिक यातायात वेबसाइट या सेवा बनाने की अपेक्षा न करें।

+4

मैंने उन साइटों की रिपोर्टें सुनाई हैं जिनमें टकराव के कई मामले हैं। – ColinM

+14

सवाल लगभग 4 साल पहले पूछा गया है। यह जानना दिलचस्प होगा कि क्या सत्र आईडी एल्गोरिदम ने तब से सुधार किया है ... – Sliq

+0

@ कोलिमिन: और उन साइटों में 1 मिलियन अद्वितीय विज़िटर/दिन थे। –

2

नहीं, सत्र आईडी GUID नहीं है, लेकिन दो उपयोगकर्ताओं को एक ही सत्र आईडी नहीं मिलनी चाहिए क्योंकि वे सर्वर की तरफ संग्रहीत हैं।

+0

क्या मैं पूछ सकता हूं कि मैं मतदान क्यों कर रहा हूं? – gizmo

+2

संभवतः सर्वर-साइड स्टोरेज किसी भी तरह से विशिष्टता की गारंटी नहीं देता है। विशिष्टता एक बात है - यदि कोई टकराव होता है तो यह ध्यान दिए बिना कि सत्र कहां संग्रहीत किया जाता है। –

+0

मेरे द्वारा नहीं, मैं आपकी प्रतिक्रिया (साथ ही साथ अन्य) की सराहना करता हूं। - जलोव – Jalov

3

मुझे इस पर कोई पुष्टि नहीं मिली है, लेकिन मुझे विश्वास है कि PHP आईडी जांचता है कि क्या आईडी आईडी उस आईडी के साथ पहले से मौजूद है।

सत्र अपहरण समस्या लोगों को चिंता है जब कोई सक्रिय उपयोगकर्ता की सत्र आईडी प्राप्त करता है। इसे कई तरीकों से रोका जा सकता है, इसके बारे में अधिक जानकारी के लिए आप this page पर php.net और this paper on session fixation

+2

... लेकिन यदि आप कई बैंकों में केवल एक PHP सर्वर हैं, तो इस बात की कोई गारंटी नहीं है कि सर्वर को यह जानने के लिए पर्याप्त ज्ञान है कि sesssionID का अभी तक उपयोग किया गया है या नहीं। – djsadinoff

+0

हां यह एक बहुत अच्छा मुद्दा है। –

+0

यदि मुझे 2 अलग-अलग PHP सर्वरों में एक ही सत्र आईडी मिलती है तो यह क्यों मायने रखता है?2 अलग-अलग डोमेन मानते हुए, सत्र कुकी प्रत्येक डोमेन से केवल पहुंच योग्य है ...? – daremon

11

यदि आप आईडी उत्पन्न होने के तरीके को कस्टमाइज़ करना चाहते हैं तो आप एक वैकल्पिक हैश पीढ़ी फ़ंक्शन इंस्टॉल कर सकते हैं (यह 128 बिट है डिफ़ॉल्ट रूप से एमडी 5 के माध्यम से उत्पन्न संख्या)। देखें http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function

PHP सत्रों के बारे में अधिक जानकारी के लिए, इस उत्कृष्ट आलेख को http://shiflett.org/articles/the-truth-about-sessions आज़माएं जो सत्र निर्धारण और अपहरण के बारे में अन्य लेखों से भी जुड़ा हुआ है।

+2

सटीक होने के लिए, " session.hash_function = sha512 "PHP 5.3 के लिए और 512 बिट हैश पर जाने के लिए। यह काम कर जाना चाहिए। डिफ़ॉल्ट के साथ, टक्कर पाने के लिए उच्च ट्रैफिक साइटों पर यह आम है। – ColinM

59

यह शिप के रूप में बहुत ही अद्वितीय नहीं है। डिफ़ॉल्ट कॉन्फ़िगरेशन में यह गेटटाइमडे (जो बहुत ही अनोखा नहीं है) के परिणाम सहित विभिन्न चीजों के हैश का परिणाम है, लेकिन यदि आप चिंतित हैं, तो आपको इसे/dev/urandom से कुछ एन्ट्रॉपी आकर्षित करने के लिए कॉन्फ़िगर करना चाहिए, जैसे वास्तविक एल्गोरिथ्म वे उपयोग कर रहे हैं के लिए "php_session_create_id" the code में के लिए

ini_set("session.entropy_file", "/dev/urandom"); 
ini_set("session.entropy_length", "512"); 

खोज।

जोड़ने के लिए संपादित: एक डीएफए यादृच्छिक संख्या जनरेटर है जो पिड द्वारा बीजित होता है, जो उपयोग में समय के साथ मिश्रित होता है। यह एक फर्म विशिष्टता स्थिति especially from a security perspective नहीं है। ऊपर एन्ट्रॉपी कॉन्फ़िगरेशन का प्रयोग करें।

अद्यतन:

पीएचपी 5.4.0 session.entropy_file चूक के रूप में/dev/urandom या /dev/arandom अगर यह उपलब्ध हो सकते हैं। PHP 5.3.0 में यह निर्देश डिफ़ॉल्ट रूप से खाली छोड़ दिया गया है। PHP Manual

+1

हाँ, जब मैं ऐसी वेबसाइट के लिए अनुबंध था जो दुश्मन लड़ाकों के खिलाफ अल्ट्रासेक्योर होना था और इस तरह, मैंने वास्तव में अपना स्वयं का सत्र हैंडलर बनाया और इसे सीधे random.org से एंट्रॉपी डेटा खिलाया। लेकिन उस प्रणाली के reqs सबसे अधिक प्राणियों से निपटने के बहुत दूर थे w/;-) –

+0

मुझे लगता है कि एक एंट्रॉपी लंबाई 512 (अधिकतम) आवश्यक नहीं है। PHP की कॉन्फ़िगरेशन के लिए 16 विकल्प है। डिफ़ॉल्ट वास्तव में 0. 16 है। उच्चतम लंबाई है जो मैं किसी भी एप्लिकेशन के लिए अनुशंसा करता हूं जिसमें अत्यधिक संवेदनशील जानकारी शामिल नहीं है –

+0

वे हैश में यूनिक्स टाइमस्टैम्प का उपयोग क्यों नहीं करते? क्या डुप्लिकेट को खत्म करना चाहिए? –

5

session_id
का आकार मान लें कि seesion_id समान रूप से वितरित और आकार = 128 बिट है। मान लीजिए कि ग्रह पर हर व्यक्ति 1000 दिनों तक लगातार एक नए सत्र के साथ दिन में एक बार लॉग इन करता है।

num_sesion_ids = 1000*365.25 *7*10**9 < 2**36 
collission_prob < 1 - (1-1/2**82)**(2**36) ≈ 1 - e**-(1/2**46) 
       ≈ 1/2**46 

तो एक या अधिक टकराव की संभावना 70 हजार अरबों में से एक से कम है। इसलिए session_id का 128-बिट-आकार काफी बड़ा होना चाहिए। जैसा कि अन्य टिप्पणियों में उल्लिखित है, session_manager यह भी जांच सकता है कि नया session_id पहले से मौजूद नहीं है।रों अच्छा छद्म अनियमितता के साथ उत्पन्न कर रहे हैं:

अनियमितता
इसलिए बड़ा सवाल है कि क्या मुझे लगता है कि session_id है। उस पर आप कभी भी सुनिश्चित नहीं हो सकते हैं, लेकिन मैं इस उद्देश्य के लिए एक प्रसिद्ध, और अक्सर उपयोग किए जाने वाले मानक समाधान का उपयोग करने की सिफारिश करता हूं (जैसा कि आप शायद पहले से ही करते हैं)।

भले ही जांच के कारण टकराव से बचा जा सके, सत्र_आईड की यादृच्छिकता और आकार महत्वपूर्ण है, ताकि हैकर्स योग्य अनुमान लगा सकें और सक्रिय session_id: बड़ी संभावना के साथ ढूंढ सकें।

+2

मैं गणितज्ञ नहीं हूं, लेकिन मुझे लगता है कि आप [जन्मदिन की समस्या] (http://en.wikipedia.org/wiki/Birthday_problem) को भूल रहे हैं, इसलिए टकराव की संभावनाएं अभी भी छोटी हैं, आपके सुझाव से कहीं अधिक हैं । साथ ही, जैसा कि djsadinoff ने सुझाव दिया था, PHP की डिफ़ॉल्ट रूप से यादृच्छिक संख्या उत्पन्न करने की एक अच्छी विधि का उपयोग नहीं करना चाहिए। – ColinM

+0

वास्तव में अनुमान नहीं है। उपर्युक्त गणना एक सरलीकृत अनुमान है, जहां हम अनुमान लगाते हैं कि session_id nr i के लिए टकराव की संभावना है, = 1/2 ** 82 है (यह 1/2 ** 92 होना चाहिए हालांकि = टाइपो)। हकीकत में संभाव्यता (i-1)/2 ** 128 है जब तक कि कोई पिछली टक्कर नहीं हुई है। 1/2 ** 92 केवल अंतिम session_id के लिए है। – MrJ

10

यदि आप जानना चाहते हैं कि PHP डिफ़ॉल्ट रूप से सत्र आईडी कैसे उत्पन्न करता है तो Github पर स्रोत कोड देखें। यह निश्चित रूप से यादृच्छिक नहीं है और एक हैश (डिफ़ॉल्ट: md5) पर आधारित है (कोड स्निपेट की लाइन 310 देखें) इन अवयवों की: ग्राहक की

  1. आईपी पते
  2. वर्तमान समय
  3. पीएचपी रैखिक सर्वांगसमता जेनरेटर - एक छद्म यादृच्छिक संख्या जनरेटर (PRNG)
  4. ओएस विशिष्ट यादृच्छिक स्रोत - ओएस एक यादृच्छिक स्रोत उपलब्ध है, तो (उदाहरण के लिए/dev/urandom)

ओएस एक यादृच्छिक स्रोत उपलब्ध नहीं है तो फिर एक सत्र ID जा रहा है के प्रयोजन के लिए उत्पन्न ID की ताकत अधिक है (/dev/urandom और अन्य ओएस यादृच्छिक स्रोतों (आमतौर पर) क्रिप्टोग्राफी द्वारा सुरक्षित PRNGs) । यदि ऐसा नहीं है तो यह संतोषजनक है।

  1. एक ही मूल्य के साथ दो सत्र आईडी पैदा करने की संभावना
  2. यह बहुत ही चुनौतीपूर्ण computationally यादृच्छिक कुंजी उत्पन्न करने के लिए कर को कम करने और एक में मारा:

    सत्र पहचान पीढ़ी के साथ लक्ष्य के लिए है एक का उपयोग करें।

यह सत्र पीढ़ी के PHP के दृष्टिकोण से हासिल किया जाता है।

आप बिल्कुल गारंटी नहीं दे सकते विशिष्टता, लेकिन संभावनाओं एक ही हैश दो बार मार यह है कि, आम तौर पर बोल रहा है के बारे में चिंता, लायक नहीं की तो कम हैं।

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