会话混乱

时间:2011-02-11 15:29:10

标签: php session

如果用户的会话时间超过30分钟,我想退出用户。这段代码是否正确?
如果是的话,有人可以解释一下吗? 如果没有,你能告诉我什么是问题和解决方案吗? 如果我不使用这个到期时间,网站将是不安全的?

  if((mktime() - $_SESSION['started'] - 60*30) > 0){ 
    //logout, destroy session etc<br>
  } 
}else{
  $_SESSION['started'] = mktime(); 
} 

5 个答案:

答案 0 :(得分:2)

让PHP正常处理会话超时。设置在php.ini

  session.gc_maxlifetime = 1440

会话所占的秒数 默认值为1440秒或24分钟。

为防止会话劫持,您可以例如

  • 检查会话发起人的IP地址和下次查询的IP(不完美,你可能会遇到没有固定IP断开连接并且在24 mn内使用不同IP重新连接的人的问题)
  • 或添加另一个cookie,只设置一次(永不过期)具有可能唯一值(md5哈希)。创建会话时,您将该值存储在会话中,并在下次交换期间检查该值的值(假设窃取程序不会复制该cookie)。

答案 1 :(得分:0)

使用time()代替mktime(),那么它应该是正确的。

但我会说不要只依赖$ _SESSION ...... 有更安全的方法,即基于数据库的会话管理

答案 2 :(得分:0)

首先,您应该使用time()而不是mktime(),因为您还没有转换日期+时间组件。

然后你应该把条件改写成更具可读性的东西:

 if ( time() > $_SESSION['started'] + 60*30 ) {

根据您的使用情况,您可能还会考虑不使用“已启动”时间,但可能会使用“lastaccess”。 (您还可以在创建会话时预先定义“销毁”时间,从而简化逻辑。)

答案 3 :(得分:0)

“如果用户的会话时间超过30分钟,我想退出用户。这段代码是否正确?”

不,如果他在30分钟后没有采取行动,那么您当前的代码会断开用户的连接。 你需要:

}else if(!isset($_SESSION['started'])){
  $_SESSION['started'] = mktime(); 
} 

答案 4 :(得分:-1)

PHP已经处理了这个问题 默认情况下,会话将在24分钟不活动后过期 你不用担心。