PHP会话HTTP到HTTPS问题

我有一个(HTTPS)login.PHP页面保持HTTPS(即一旦用户登录进入帐户仪表板).现在的问题是用户登录到安全的仪表板上时点击到非敏感页面(HTTP)about-us.PHP页面,会话不通过HTTP传输,因为我有session.cookie_secure = 1,这意味着用户出现在HTTP页面上.

然而,当用户回到仪表板页面或任何敏感帐户页面时,我被告知他还应该登录(即从HTTP返回到HTTPS)?但是,情况并非如此,他也出现在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();}

另外如果使用这个代码来转换非敏感页面上的HTTPS,如about-us.PHP

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
答应帮助可能绊倒的人

正如Session lost when switching from HTTP to HTTPS in PHP的答案已经得出结论,由于您正在使用session.cookie_secure = 1,当连接从HTTPS切换到HTTP时,不会传输包含会话ID的cookie.在HTTP连接时,当您使用session_start()时,PHP会创建一个新的会话ID,该会话ID将替代以前的会话ID.

答案还建议一个解决方案,使用查询字符串传递会话ID,然后由页面拾取.这闻到安全缺陷的坏处.不要忘记我们为什么首先使用HTTPS的原因!

所以我向你建议的解决方案是将所有http请求重定向到https对应.对您网站中的所有内容使用HTTPS,从CSS,图像到平凡的静态HTML页面.这实际上是每个应用程序严重的安全性.例如,使用HTTP访问github页面将返回:

HTTP/1.1 301 Moved Permanently
Server: Nginx/0.7.67
Date: Sun,08 May 2011 15:43:01 GMT
Content-Type: text/html
Content-Length: 185
Connection: close
Location: https://github.com/

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>Nginx/0.7.67</center>
</body>
</html>

请记住,为什么您首先使用HTTPS,如果您想要完全安全,请使用HTTPS进行所有操作.

在引导时检测请求是否为HTTPS或不是(See this question).

如果请求是HTTP,请将所有请求重定向到HTTPS主页,或者您可以尝试解析$_SERVER [‘REQUEST_URI’],并使用parse_url和http_build_url将HTTP请求重定向到HTTPS对应.

第二种替代方案

如果您真的不想为所有内容使用HTTPS,那么在使用HTTP访问的页面上不要使用session_start().执行此操作时,将保留安全Cookie.

第三种替代方案

一个解决方案是通过IP地址和用户代理来尝试和检测用户.这不能保证是准确的,所以我建议只是使用HTTPS的一切.例如,PayPal总是使用HTTPS,即使是平凡的静态页面.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中NATIVE的支付实现流程与PC端实现扫码支付流程
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中APP的支付的配置与实现流程
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。 配置 1.首先得在微信公众平台申请一下微信小程序账号并获取到小程序的AppID和AppSecret https://mp.weixin.qq.com/cgi-bin/loginpage?url=%2Fwxamp%2F
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一款开源且免费商用的后台开发框架,它基于ThinkPHP和Bootstrap两大主流技术构建的极速后台开发框架,它有着非常完善且强大的功能和便捷的开发体验,使我逐渐喜欢上了它。
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛,就离不开通讯了,然后我就想到了长连接。这里本人用的是GatewayWorker框架。
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中JSAPI的支付实现流程
服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?