উপ-ডোমেন জুড়ে পিএইচপি সেশনস


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ভেরিয়েবলটি ডাম্প করি তখন এটি উভয় কী প্রদর্শন করে না, আমি প্রতিটি ডোমেনের নীচে যে কী সেট করে থাকি।


আপনার
কোডটিতেও

4
আমার প্রায় একই সেটআপ আছে (আমি "সেশন_সেট_কিউকি_প্রেমস" এর কল দিয়ে সেশন কুকি ডোমেন সেট করেছি) এবং এটি দুর্দান্ত কাজ করে।
মাইলেন এ রাদেব

এখানে চমৎকার ফাংশন যা কাজ করে 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/… । তবে আমি এটি এখানে খুঁজে পেয়েছি।
রোমান

4
নিখুঁত কাজ করে! এই জন্য বয়সের জন্য খুঁজছেন। এটিই $some_name = session_name("some_name");এটি করেছিল। আপনাকে ধন্যবাদ এবং upvote।
কিট

4
যোগ session_name("domain");করা আমার জন্য পাশাপাশি অনুপস্থিত উপাদান ছিল। এই অধিবেশন সেটিংস সম্পর্কিত php.net এ নথিপত্রের অভাব রয়েছে। পিএইচপি.এন. তে সম্প্রদায় পোস্ট রয়েছে যা সেশন_সেট_কিউকি_প্রেমস () এ পরিবর্তনগুলি প্রয়োগ করার পূর্বে সেশন.নাম সংজ্ঞায়িত করা দরকার indicate
ডেভিড ক্যারল

4
হ্যাঁ নিশ্চিত বেশ
কয়েক

4
দ্রষ্টব্য ... লাইফ সার্ভারে কাজ করার জন্য আমার ব্রাউজারটি বন্ধ করে পুনরায় চালু করতে হয়েছিল। কোনও ini_set("session.cookie_domain", ".domain.com");কারণ ছাড়ুন যার ফলে এটি প্রতিটি রিফ্রেশ সহ নতুন সেশন আইডি তৈরি করে।
দাইথ

24

কুকিগুলি সঠিকভাবে সেট করা থাকা সত্ত্বেও, একটি সাবডোমেনে সেশন ডেটাটি রহস্যজনকভাবে পড়া সেশন ডেটা রোধ করতে পারে এমন একটি বিষয় .example.comহ'ল পিএইচপি সুহসিন প্যাচ। প্রশ্নের উদাহরণ অনুসারে আপনি সবকিছু সঠিকভাবে কনফিগার করতে পারেন এবং এটি কার্যকর হতে পারে না।

নিম্নলিখিত সুহসিন সেশন সেটিংস বন্ধ করুন, এবং আপনি আবার ব্যবসায়ে ফিরে এসেছেন:

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

5

ব্যবহার করার চেষ্টা করুন:

session.cookie_domain = "example.com"

পরিবর্তে:

session.cookie_domain = ".example.com"

শুরুতে অনুপস্থিত সময় নোট করুন।

এটি ব্যবহারে সতর্ক থাকুন, কারণ এটি সমস্ত ব্রাউজার দ্বারা সমর্থিত নয় supported


9
কোন ব্রাউজারগুলি সমর্থিত নয়?
gawpertron

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 ছাড়া কোনও ডোমেইনে কুকি / সেশনগুলি সংরক্ষণ করার অনুমতি দেয় না (যেমন লোকালহোস্ট কাজ করবে না, তবে স্টাফ.লোক্যালহস্ট করবে) will

সম্পাদনা : সাবডোমেনগুলি জুড়ে সেশনগুলি পরীক্ষা / ডিবাগ করার সময় আপনি সর্বদা আপনার ব্রাউজার কুকিজ সাফ করার বিষয়টি নিশ্চিত করুন। যদি আপনি এটি না করেন তবে আপনার ব্রাউজারটি সর্বদা পুরানো সেশন কুকি প্রেরণ করবে যা সম্ভবত এখনও সঠিক কুকি_ডোমেন সেট নেই। সার্ভারটি পুরানো অধিবেশনটিকে পুনরুদ্ধার করবে এবং সেইজন্য আপনি মিথ্যা নেতিবাচক ফলাফল পাবেন। (অনেকগুলি পোস্টে এটি একই প্রভাবের জন্য সেশন_নাম ('স্টাফ') ব্যবহার করার জন্য উল্লেখ করা হয়েছে)


3

আমি এটি এর মতো সমাধান করেছি

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

কারণ আমি লোকালহোস্টে কাজ করছিলাম

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

কাজ করছিল না , এটি .কম / .লোকাল / ... এর পরিবর্তে লোকালহোস্টকে শীর্ষ স্তরের হিসাবে দেখেছে (


এটি আমার মেশিনের জন্যও ঠিক করেছেন - উবুন্টু 14.04
ডেনিস

3

আমি নিশ্চিত করেছি। জোরিয়ন এর উত্তর সঠিক। আমি মন্তব্য করতে পারি না কারণ আমার খ্যাতি যথেষ্ট নয় তাই আমি আমার মন্তব্যটি এখানে পোস্ট করি।

একটি কনফিগার ফাইলে ধ্রুবককে সংজ্ঞায়িত করুন। আপনি যদি এটি পরিবর্তন করতে চান তবে পুরো ফাইলগুলি সংশোধন করার দরকার নেই।

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));

এটি টিএলডির জন্য কুকিটি সেট করার মতো দেখাচ্ছে ... বা আমি কিছু মিস করছি?
chacham15

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 সম্পাদনা করুন

সেশন.cookie_domain = ".example.com"

যাদু এখানে আছে

suhosin.session.cryptdocroot = Off

suhosin.cookie.cryptdocroot = Off

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


0

আমি পিএইচপি এর অন্যান্য সংস্করণগুলির জন্য কথা বলতে পারি না, তবে 5.6.6 এ, কেবলমাত্র session.cookie_domainমানটি সেট করেphp.ini ফাইলের আমার সমস্ত সাবডোমেনগুলি একই সেশনের ভেরিয়েবলগুলির একই সেট ভাগ করার অনুমতি দেয়।

পরীক্ষার জন্য আপনার ব্রাউজার থেকে আপনার ডোমেন সম্পর্কিত যে কোনও বিদ্যমান কুকিজ অপসারণ করতে ভুলবেন না।

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

  • সেশন ভেরিয়েবলটি পুনরুদ্ধার করতে পিএইচপি সঠিক "লক্ষ্য" খুঁজে পেয়েছে তা নিশ্চিত করুন:

    • যদি ডোমেন এবং সাবডোমেনগুলি একই মেশিনের দিকে নির্দেশ করে (সম্ভবত বিভিন্ন ভার্চুয়াল হোস্টগুলি) তবে নিশ্চিত হয়ে নিন 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 টি উত্তরগুলিতে কীভাবে উন্নতি / বর্ধন করবে?
এলোমেলো ব্যবহারকারীর_নামা 21


-2

আপনার পুনঃনির্দেশের জন্য এটির একটি দ্রুত এবং নোংরা সমাধান:

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

?PHPSESSID=etnm7kbuf5lg0r6tv7je6ehtn4এটি ইউআরএল -এর লাইন বরাবর কিছু যুক্ত করবে , যা পিএইচপিকে এটি ব্যবহার করা সেশন আইডি বলে।


4
এটি এটি সেশন চুরির পক্ষে অত্যন্ত দুর্বল করে ফেলেছে :) সমস্যাটি সেশন আইডিগুলির সাথে মেলে না (তারা হ'ল, আমার আপডেট হওয়া পোস্টটি দেখুন), তবে ডোমেনগুলির মধ্যে ডেটা সরাচ্ছে না।
ড্রাগনমন্তঙ্ক

সম্মত, এটি ক্যোরিয় স্ট্রিংয়ের সেশন আইডি অত্যন্ত দুর্বল।
ইয়ান জ্যামিসন

4
কুকিগুলি সরল পাঠ্য হিসাবে প্রেরণ করা হয়, এটি এমন কোনও উপায় খুলবে না যা ইতিমধ্যে উন্মুক্ত ছিল না। আমি বলছি না এটি একটি ভাল সমাধান, তবে এটি কুকি ব্যবহারের চেয়ে কম নিরাপদ নয়।
সাকাবাকো

4
এটি এই অর্থে কম সুরক্ষিত যে ব্যবহারকারীরা তাদের ইউআরএল ভাগ করে (ঠকানো) এবং তাদের সক্রিয় সেশন আইডিটি ভাগ করে নিতে পারে। কোনও ব্যবহারকারী তাদের সেশন আইডি কুকি অজান্তে ভাগ করে নেওয়ার সম্ভাবনা খুব কম is
বাসটিয়ান টেন ক্লোস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.