उप डोमेन में PHP सत्र


92

मैं निम्नलिखित सेट करने का प्रयास कर रहा हूं:

auth.example.com
sub1.example.com
sub2.example.com

यदि उपयोगकर्ता विज़िट करता है sub1.example.comया sub2.example.comवे लॉग इन नहीं होते हैं, तो वे रीडायरेक्ट हो जाते हैं auth.example.comऔर लॉग इन कर सकते हैं।

sub1.example.comऔर sub2.example.comदो अलग-अलग अनुप्रयोग हैं लेकिन समान क्रेडेंशियल्स का उपयोग करें।

मैंने अपने php.ini में निम्नलिखित सेट करने की कोशिश की:

session.cookie_domain = ".example.com"

लेकिन ऐसा लगता है कि यह एक डोमेन से दूसरे में जानकारी नहीं दे रहा है।

[संपादित करें]

मैंने निम्नलिखित कोशिश की:

sub1.example.com/test.php

session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Regsitered'] = 1;
echo '<a href="http://auth.example.com/test.php">Change Sites</a>'

auth.example.com/test.php

session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Checked'] = 1;
print_r($_SESSION);

सत्र आईडी बिल्कुल समान हैं लेकिन जब मैं $_SESSIONचर को बाहर निकालता हूं तो यह दोनों कुंजियों को नहीं दिखाता है, बस जो भी कुंजी मैं प्रत्येक डोमेन के नीचे सेट करता हूं।


आपको इसे अपने कोड में भी सक्षम करना है, http://us2.php.net/manual/en/function.session-set-cookie-params.php
रेजिडम

1
मेरे पास लगभग एक ही सेटअप है (मैं "session_set_cookie_params" के लिए कॉल के साथ सत्र कुकी डोमेन सेट करता हूं) और यह ठीक काम करता है।
मिलीन ए। राडदेव

यहाँ अच्छा कार्य है जो stackoverflow.com/questions/2835486/… पर
boksiora

जवाबों:


134

मुझे नहीं पता कि क्या समस्या अभी भी मौजूद है, लेकिन मैं सिर्फ एक ही समस्या में भाग गया और इसे कॉल करने से पहले सत्र नाम सेट करना हल कर दिया session_set_cookie_params():

$some_name = session_name("some_name");
session_set_cookie_params(0, '/', '.example.com');
session_start();

मैंने अपने अंदर कुछ नहीं बदला है php.iniलेकिन अब सब कुछ ठीक चल रहा है।


10
मैं पुष्टि करता हूं, यह समस्या को हल करता है। मैं वहां अपना जवाब पाने के लिए थक गया: stackoverflow.com/questions/4948340/… । लेकिन मैंने इसे यहां पाया।
रोमन

5
सही काम करता है! इसके लिए उम्र की तलाश में रहे। यह था $some_name = session_name("some_name");कि यह किया है। धन्यवाद और उत्थान।
किट

4
जोड़ना session_name("domain");मेरे लिए भी गायब घटक था। इन सत्र सेटिंग्स के बारे में php.net पर प्रलेखन की कमी है। Php.net पर सामुदायिक पोस्ट हैं जो सेशन को दर्शाती हैं। session_name को सेशन_सेट_क्युई_परम () में बदलाव करने से पहले परिभाषित करने की आवश्यकता है।
डेविड कैरोल

3
हां। की पुष्टि। अच्छा युग वहाँ के लिए हलकों में चारों ओर जा रहा था;)
Daithí

1
नोट ... जीवन सर्वर पर काम करने के लिए मेरा ब्राउज़र बंद करना और पुनः आरंभ करना था। किसी भी ini_set("session.cookie_domain", ".domain.com");कारण को छोड़ दें, क्योंकि यह हर ताज़ा के साथ नया सत्र आईडी बनाने के लिए पैदा कर रहा था।
21

24

एक चीज जो रहस्यमय तरीके से सत्र डेटा को उपडोमेन पर पढ़ने से रोक सकती है, कुकीज़ के सही ढंग से सेट होने के बावजूद .example.comPHP सुहोसिन पैच है। आपके पास सब कुछ सही तरीके से कॉन्फ़िगर किया जा सकता है, उदाहरण के लिए प्रश्न में, और यह सिर्फ काम नहीं कर सकता है।

निम्नलिखित सुहोसिन सत्र सेटिंग्स को बंद करें, और आप व्यवसाय में वापस आ गए हैं:

suhosin.session.cryptua = Off 
suhosin.session.cryptdocroot = Off

5

प्रयोग करके देखें:

session.cookie_domain = "example.com"

के बजाय:

session.cookie_domain = ".example.com"

लापता अवधि की शुरुआत में ध्यान दें।

हालांकि, इसका उपयोग करना सावधान रहें, क्योंकि यह सभी ब्राउज़रों द्वारा समर्थित नहीं है।


9
कौन से ब्राउज़र समर्थित नहीं हैं?
गॉपरट्रॉन

10
क्या ब्राउज़र समर्थन यहाँ है? यह एक सर्वर साइड एक्शन है।
कुफ

4

यह सटीक समस्या थी - मैं चाहता था कि x.example.local पर बने सत्र मान उदाहरण.लोक और इसके विपरीत उपलब्ध हों।

मैंने पाया सभी समाधानों php_value session.cookie_domain .example.localमें .htaccess (या php.ini के माध्यम से या ini_set) के माध्यम से सत्र डोमेन को बदलने के लिए कहा गया है ।

यह कैच मैं session.cookie_domainसभी उप-डोमेन (अब तक ठीक है) के लिए सेट कर रहा था, लेकिन मुख्य डोमेन के लिए भी। session.cookie_domainमुख्य डोमेन पर सेट करना स्पष्ट रूप से एक नहीं-नहीं है।

मूल रूप से जिस तरह से इसने मेरे लिए काम किया:

  • session.cookie_domainसभी के लिए सेट करें ।
  • इसे मुख्य DOMAIN के लिए सेट न करें

अरे हाँ, कृपया सुनिश्चित करें कि डोमेन में TLD (मेरे मामले में .local) है। Http प्रोटोकॉल कुकीज़ / सत्रों को बिना डोमेन पर संग्रहीत किए जाने की अनुमति नहीं देता है। (यानी लोकलहोस्ट काम नहीं करेगा, लेकिन stuff.localhost विल)।

संपादित करें : यह भी सुनिश्चित करें कि आप हमेशा अपने ब्राउज़र कुकीज़ को उप-सत्रों में परीक्षण / डिबगिंग सत्र के दौरान साफ़ करें। यदि आप नहीं करते हैं, तो आपका ब्राउज़र हमेशा पुराने सत्र की कुकी भेजेगा जो शायद अभी तक सही कुकी_डोमेन सेट नहीं है। सर्वर पुराने सत्र को पुनर्जीवित करेगा और इसलिए आपको झूठे नकारात्मक परिणाम मिलेंगे। (सटीक समान प्रभाव के लिए session_name ('सामान') का उपयोग करने के लिए उल्लेखित कई पोस्टों में)


3

मैंने इसे इस तरह हल किया

ini_set('session.cookie_domain', '.testdomain.example');
session_start();

क्योंकि मैं लोकलहोस्ट पर काम कर रहा था

ini_set('session.cookie_domain', '.localhost');

यह काम नहीं कर रहा था , यह .localhost को .com / .local / ... के बजाय टॉपवेल के रूप में देखता है (मुझे संदेह है)


यह भी मेरी मशीन के लिए तय - Ubuntu 14.04
डेनिस

3

मैने पुष्टि कर ली है। joreon का उत्तर सही है। मैं टिप्पणी नहीं कर सकता क्योंकि मेरी प्रतिष्ठा पर्याप्त नहीं है इसलिए मैं अपनी टिप्पणी यहां पोस्ट करता हूं।

कॉन्फिग फाइल में कंटीन्यू को परिभाषित करें। यदि आप इसे बदलना चाहते हैं, तो संपूर्ण फ़ाइलों को संशोधित करने की कोई आवश्यकता नहीं है।

define('ROOT_DOMAIN',   'mysite.example');
define('PHP_SESSION_NAME', 'MYSITE'); 

सत्र नाम में केवल अंक नहीं हो सकते, कम से कम एक अक्षर मौजूद होना चाहिए। अन्यथा, हर बार एक नया सत्र आईडी उत्पन्न होता है।

सत्र का उपयोग शुरू करने के लिए निम्नलिखित कोड का उपयोग करें

session_name(PHP_SESSION_NAME);
session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
session_start();

मैं इस फ़ंक्शन का उपयोग कर रहा हूं:

function load_session() {
    if (session_status() == PHP_SESSION_NONE) {
        session_name(PHP_SESSION_NAME);
        session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
        session_start();
    } elseif (session_name() != PHP_SESSION_NAME) {
        session_destroy();
        session_name(PHP_SESSION_NAME);
        session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
        session_start();
    }
}
load_session(); // put it in anywhere you want to use session

2

हर डोमेन / उप डोमेन पर इसका उपयोग करें:

session_name('name');
ini_set('session.cookie_domain', '.example.com');
ini_set('session.save_path', '/var/lib/php/session');
session_start();

session.save_pathआपके मामले के लिए पथ भिन्न हो सकता है लेकिन यह प्रत्येक डोमेन / उपडोमेन पर समान होना चाहिए । यह हमेशा डिफ़ॉल्ट रूप से सही नहीं होता है।


1

यह प्रयोग करें, यह काम करता है:

ini_set('session.cookie_domain', 
    substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));

यह tld के लिए कुकी की स्थापना की तरह दिखता है ... या मैं कुछ याद कर रहा हूँ?
चाचम 15

1

उप डोमेन और रूट डोमेन कुकी सत्र संयुक्त उपयोग

संसाधन: http://php.net//manual/tr/function.session-set-cookie-params.php

मैंने काम का परीक्षण किया है

sub.example.com/sessionadd.php?id=123

example.com/sessionview.php // 123

- कोड

<?php 
$currentCookieParams = session_get_cookie_params(); 

$rootDomain = '.example.com'; 

session_set_cookie_params( 
    $currentCookieParams["lifetime"], 
    $currentCookieParams["path"], 
    $rootDomain, 
    $currentCookieParams["secure"], 
    $currentCookieParams["httponly"] 
); 

session_name('mysessionname'); 
session_start(); 

setcookie($cookieName, $cookieValue, time() + 3600, '/', $rootDomain); 
?>

0

मुझे यह विचार मिलता है कि आप ओपनआईडी जैसा कुछ नहीं चाहते हैं, जैसे कि जोएल सुझाव दे रहा है, लेकिन आप कई डोमेन में सत्र डेटा तक पहुंच चाहते हैं।

एकमात्र संभावना है कि मैं उस समस्या के समाधान के रूप में सोच सकता हूं कि सत्रडेटा को डेटाबेस में संग्रहीत करना है, और उस डेटाबेस से बाहर निकालना है।


सही है, जबकि प्रमाणीकरण मैं क्या करना चाहता हूं, इसका एक हिस्सा है, मैं उस सत्र डेटा में भी दिलचस्पी रखता हूं जो उपयोगकर्ता के काम करते समय संग्रहीत होता है।
ड्रैगनमंकट

0

मुझे इसी तरह की समस्या थी, हालांकि, यह समाधान मेरे लिए अच्छा था, शायद भविष्य में दूसरों की मदद करेगा

php.ini संपादित करें

session.cookie_domain = ".example.com"

जादू यहाँ है

suhosin.session.cryptdocroot = Off

suhosin.cookie.cryptdocroot = Off

https://www.sitepoint.com/community/t/sessions-across-subdomains-domain-com-phpsessid-changes/3013/19


0

मैं PHP के अन्य संस्करणों के लिए बात नहीं कर सकता, लेकिन 5.6.6 में, बस फ़ाइल session.cookie_domainमें मान सेट php.iniकरने से मेरे सभी उप-डोमेन को iPage पर सत्र चर का एक ही सेट साझा करने की अनुमति देने की चाल चली गई ।

परीक्षण के लिए अपने ब्राउज़र से अपने डोमेन से संबंधित किसी भी मौजूदा कुकीज़ को निकालना सुनिश्चित करें।

session.cookie_domain = '.yourdomainname.example'

ओह, पता नहीं कि इससे कोई फ़र्क पड़ता है लेकिन मैं सत्र ऑटोस्टार्ट का भी उपयोग कर रहा हूँ।

session.auto_start = 1

0

बस उपरोक्त session_start()विधि से निम्नलिखित कोड का उपयोग करने का प्रयास करें

$sess_life_time = 21600; //in seconds
$sess_path = "/";
$sess_domain = ".example.com";
$sess_secure = true; // if you have secured session
$sess_httponly = true; // httponly flag

session_set_cookie_params($sess_life_time, $sess_path, $sess_domain, $sess_secure, $sess_httponly);

0

मैंने ऊपर दिए गए सभी उत्तरों को पढ़ा है, मुझे लगता है कि मेरा उत्तर लोगों के लिए यह मददगार है।

  • यह सुनिश्चित करें कि ब्राउज़र सत्र कुकी (डोमेन और उप-डोमेन के लिए) भेजते हैं, सत्र कुकी डोमेन को इस प्रकार सेट करें .example.com

  • सुनिश्चित करें कि सत्र चर को पुनर्स्थापित करने के लिए PHP सही "लक्ष्य" ढूंढें:

    • यदि डोमेन और उप-डोमेन एक ही मशीन (शायद अलग-अलग वर्चुअल होस्ट) की ओर इशारा करते हैं, तो सुनिश्चित करें कि session_save_pathसभी के लिए समान है (मैंने परीक्षण किया)
    • यदि डोमेन और उप-डोमेन अलग-अलग मशीनों की ओर इशारा करते हैं, तो सामान्य डेटा (जैसे डेटाबेस) सत्र डेटा को बचाने और पुनर्स्थापित करने के लिए सबसे अच्छा है (मैंने अभी तक काम नहीं किया है)। session_set_save_handlerऐसा करने के लिए उपयोग करें ।

0

मुझे पता है कि यह पुराना है, लेकिन यह मेरे लिए एक ही बॉक्स पर कई डोमेन और उप डोमेन के साथ ठीक काम करता है।

<?php
define('site_domain','example.com');
session_set_save_handler('_open',
                         '_close',
                         '_read',
                         '_write',
                         '_destroy',
                         '_clean');

function _open(){

    global $_sess_db;

$db_user = 'user';
$db_pass = 'pass';
$db_host = 'localhost';

if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass)){

    return mysql_select_db('database', $_sess_db);

}

return false;

}

function _close(){

    global $_sess_db;
    return mysql_close($_sess_db);

}

function _read($id){

    global $_sess_db;
    $id = mysql_real_escape_string($id);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "SELECT data
    FROM sessions
    WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'";

     if ($result = mysql_query($sql, $_sess_db)){

         if (mysql_num_rows($result)){
             $record = mysql_fetch_assoc($result);
             return $record['data'];
        }

    }

    return '';

}

function _write($id, $data){

    global $_sess_db;
    $access = time();

    $id = mysql_real_escape_string($id);
    $access = mysql_real_escape_string($access);
    $data = mysql_real_escape_string($data);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "REPLACE INTO sessions
    VALUES ('$id', '$access', '$data', '$domain', '$agent')";

    return mysql_query($sql, $_sess_db);

}

function _destroy($id){

    global $_sess_db;
    $id = mysql_real_escape_string($id);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "DELETE FROM sessions
    WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'";

    return mysql_query($sql, $_sess_db);

}

function _clean($max){

    global $_sess_db;
    $old = time() - $max;
    $old = mysql_real_escape_string($old);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "DELETE FROM sessions
    WHERE  access < '$old' AND domain = '$domain' AND agent = '$agent'";

    return mysql_query($sql, $_sess_db);

}

?>


6
आप किस प्रश्न का उत्तर दे रहे हैं? और यह 9 अन्य उत्तरों पर कैसे सुधार / बढ़ाता है?
random_user_name


-2

एक त्वरित और गंदे समाधान अपने रीडायरेक्ट के लिए इसका उपयोग करना है:

header( $url.'?'.session_name().'='.session_id() );

यह ?PHPSESSID=etnm7kbuf5lg0r6tv7je6ehtn4URL की तर्ज पर कुछ जोड़ देगा , जो PHP को सत्र आईडी बताता है जिसका उसे उपयोग करना चाहिए।


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

सहमत, यह क्वेरी स्ट्रिंग में सत्र आईडी छोड़ने के लिए बहुत कमजोर है।
इयान जेमिसन

4
कुकीज़ को सादे पाठ के रूप में भी भेजा जाता है, इससे ऐसे कोई भी रास्ते नहीं खुलते जो पहले से खुले नहीं थे। मैं यह नहीं कह रहा कि यह एक अच्छा उपाय है, लेकिन यह कुकीज़ का उपयोग करने से कम सुरक्षित नहीं है।
साकबाको

1
यह इस मायने में कम सुरक्षित है कि उपयोगकर्ता अपने URL को साझा करने में (छल) हो सकते हैं और इस प्रकार अपनी सक्रिय सत्र आईडी साझा कर सकते हैं। यह बहुत कम संभावना है कि कोई उपयोगकर्ता अपने सत्र आईडी कुकी को अनजाने में साझा कर देगा।
बस्तियान दस क्लोस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.