感谢您的回复。我已经更新了我的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()ed,用于检查会话是否已启动:
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");
}
再次感谢任何帮助人员,daza166
答案 0 :(得分:2)
看起来你在这里问了几个不同的问题,但要解决这个问题:
我在想是否有任何理由真正检查用户代理/ IP等,因为虽然它会减少劫持的可能性,但它只是比较$ _SESSION == $ _ SESSION ie(www.domain.com/login.php?hacker =否)
如果您问为什么人们将会话变量与提交的内容进行比较,答案是因为$_SESSION
中存储的变量是在会话开始时定义的,即用户登录时,可能是在劫持发生了。 (劫持者只能劫持现有的会话,并且该会话可能已经开始而没有涉及劫持者。)因此,如果我们定期将提供的页面请求的用户代理字符串或IP地址与我们存储的用户代理字符串或IP地址进行比较从我们的会话开始,我们可能能够检测到劫持(假设劫持者具有不同的用户代理字符串/ IP地址)。
我不知道您的HTTPS问题的答案。
答案 1 :(得分:2)
如果使用ini_set('session.cookie_secure',1);
,则只有连接加密后,才会将带有session-id的cookie转移到服务器。因此,如果您强制用户通过不安全的http连接访问about-us.php,您的脚本将不会收到cookie,并且他将在页面上显示为logedout用户。您将无法访问任何会话变量。
但是,客户端上的cookie和服务器上的会话数据都不会被删除。因此,如果用户稍后访问您网站的加密页面(在会话的生命周期内和Cookie中),则会传输具有会话ID的仍然存在的cookie,并且他不必再次登录。简而言之,从HTTPS到HTTP并再次返回将不会注销用户。如果您不需要在未加密的页面上检查用户的登录状态,设置cookie_secure是个不错的主意。
对于您的其他问题:在我看来,检查用户代理并不会显着提高安全级别,因为能够检索某人会话ID的黑客也不会在检索其用户代理时遇到很多问题 - 串。检查id是有意义的,但如果用户ip因重新连接或更改代理而经常更改,则可能会导致问题。