PHP多域会话; ini_set不工作?

时间:2011-01-08 01:29:12

标签: php session dns ini-set

我正在尝试设置它,所以如果您登录我的网站,会话会转移到我网站的所有子域。例如,如果您访问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']。

我也尝试在sub.domain.com代码中使用ini_set(),但没有区别。我已经通过使用ini_get()确认设置session.cookie_domain正在运行。

我做错了什么?谢谢!

3 个答案:

答案 0 :(得分:4)

首先验证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');

您通过会话的信息是什么?或者您是否正在使用它来处理登录等?

答案 1 :(得分:0)

好吧,如果所有其他方法都失败了,你可以实现自己的会话 - PHP中的所有$_SESSION都是cookie set / get和文件支持的数据存储区的包装器。如果您使用标识符手动存储cookie,然后将数据与该标识符相关联(例如,在数据库中,甚至),您可以获得基本相同的功能(如果您想存储一堆变化的话,serialize()可能会有所帮助会话数据)。

答案 2 :(得分:0)

我知道这个问题已经很晚了,但看到这是我找到的唯一正确的答案,人们将会使用它,因为答案被投票了,我想要注意的是,这是一个等待发生的会话黑客。所以解决这个问题:

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的天才。有了这个,人们往往忘记会话实际上是从服务器可读的。如果您的浏览器可以访问它,其他程序也可以访问它。