Php सेशन आईडी कितना अनोखा है


90

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

जवाबों:


39

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

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


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

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

@ColinM: और उन साइटों में 1 लाख अद्वितीय आगंतुक / दिन थे।
ई-शनि

1
Aparantly अपने वर्तमान आधारित उपयोगकर्ता के दूरदराज के पते पर (MD5 / SHA1 हैश), स्थानीय समय और कुछ यादृच्छिक संख्या (LCG)
कार्मिरियल

2
मुझे मोबाइल तोड़ने की जरूरत नहीं है, मोबाइल लगातार खुद ही टूट जाता है। :)
हैकर

67

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

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

कोड में "php_session_create_id" का उपयोग वास्तविक एल्गोरिथ्म के लिए कर रहे हैं।

जोड़ने के लिए संपादित: वहाँ एक डीएफए यादृच्छिक-संख्या जनरेटर पीड द्वारा वरीयता प्राप्त है, usecs में समय के साथ मिश्रित। यह विशेष रूप से सुरक्षा के दृष्टिकोण से एक विशिष्ट विशिष्टता की स्थिति नहीं है । ऊपर एन्ट्रापी कॉन्फिग का उपयोग करें।

अपडेट करें:

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


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

1
@ थॉमस-जेन्सेन, gettimeofday है यूनिक्स टाइमस्टैम्प, को छोड़कर यह μsec (कभी कभी) में व्यक्त किया है। ऊपर लिंक php_session_create_id विधि पढ़ें।
djsadinoff

4
एन्ट्रापी की लंबाई को बदलने से यादृच्छिकता में सुधार होता है लेकिन टक्कर की संभावना को महत्वपूर्ण रूप से प्रभावित नहीं करता है क्योंकि हैश अभी भी वही लंबाई है। हालाँकि, बदलते सत्र.शश_फंक्शन आपको उदाहरण के लिए sha512 जैसे लंबे हैश का उपयोग करने की अनुमति देता है।
कॉलिनएम

2
मुझे यह विचित्र लगा कि टक्करें हैं। निश्चित रूप से PHP को यह जांचने के लिए बनाया जाना चाहिए कि क्या उस आईडी के तहत एक वैध सत्र है और बाद में एक अलग आईडी जेनरेट करता है ..
ल्यूक

1
@ थियोडोर-आर-स्मिथ, सार्वजनिक रूप से उपलब्ध स्रोत से एन्ट्रापी लेने के लिए वास्तव में बुरा व्यवहार है। आपको लगता है कि आपके "दुश्मन के लड़ाकों" को random.org तक पहुंच प्राप्त होनी चाहिए ...
avri

12

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

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

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

सत्र पहचान निर्माण के साथ लक्ष्य यह है:

  1. समान मान के साथ दो सत्र ID जनरेट करने की संभावना को कम करें
  2. यादृच्छिक कुंजी उत्पन्न करने के लिए इसे बहुत चुनौतीपूर्ण बनाना और उपयोग में एक हिट करना

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

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


11

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

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


2
सटीक होने के लिए, PHP 5.3 के लिए "session.hash_function = sha512" सेट करें और 512bit हैश पर जाएं। यह काम कर जाना चाहिए। चूक के साथ, टक्कर लेने के लिए उच्च-यातायात साइटों पर यह सामान्य है।
कॉलिनम

5


Session_id का आकार मान लें कि seeion_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 हजार अरबों में एक से कम है। इसलिए सत्र का एक 128-बिट-आकार काफी बड़ा होना चाहिए। जैसा कि अन्य टिप्पणियों में उल्लेख किया गया है, session_manager यह भी जाँच सकता है कि नया session_id पहले से मौजूद नहीं है।

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

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


3
मैं कोई गणितज्ञ नहीं हूं, लेकिन मुझे लगता है कि आप जन्मदिन की समस्या को भूल रहे हैं, इसलिए टकराव की संभावना बहुत कम है जबकि आप सुझाव देते हैं। इसके अलावा, जैसा कि djsadinoff ने सुझाव दिया है, PHP जरूरी नहीं कि डिफ़ॉल्ट रूप से यादृच्छिक संख्या उत्पन्न करने का एक अच्छा तरीका है।
कॉलिनम

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

3

मुझे इस पर कोई पुष्टि नहीं मिली है, लेकिन मेरा मानना ​​है कि अगर किसी आईडी को उस आईडी के साथ बनाने से पहले एक सत्र आईडी मौजूद है।

सत्र अपहरण का मुद्दा लोगों को चिंतित करता है जब कोई व्यक्ति किसी सक्रिय उपयोगकर्ता के सत्र आईडी का पता लगाता है। इसे कई तरीकों से रोका जा सकता है, अधिक जानकारी के लिए आप इस पेज को php.net पर देख सकते हैं और सत्र निर्धारण पर यह पेपर


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

अगर मुझे 2 अलग-अलग php सर्वर में एक ही सेशन आईडी मिल जाती है तो इससे क्या फर्क पड़ेगा? 2 अलग-अलग डोमेन को मानते हुए, सत्र कुकी प्रत्येक डोमेन से ही सुलभ है ...?
daremon

3
बहु-सर्वर वातावरण पर ठगी को रोकने का सबसे आसान तरीका है कि मेमकेडेड सत्र हैंडलर के माध्यम से सत्रों को स्टोर किया जाए। समस्या हल हो गई है और आपके उपयोगकर्ता अपना सामान खोने वाले अलग-अलग सर्वरों के आसपास उछाल कर सकते हैं।
थियोडोर आर। स्मिथ

@daremon वह एक डोमेन के लिए कई सर्वरों के बारे में बात कर रहा है।
gtd

यह केवल गलत है। नए सत्र बनाते समय PHP मौजूदा सत्र आईडी के लिए जाँच नहीं करता है। किसी भी PHP सत्र हैंडलर कोड को देखें और इस उद्देश्य के लिए कोई विधि लागू नहीं है।
कॉलिनएम

2

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


2
संभवतः क्योंकि सर्वर-साइड स्टोरेज किसी भी तरह से विशिष्टता की गारंटी नहीं देता है। विशिष्टता एक चीज है - अगर कोई टकराव होता है, तो इसकी परवाह किए बिना कि सत्र कहाँ संग्रहीत है, टकराएगा।

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

2
सत्र ID सर्वर और क्लाइंट पक्ष दोनों में संग्रहीत की जाती है। सत्र सामग्री सर्वर साइड में संग्रहीत की जाती है। और यह तथ्य बहुत कुछ सत्र आईडी की विशिष्टता से संबंधित नहीं है।
युधिविद्यामाता ०

-3
<?php
session_start();
$_SESSION['username']="username";
?>

<!DOCTYPE html>
<html>
<head>
    <title>Update</title>
</head>
<body>

<table border="2">
    <tr>
        <th>Username</th>
        <th>Email</th>
        <th>Edit</th>
    </tr>
<?php
     $conn=mysqli_connect("localhost","root","","telephasic");
     $q2="select * from register where username = '".$_SESSION['username']."'";
     $run=mysqli_query($conn, $q2);
     while($row=mysqli_fetch_array($run))
     {
         $name=$row[1];
         $email=$row[2];
     ?>

    <tr>
        <td><?php echo $name; ?></td>
        <td><?php echo $email; ?></td>
        <td><a href="edit.php"> Edit </a></td>
    </tr>
 <?php } ?>
 </table> 
 </body>

यदि आपका उपयोगकर्ता नाम अलग या विशिष्ट है, तो आप इस कोड का उपयोग सत्र के लिए कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.