php访问HTTPS和HTTP之间的会话数据

daz*_*166 7 php session

谢谢你的回复.我已经更新了我的PHP会话代码.

我有一个(HTTPS)-login.php,它仍然是HTTPS,即用户登录后进入帐户仪表板.现在问题是用户在登录仪表板时点击了(HTTP)-about-us.php页面,会话不通过HTTP传输,因为我有session.cookie_secure = 1,那个好用户似乎已经注销了.但是,当用户返回仪表板页面时,他也会在HTTPS上注销?

我相信我错过了造成这个问题的事情.这是我的代码:

这是PHP头文件require()ed以启动会话,即在login.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();}
Run Code Online (Sandbox Code Playgroud)

这是每个页面上的PHP头文件require()ed,用于检查会话是否已启动:

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();}
Run Code Online (Sandbox Code Playgroud)

此外,如果有任何用途,这是在非敏感页面上转换HTTPS的代码,例如about-us.php

if ($_SERVER['SERVER_PORT']!=80)
{
$url = "http://". $_SERVER['SERVER_NAME'] . ":80".$_SERVER['REQUEST_URI'];
header("Location: $url");
}
Run Code Online (Sandbox Code Playgroud)

再次感谢任何帮助人员,daza166

Sim*_*mon 2

如果您使用ini_set('session.cookie_secure',1);,则只有在连接加密的情况下,带有会话 ID 的 cookie 才会传输到服务器。因此,如果您强制用户通过不安全的 http 连接访问 about-us.php,您的脚本将不会收到 cookie,并且他将在页面上显示为注销用户。您将无法访问任何会话变量。

但是,客户端上的 cookie 和服务器上的会话数据都不会被删除。因此,如果用户稍后访问您网站的加密页面(在会话和 cookie 的生命周期内),则仍然存在的带有会话 ID 的 cookie 将被传输,并且他不必再次登录。简而言之,从 HTTPS 转到 HTTP 并再次返回不会注销用户。如果您不需要在未加密的页面上检查用户的登录状态,那么设置 cookie_secure 是一个好主意。

对于您的其他问题:在我看来,检查用户代理并不会显着提高安全级别,因为能够检索某人的会话 ID 的黑客在检索他的用户代理字符串时不会遇到很多问题。检查 id 是有意义的,但如果用户 ip 由于重新连接或更改代理而经常更改,则可能会导致问题。