【问题标题】:PHP Multi-Domain Sessions; ini_set Not Working?PHP 多域会话; ini_set 不工作?
【发布时间】:2011-01-08 01:29:11
【问题描述】:

我正在尝试设置它,因此如果您登录到我的网站,会话将延续到我网站的所有子域。例如,如果您先访问 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 是否有效。

我做错了什么?谢谢!

【问题讨论】:

  • ini_set 与共享主机无关..(因为它通常不会被禁用..)

标签: php session dns ini-set


【解决方案1】:

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

您在会话中传递了哪些信息?或者您是否使用它来处理登录等?

【讨论】:

  • 感谢您的建议,但它检查出来了。它完全返回我设置的内容,所以我猜我的主机上没有禁用 ini_set()。
  • 是的,我也尝试了 session_set_cookie_params,但它也不起作用:/。我还尝试通过 .htaccess 设置它并使用 php_value。
  • 如果一切都失败了,只需手动处理信息(参见更新 2)
  • 会话用于处理登录。感谢您的建议!由于我似乎无法进行其他任何工作,因此我将考虑手动处理 cookie。
  • 我会建议使用用户会话类...它们中的大多数都是多余的,不依赖于 cookie....
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 不明白...有什么区别?如果有人可以在他们的机器上放置相同的 cookie,那么它是否被加密并不重要。或者我错过了什么? :)
    猜你喜欢
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多