php访问HTTPS和HTTP之间的 session 数据

标签 php session

感谢您的回复。我已经更新了我的 PHP session 代码。

我有一个 (HTTPS)-login.php,它仍然是 HTTPS,即一旦用户登录就会转到帐户仪表板。现在的问题是,用户在登录到仪表板时单击 (HTTP)-about-us.php 页面, session 不会通过 HTTP 传输,因为我有 session.cookie_secure=1,这很好,用户似乎已注销。但是,当用户返回到仪表板页面时,他是否也在 HTTPS 上注销了?

我相信我遗漏了导致此问题的原因。这是我的代码:

这是启动 session 所需的 PHP 头文件,即在 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();}

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

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");
}

再次感谢大家的帮助,daza166

最佳答案

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

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

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

关于php访问HTTPS和HTTP之间的 session 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5859029/

相关文章:

javascript - Yii Form 的 Angular 表单验证

java - 为什么 Tomcat 8 不会在创建后立即将 session 持久保存到数据存储区?

PHP MYSQL 从表中验证用户并设置 SESSION 'username'

javascript - 在没有 Express 的情况下使用 Node.js 客户端 session

php - 本地主机页面无法通过 Mamp 工作

php - 我可以使用 SSL 在 PHP 中加密提交的表单数据吗?

php - Codeigniter 和 PHP 检查 session 是否存在

php - 检查 session 是否设置,如果没有创建一个?

php - laravel 外键约束格式不正确

php - Laravel 4 - REST资源丰富的 Controller