1

看来我的自定义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值等同于该变量。

4

2 回答 2

1

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

于 2013-06-28T08:26:19.023 回答
0

以您拥有name="siteToken"但状况良好的形式查看if($passedToken !=。我想应该是if($siteToken !=。也尝试打电话sec_session_start之前if

于 2013-06-28T06:25:23.677 回答