我的自定义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
值等同于此变量。
答案 0 :(得分:1)
好的,我希望我理解得对。你试图保持一个会话(具有相同的id,在同一个cookie上),只是一些令牌和那种东西,以使其更安全。
但正如你的最后一段提到的那样,你在每个页面请求上调用sec_session_start();
来保持会话活着,对吧?但是你注意到你还打电话给session_regenerate_id(true);
吗?这样你就可以删除旧的会话文件并创建一个全新的会话 - 这将是空的。
答案 1 :(得分:0)
在表单name="siteToken"
中查看,但条件为if($passedToken !=
。我想应该是if($siteToken !=
。同时尝试在sec_session_start
if