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

感谢您的回复。 我更新了我的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();}

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

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); ,如果连接被加密,带会话ID的cookie将只被传送到服务器。 因此,如果您强制用户通过不安全的http连接访问about-us.php,您的脚本将不会收到cookie,并且他将在页面上显示为logedout用户。 您将无法访问任何会话变量。

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

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


看起来你在这里问几个不同的问题,但要解决这个问题:

我在想有什么理由要检查用户代理/ IP等,尽管它会减少劫持的可能性,它只是比较$ _SESSION == $ _ SESSION即(www.domain.com/login.php?hacker=no)

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

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

链接地址: http://www.djcxy.com/p/52487.html

上一篇: php access session data between HTTPS and HTTP

下一篇: What is the optimal number of nodes in a BitTorrent swarm?