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