PHP

2012-06-22 24 views
7

में एक अद्वितीय सत्र आईडी कैसे उत्पन्न करें हमारी वेबसाइट पर हम सत्रों को एकाधिक डोमेन साझा करना संभव बनाना चाहते हैं। ये सभी वेबसाइटें एक ही सर्वर पर हैं लेकिन उनमें से कुछ के पास एक अलग आईपी पता है।PHP

संभव समाधान मैंने पाया सत्र आईडी अपने आप को स्थापित करने के लिए किया गया था:

<?php 
session_id($someUniqueHash); 
?> 

और यह, काम करता है अगर मैं md5 ('परीक्षण') की तरह हैश बनाते हैं। उसी सर्वर पर किसी अन्य डोमेन पर हमारे पास सत्र फिर से होता है।

समस्या आईडी उत्पन्न कर रही है। मैं microtime आदि के साथ इंटरनेट पर कुछ समाधान देखता हूं, लेकिन जब मैं उस दृष्टिकोण का उपयोग करता हूं तो मैं अन्य डोमेन/PHP पृष्ठ पर सत्र आईडी की भविष्यवाणी नहीं कर सकता।

क्या किसी के पास कोई विचार है? या हम इसे लागू नहीं करना चाहिए? क्या एकाधिक डोमेन पर सत्र साझा करने के लिए अन्य विकल्प हैं? (सबडोमेन नहीं!)

+1

आप PHP को आपके लिए सत्र आईडी क्यों नहीं देते हैं? आप डोमेन बीटीडब्ल्यू में सत्र आईडी साझा कर सकते हैं। यह या तो कुकी * या * एक क्वेरी पैरामीटर गुजर रहा है। – hakre

+0

क्वेरी param को पसंद नहीं किया गया है, यह असुरक्षित है और यूआरएल अनुकूल नहीं है। जहां तक ​​मुझे पता है कि आप केवल कुकीज को उसी डोमेन (सबडोमेन भी) को एक्स्ट्रोमैन नहीं देते हैं। –

+0

यह सिर्फ एक कुकी है जिसे आप पास करते हैं। और आप तृतीय-पक्ष डोमेन के लिए कुकीज़ बना सकते हैं, जिसे तृतीय-पक्ष-कुकीज़ कहा जाता है। ऐसा करने के लिए आपको कानूनी पक्ष की जांच करने की आवश्यकता हो सकती है (तकनीकी पक्ष के आगे हल किया गया है)। बीटीडब्ल्यू सभी तकनीकी विवरण जो आप सीखना चाहते हैं: [HTTP स्टेट मैनेजमेंट मैकेनिज्म आरएफसी 6265] (http://tools.ietf.org/html/rfc6265) – hakre

उत्तर

4

मैं एक OAuth प्रकार प्रवाह का उपयोग करके यह प्रणाली हासिल कर लिया है, लेकिन हम उपयोगकर्ता के साथ उपभोक्ता बदल दिया।

इसलिए प्रत्येक डोमेन के अपने सत्र में प्रमाणीकृत Access_Token होगा। फिर आप एपीआई से उपयोगकर्ता के बारे में जानकारी प्राप्त करने के लिए उस Access_Token का उपयोग करेंगे।

मैंने session_set_save_handler का उपयोग करके सत्र समस्या हल की और डेटाबेस तालिका में सत्र संग्रहीत किया ... इस तालिका में Access_Token भी होगा, जिससे डीबी क्वेरी के साथ सत्र को ढूंढना वास्तव में आसान हो जाएगा।

उम्मीद है कि यह विचारों के साथ मदद करता है।

+0

मैं हाल ही में ऐसा करने के बारे में सोच रहा हूं। मुझे आश्चर्य है कि डीबी टेबल में एक्सेस टोकन जोड़कर और प्रत्येक अनुरोध से पूछताछ करके स्टोरेज और पुनर्प्राप्ति प्रदर्शन पर कोई केस स्टडी या सरल चर्चा है या नहीं। –

0

हम्म यह एक कठिन है।

जैसा कि सभी जानते हैं कि PHP आपकी साइट पर वापस आने पर session_ids को समझने के लिए कुकीज का उपयोग करता है और क्रॉस डोमेन कुकीज़ का कोई तरीका नहीं है: Cross domain cookies (संपादित करें: विधि जटिल है)।

शायद यही कारण है कि मैंने कभी भी साइट को लागू नहीं किया है, भले ही उनके पास अलग-अलग डोमेन हों।

आप एक डोमेन से अपने पृष्ठ पर एक लिंक के माध्यम से सत्र आईडी को अगले डोमेन पर $ _GET या $ _POST के माध्यम से पास कर सकते हैं। यदि उपयोगकर्ता सीधे आपकी दूसरी साइट में प्रवेश करता है तो यह काम नहीं करेगा।

डीबी में उपयोगकर्ता कंप्यूटर्स का रिकॉर्ड रखने के लिए केवल आंशिक रूप से (कोई भरोसेमंद) विधि नहीं आ सकती है और इसका उपयोग यह समझने के लिए किया जाता है कि कौन सा सत्र संलग्न है। तो आप कंप्यूटर आईपी पते और शायद कुछ अन्य विवरण घर और एक सत्र पर बैक।

आईपी और किसी व्यक्ति कंप्यूटर के अन्य विवरण उन्हें अन्य डोमेन में लॉग इन करेंगे।

+0

टीएनएक्स। एक वेबसाइट है जो यह करती है: उदाहरण के लिए http://www.laptopshop.nl। मुझे पता है कि उनकी वेबसाइट PHP में विकसित की गई है, इसलिए यह संभव है। लेकिन मुझे डर था कि मुश्किल था। –

+0

मैं अपने उत्तर को सही करता हूं क्रॉस डोमेन कुकीज़ संभव है लेकिन उस पोस्ट में मानसिक रूप से ठोस है, लेकिन हाँ डोमेन सत्र वास्तव में अविश्वसनीय हैं ... – Sammaye

0

शायद यह आपके लिए कोई विकल्प नहीं है, लेकिन आप इसे आजमा सकते हैं।

अपनी मुख्य साइट पर आप सामान्य आईडी के अनुसार सत्र आईडी उत्पन्न करते हैं और सत्र को दूसरे डोमेन पर कायम रखने के लिए आप URL में सत्र आईडी के साथ छवि टैग शामिल कर सकते हैं। जवाब में, दूसरा डोमेन एक कुकी सेट करेगा, ताकि जब विज़िटर वहां आएगा तो यह पहले ही सत्र आईडी को जानता होगा।

थोड़ा चतुर पैंट समाधान महसूस करता है, लेकिन यदि आपके पास बहुत से अन्य डोमेन नहीं हैं तो यह काम करना चाहिए :) तीसरे पक्ष की कुकीज़ को ब्राउज़र बीटीडब्ल्यू में अलग से अक्षम किया जा सकता है, कुछ विचार करने के लिए।

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

0

कॉन्फ़िगर प्रत्येक साइट अलग-अलग:

<?php 

$cfgsession['file'] = "../sessions_global.txt"; 
$cfgsession['keepalive'] = 7200; 

?> 

कई साइटों शेयर सत्र बनाने के लिए, उन्हें एक ही $cfgsession['file'] उपयोग करते हैं। किसी अन्य डोमेन (शायद जैक द्वारा अनुशंसित) के अनुरोध में एक साइट से एक सत्र शामिल करें, और जब तक आप उन्हें किसी अन्य ब्राउज़र में अपना अनुरोध नहीं करते हैं या जो भी हो (कृपया कुछ सत्र अपहरण को रोकने के लिए करें) , उन्हें $ _GET के साथ एक सत्र निर्दिष्ट करने दें। उदाहरण के लिए:

include ("../session.php"); 
if (isset($_COOKIE['session'])) session_begin($_COOKIE['session'], $_SERVER['HTTP_USER_AGENT'] . "+" . $_SERVER['HTTP_ACCEPT_CHARSET'], $_SERVER['REMOTE_ADDR']); 
else session_begin("", $_SERVER['HTTP_USER_AGENT'] . "+" . $_SERVER['HTTP_ACCEPT_CHARSET'], $_SERVER['REMOTE_ADDR']); 
setcookie("session", session_identity(), 0); 

और फिर बस अपनी स्वयं की session_ कार्यों रोल:

<?php 

function session_begin($mysession = "", $key = "", $client = "") { 
    global $cfgsession; 
    if (!preg_match("/^[a-z0-9]{32}$/i", $mysession)) $mysession = md5(microtime()); 
    $error = false; 
    $client = trim($client); 
    $key = trim($key); 
    $cfgsession['returning'] = false; 
    if ($chandle = @tmpfile()) { 
    if ($shandle = @fopen($cfgsession['file'], "rb")) { 
     flock($shandle, LOCK_SH); 
     fputs($chandle, $mysession . " " . time() . " $" . $client . " $" . $key . "\n"); 
     while (!feof($shandle)) { 
     $sline = explode(" ", trim(fgets($shandle)), 4); 
     if ($sline[1] >= (time() - $cfgsession['keepalive'])) { 
      if (($sline[0] == $mysession) && ($sline[3] == "$" . $key)) { 
      $cfgsession['client'] = substr($sline[2], 1); 
      $cfgsession['returning'] = true; 
      } elseif (count($sline) > 2) fputs($chandle, implode(" ", $sline) . "\n"); 
     } 
     } 
     fclose($shandle); 
     fseek($chandle, 0); 
     if ($shandle = @fopen($cfgsession['file'], "cb")) { 
     if (flock($shandle, LOCK_EX)) { 
      ftruncate($shandle, 0); 
      $cfgsession['count'] = 0; 
      while (!feof($chandle)) { 
      $cline = trim(fgets($chandle)); 
      fputs($shandle, $cline . "\n"); 
      $cfgsession['count']++; 
      } 
     } else $error = true; 
     fclose($shandle); 
     } else $error = true; 
    } else $error = true; 
    fclose($chandle); 
    } else $error = true; 
    if (($cfgsession['returning'] == false) && ($mysession == $cfgsession['session'])) { 
    $cfgsession['returning'] = true; 
    $mysession = md5(microtime()); 
    } 
    $cfgsession['session'] = $mysession; 

    if ($error) return -1; 
    else return 0; 
} 

function session_count() { 
    global $cfgsession; 
    return $cfgsession['count']; 
} 

function session_client() { 
    global $cfgsession; 
    return $cfgsession['client']; 
} 

function session_id() { 
    global $cfgsession; 
    return $cfgsession['session']; 
} 

function session_index() { 
    global $cfgsession; 
    $index_return = array(); 
    if ($uhandle = @fopen($cfgsession['file'], "rb")) { 
    flock($uhandle, LOCK_SH); 
    while (!feof($uhandle)) { 
     $uline = explode(" ", trim(fgets($uhandle)), 4); 
     foreach ($uline as &$value) { 
     if ($value[0] == "$") $value = substr($value, 1); 
     } 
     if (count($uline) >= 2) $index_return[] = $uline; 
    } 
    fclose($uhandle); 
    } 
    return $index_return; 
} 

function session_returning() { 
    global $cfgsession; 
    return $cfgsession['returning']; 
} 

?> 

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

  • कोई संबंधित समस्या नहीं^_^