【问题标题】:php access session data between HTTPS and HTTPphp 访问 HTTPS 和 HTTP 之间的会话数据
【发布时间】:2011-05-02 15:27:36
【问题描述】:

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

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

我相信我遗漏了导致此问题的某些内容。这是我的代码:

这是 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();}

这是在每个页面上都需要()的 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");
}

再次感谢大家的帮助,daza166

【问题讨论】:

    标签: php session


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以在 about-us.php 上 session_id 不可见,这是否意味着当恢复到 http 连接时我无法访问任何 $_SESSION 变量?另外,您会说我需要哪些检查(如果有的话)来确保会话安全,或者单独使用 HTTPS 并检查 $_SESSION['loggedin'] 就足够了吗?最后,我是否需要检查 $_SESSION 变量,即 $_SESSION['email'] 如果在某些操作中使用它是电子邮件格式,并且如果用户正在完成一系列表单而不是 _POST,则将 userid 或 advert_ref 放入 $_SESSION var 是否安全它们是隐藏字段?
    • ^-我在 session_start() 之前包含了 ini_sets,但是当我从 HTTPS 转到 HTTP 并返回 HTTPS 时,我的 $_SESSION 不再存在,即用户不再登录?
    • 回答关于安全使用会话变量的最后一个问题:访问者将无法修改通过 $_SESSION 访问的任何内容(它保留在服务器上),但只能修改通过以下方式访问的数据$_COOKIE。因此,如果您验证一个电子邮件地址,然后将其存储在会话中,您将不必在另一个从会话中读取它的页面上再次验证它。因此,您可以以一系列形式使用会话存储数据。但是,如果用户使用后退按钮,这可能会导致意外结果,因为已经输入的数据仍保留在会话中。
    【解决方案2】:

    您似乎在这里问了几个不同的问题,但要解决这个问题:

    我在想是否有任何理由真正检查用户代理/IP 等,尽管它会减少劫持的机会,但它只是比较 $_SESSION==$_SESSION 即(www.domain.com/login.php?hacker =没有)

    如果您问人们为什么将会话变量与提交的内容进行比较,答案是因为存储在$_SESSION 中的变量是在会话开始时定义的,即用户登录时,大概是在劫持之前发生。 (劫持者只能劫持一个现有的会话,并且该会话可能已经在劫持者没有参与的情况下开始了。)因此,如果我们定期将页面请求提供的用户代理字符串或 IP 地址与我们存储的进行比较从会话开始,我们就可以检测到劫持(假设劫持者有不同的用户代理字符串/IP 地址)。

    我不知道您的 HTTPS 问题的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 2011-08-20
      • 2013-09-03
      • 1970-01-01
      • 2013-06-30
      • 2014-06-09
      • 2010-10-08
      相关资源
      最近更新 更多