我的自定义session_start()是否创建了一个全新的会话而不是恢复当前会话?

时间:2013-06-28 06:14:59

标签: php session superglobals

我的自定义session_start()似乎正在创建一个新会话,而不是跨页面恢复当前会话。这是方法:

public function sec_session_start()
        {
            $session_name = 'sec_session_id'; //set a custom session name
            $secure = false; //set to true if using https
            $httponly = true; //This stops javascript being able to access the session id

            ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies
            $cookieParams = session_get_cookie_params(); //Gets currtent cookies params
            session_set_cookie_params($cookieParams["lifetime"], $cookieParams["domain"], $secure, $httponly); 
            session_name($session_name); //Sets the session name to the one set above
            session_start(); //Start the php session
            session_regenerate_id(true); //regernates the session, delete the old one
        }

我遇到的问题是关于超全局变量$ _SESSION。例如,在我的登录页面中,我生成一个随机令牌以防止CSRF攻击:

$token = md5(uniqid(mt_rand(), true));
$_SESSION['token'] = $token; //Add randomly generated token to superglobal variable
...
<input type="hidden" name="siteToken" value="$token" />

然后我在php处理页面中测试了正确的令牌值:

//Check Token Values (prevent CSRF attacks)
    if($passedToken != $_SESSION['token']) {
        $error = "CSRF attack detected. Please close your browser and try again."; 
        $signIn->csrfAttackLog($username);
        echo $error;
        exit();     
    }

问题出现在我的php处理页面中:Notice: Undefined index: token in... 显然,我的会话变量还没有结转。我在处理页面中启动了另一个sec_session_start() - 所以并不是我忽略了继续会话。似乎已经开始了一个全新的会议。我已按"printing" $_SESSION值测试了第一页。

赞赏任何意见。

编辑:$passedToken是正确的。有一个中间步骤将$_POST值等同于此变量。

2 个答案:

答案 0 :(得分:1)

好的,我希望我理解得对。你试图保持一个会话(具有相同的id,在同一个cookie上),只是一些令牌和那种东西,以使其更安全。 但正如你的最后一段提到的那样,你在每个页面请求上调用sec_session_start();来保持会话活着,对吧?但是你注意到你还打电话给session_regenerate_id(true);吗?这样你就可以删除旧的会话文件并创建一个全新的会话 - 这将是空的。

答案 1 :(得分:0)

在表单name="siteToken"中查看,但条件为if($passedToken !=。我想应该是if($siteToken !=。同时尝试在sec_session_start

之前调用if