然而,当用户回到仪表板页面或任何敏感帐户页面时,我被告知他还应该登录(即从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();}
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"); }
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,即使是平凡的静态页面.