Многодоменные сессии PHP; ini_set не работает? - PullRequest
1 голос
/ 08 января 2011

Я пытаюсь настроить его, чтобы при входе на мой сайт сеанс переносился на все субдомены моего сайта. Например, если вы зайдете на domain.com и войдете в систему, а затем перейдите на sub.domain.com, вы уже войдете в систему на sub.domain.com.

Насколько я понимаю, вы хотели бы использовать ini_set ('session.cookie_domain', '. Domain.com') и затем session_start (), затем установить переменные сеанса, но это не работает.

Пример того, что я делаю:

Код для domain.com:

<?php
 ini_set('session.cookie_domain','.domain.com');
 session_start();
 $_SESSION['variable'] = 1;
?>

Код для sub.domain.com:

<?php
 session_start();
 echo $_SESSION['variable'];
?>

Но $ _SESSION ['variable'] не задано.

Я также пытался использовать ini_set () в коде sub.domain.com, но это не имело никакого значения. Я подтвердил, что настройка session.cookie_domain работает с помощью ini_get ().

Что я делаю не так? Спасибо!

Ответы [ 3 ]

4 голосов
/ 08 января 2011

Сначала проверьте ini_set

<?php
ini_set('session.cookie_domain','.domain.com');

echo ini_get('session.cookie_domain');

session_start();  
$_SESSION['variable'] = 1; 

?> 

Обновление:

Просто подумал об этом .. Вы тоже пробовали:

<?php

session_set_cookie_params( 0, "/", ".domain.com", false, false); 
session_start();  
$_SESSION['variable'] = 1; 

?> 

Обновление 2: альтернативная обработка (ручная обработка файлов cookie)

<?php

session_start();  
session_regenerate_id();
$_SESSION['variable'] = "String Test";

setcookie('PHPSESSID',session_id(),time()+86400,'/','.domain.com');
echo session_id();
?> 

и в файле поддомен

<?php  
if (isset($_COOKIE['PHPSESSID']) && !empty($_COOKIE['PHPSESSID'])) session_id($_COOKIE['PHPSESSID']);

session_start();  
echo $_SESSION['variable'] . "<br />"; 
echo $_COOKIE['PHPSESSID'] . "<br />";
echo session_id();
?> 

Три строки, которые вы можете добавить к каждому файлу для передачи / обработки информации о сеансе

if (isset($_COOKIE['PHPSESSID']) && !empty($_COOKIE['PHPSESSID'])) session_id($_COOKIE['PHPSESSID']);
session_start();  
if (!isset($_COOKIE['PHPSESSID'])) setcookie('PHPSESSID',session_id(),time()+86400,'/','.domain.com');

Какую информацию вы проходите через сеанс? Или вы используете его для входа в систему и т. Д.?

0 голосов
/ 31 августа 2013

Я знаю, что уже поздно после вопроса, но видя, что это единственный правильный ответ, который я нашел, и люди будут его использовать, так как за него проголосовали, я хотел отметить, что это сеанс, ожидающий, чтобы произойти.Итак, решение для этого:

define("ENCRYPTION_KEY", "whatever you want to use as key"); // encryption key
if (isset($_COOKIE['SessionEncrypt']) && !empty($_COOKIE['SessionEncrypt'])) {
    //echo "get cookie: ".$_COOKIE['SessionEncrypt']; //urldecode(decrypt($_COOKIE['SessionEncrypt'], ENCRYPTION_KEY));
    session_id(decrypt(urldecode($_COOKIE['SessionEncrypt']), ENCRYPTION_KEY));
    //session_id($_COOKIE['SessionEncrypt']);
}
session_start();
setcookie('SessionEncrypt',urlencode(encrypt(session_id(), ENCRYPTION_KEY)),time()+86400,'/','yourdomain.com'); // will work cross subdomain

Для шифрования / дешифрования (нашел его где-то здесь, работает как чудо):

function encrypt($pure_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
    return $encrypted_string;
}

function decrypt($encrypted_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);
    return $decrypted_string;
}

Таким образом, никто не может прочитать сессию в cookie,Потому что вам не нужно быть гением, чтобы вставить cookie в ваш браузер.При этом люди, как правило, забывают, что сессии действительно читаются с сервера.Если ваш браузер может достичь этого, то могут и другие программы.

0 голосов
/ 08 января 2011

Что ж, если ничего не помогает, вы можете реализовать свои собственные сеансы - все $_SESSION в PHP - это оболочка для набора / получения файлов cookie и хранилища данных с файловой поддержкой. Если вы сохраняете cookie вручную с идентификатором, а затем связываете данные с этим идентификатором (скажем, даже в БД), вы можете получить практически те же функции (serialize() может помочь, если вы хотите сохранить куча разных данных сеанса).

...