PHP会话/ Cookie数组似乎在“相同”网站上存在冲突

时间:2011-03-31 04:25:20

标签: php session cookies

我有一个包含许多不同目录的网站(例如管理员,成员,演示用户等)。最初,我为网站的每个目录创建了一个唯一的会话名称,但是当在一个目录上销毁单个用户的会话(并且反过来杀死其他人的会话)时,这变得很乏味并且变得不可思议。此外,我相信在本地测试(xampp)和媒体中心托管的外部服务器上,可以在单个浏览器窗口中共享cookie。

(例如,$ _SESSION ['name']会在两个网站上显示,如果设置在一个网站上)。

处理此类活动的正确方法是什么,特别是当在同一个站点上时(想想管理员用户登录,他以演示用户身份登录进行产品演示,然后选择退出 - 这反过来又记录了他不是演示而是管理员。

这样的任何良好的在线资源?

注销

认为显示我当前的注销脚本可能会有所帮助:

<?php
    session_start();

    $_SESSION = array();

    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }

    session_unset();
    session_regenerate_id(true);
    header("Location: page");
    exit;
?>

2 个答案:

答案 0 :(得分:2)

不应该尝试手动设置会话cookie。 PHP为你做了所有这些。

如果你想结束一个会话,请使用session_destroy,这完全可以从轨道上完成整个会话。您无需执行任何其他操作,例如重新生成ID。

您不需要也不应该使用session_unset,它在现代PHP中没有做任何事情。

如果您需要在一个域上拥有多个会话,则需要在调用 之前使用session_set_cookie_paramssession_name session_start 定义该特定“子站点”的cookie路径和cookie名称。为每个子站点单独执行此操作。不要重复使用具有不同路径的相同会话cookie名称,这将导致相当多的麻烦。

答案 1 :(得分:1)

会话有一些规则需要密切关注才能使事情正确进行。如果你不这样做,你将遭受所有这些困扰你的申请的“陷阱”。

使用框架

我建议您使用PHP框架,其中大多数都会自动处理会话。像Kohana,CodeIgniter,Zend等等。

更实际的回应

在已经开发的东西上使用框架并不简单,为了避免它们,我建议您执行以下操作:

复制框架将执行的操作: 1.创建session_init.php文件和bootstrap.php文件。在每个文件可查看文件的顶部,包含您的引导程序文件,然后在引导程序文件的顶部包含session_init。 2.在session_init.php中,创建会话

class session{
       static function init() {
               // Configure garbage collection
            ini_set('session.gc_probability', 1);
            ini_set('session.gc_divisor', 1000);
            ini_set('session.gc_maxlifetime', 43200);   

            // Start the session!
            session_name('mysession');
            if(input::get('session_id'))
                session_id(input::get('session_id'));
            if(input::post('session_id'))
                session_id(input::post('session_id'));      
            session_start();

            // Put session_id in the session variable
            $_SESSION['session_id'] = session_id(); 
        }

    static function destroy()
    {
        if (session_id() !== '')
        {
            // Get the session name
            $name = session_name();

            // Destroy the session
            session_destroy();

            // Re-initialize the array
            $_SESSION = array();

        }
    }   
}
session::init();

会话路径将自动设置为域的根目录,这很重要,因为这样您就不需要为每个页面创建会话。

当人们需要注销时,你会运行session :: destroy();