【发布时间】:2011-08-20 18:18:07
【问题描述】:
我有一个 (HTTPS) login.php 页面,它仍然是 HTTPS(即一旦用户登录到帐户仪表板)。现在的问题是说用户在登录到安全仪表板时点击了一个非敏感页面,如(HTTP)about-us.php 页面,会话不是通过 HTTP 传输的,因为我有 session.cookie_secure=1,这意味着用户在 HTTP 页面上显示为已注销。
但是,当用户返回仪表板页面或任何敏感帐户页面时,我被告知他仍应登录(即从 HTTP 返回到 HTTPS)?然而事实并非如此,他似乎也退出了 HTTPS 连接?
我相信我遗漏了导致此问题的某些内容。这是我的代码:
这是在 login.php 页面上调用以启动会话的 PHP 头文件:
session_start();
session_regenerate_id(true); /*avoid session fixation attempt*/
/*Create and check how long session has been started (over 5 mins) regenerate id - avoid session hijack*/
if(!isset($_SESSION['CREATED']))
{
$_SESSION['CREATED'] = time();/*time created session, ie from login/contact advertiser/email_confirm only ways for new session to start*/
}
elseif(time() - $_SESSION['CREATED'] > 300)
{
/*session started more than 5 mins(300 secs) ago*/
session_regenerate_id(true); /*change session ID for the current session and invalidate old session ID*/
$_SESSION['CREATED'] = time(); /*update creation time*/
}
/*Check if user is logged in*/
if(!isset($_SESSION['loggedin']))
{
$_SESSION['loggedin']=1;/*used to track if user is logged in on pages*/
}
/*if return false browser supports standard ob_start();*/
if(ob_start("ob_gzhandler")){ob_start();}
这是每个页面都需要的 PHP 头文件,用于检查会话是否已经启动:
session_start();
$session_errors=0;/* if>0 user not logged in*/
/*check if session is already initiated*/
if(isset($_SESSION['CREATED']))
{
if(time() - $_SESSION['CREATED'] > 300)
{
/*session started more than 5 mins(300 secs) ago*/
session_regenerate_id(true); /*change session ID for the current session and invalidate old session ID*/
$_SESSION['CREATED'] = time(); /*update creation time*/
}
}
elseif(!isset($_SESSION['CREATED'])){$session_errors++;}/*user not logged in*/
/*Check if user is logged in*/
if(!isset($_SESSION['loggedin'])){$session_errors++;}/*user not logged in*/
if(ob_start("ob_gzhandler")){ob_start();}
如果有任何用途,这是在非敏感页面(例如 about-us.php)上打开 HTTPS 的代码
if ($_SERVER['SERVER_PORT']!=80)
{
$url = "http://". $_SERVER['SERVER_NAME'] . ":80".$_SERVER['REQUEST_URI'];
header("Location: $url");
}
我的 php.ini 文件 cookie 设置
session.cookie_secure=1
session.cookie_httponly=1
session.use_only_cookies=1
session.cookie_lifetime = 0
session.save_path = /tmp
session.save_handler = files
【问题讨论】:
-
看上面的问题(虽然不要听从它的建议),当用户移动到http连接时,cookie没有被传输,所以当
session_start()被调用时,它会生成一个新的会话ID ,因此之前的会话 id 会丢失。 -
@rickchristie,我已阅读该主题,唯一的方法似乎是将安全 cookie 标志设置为“关闭”。但这肯定是不安全的,因为我的 session_id 不能在 HTTP 页面上被嗅探吗?我不想通过 URL 大量安全漏洞发送 session_id。
-
是的,这是一个巨大的安全漏洞,这就是为什么我告诉你不要听从它的建议:) - 我有一个解决方案,作为答案发布在下面,尽管它可能不是你想要的解决方案。
标签: php http https session-state