【问题标题】:PHP Session timeoutPHP 会话超时
【发布时间】:2011-03-05 08:50:02
【问题描述】:

当用户像这样登录时,我正在创建一个会话:

$_SESSION['id'] = $id;

如何在 X 分钟的会话上指定超时,然后让它在达到 X 分钟后执行功能或页面重定向??

编辑:我忘了提到由于不活动而需要会话超时。

【问题讨论】:

标签: php session redirect login timeout


【解决方案1】:

当会话过期时,数据不再存在,所以像

if (!isset($_SESSION['id'])) {
    header("Location: destination.php");
    exit;
}

只要会话不再活动,就会重定向。

您可以使用 session.cookie_lifetime 设置会话 cookie 的存活时间

ini_set("session.cookie_lifetime","3600"); //an hour

编辑:如果您出于安全考虑(而不是方便)而将会话超时,请使用已接受的答案,如下面的 cmets 所示,这是由客户端控制的,因此不安全。我从没想过这是一种安全措施。

【讨论】:

  • 您必须删除 $_SESSION['id'] 周围的引号
  • 即使您没有投票,但您的解决方案似乎更安全,我的问题是,您是否必须在每个页面上设置会话超时?我想这是有道理的,因为您希望它每次都重新启动?其次,您是否必须为每个页面执行 session_start 才能获取会话数据,或者只需一次即可启动它?谢谢
  • 会话 cookie 的生命周期存在一些问题,最值得注意的是,它依赖于 client 来执行它。 cookie 生命周期允许客户端清理无用/过期的 cookie,不要与任何与安全相关的内容混淆。
  • @jacco:我赞成这个,投反对票。这只是默默无闻的安全。
  • 此答案应与 Jacco 的答案相结合,以获得完整的解决方案。 Jacco 的回答不允许您将会话修改为比默认时间长,并且不处理客户端删除其 cookie 的情况。
【解决方案2】:

Byterbit 解决方案有问题,因为:

  1. 让客户端控制服务器端 cookie 的过期是一个安全问题。
  2. 如果服务器端设置的过期超时时间小于客户端设置的超时时间,页面将无法反映cookie的实际状态。
  3. 即使在开发阶段为了舒适起见,这也是一个问题,因为它不会在发布阶段反映正确的行为(在时间上)。

对于 cookie,通过 session.cookie_lifetime 设置过期时间是正确的解决方案设计和安全性!要使会话到期,您可以使用 session.gc_maxlifetime。

通过调用 session_destroy 使 cookie 过期可能会产生不可预知的结果,因为它们可能已经过期。

在 php.ini 中进行更改也是一个有效的解决方案,但它会使整个域的过期时间成为全局的,这可能不是您真正想要的 - 某些页面可能会选择保留一些 cookie 比其他页面更多。

【讨论】:

    【解决方案3】:
    <?php
    session_start();
    if($_SESSION['login'] != 'ok')
        header('location: /dashboard.php?login=0');
    
    if(isset($_SESSION['last-activity']) && time() - $_SESSION['last-activity'] > 600) {
        // session inactive more than 10 min
        header('location: /logout.php?timeout=1');
    }
    
    $_SESSION['last-activity'] = time(); // update last activity time stamp
    
    if(time() - $_SESSION['created'] > 600) {
        // session started more than 10 min ago
        session_regenerate_id(true); // change session id and invalidate old session
        $_SESSION['created'] = time(); // update creation time
    }
    ?>
    

    【讨论】:

    • 请务必评论您的答案并说明您在何处以及如何添加超时。
    【解决方案4】:

    首先检查会话是否尚未创建,如果没有创建。这里我只设置了 1 分钟。

    <?php 
       if(!isset($_SESSION["timeout"])){
         $_SESSION['timeout'] = time();
       };
       $st = $_SESSION['timeout'] + 60; //session time is 1 minute
    ?>
    
    <?php 
      if(time() < $st){
        echo 'Session will last 1 minute';
      }
    ?>
    

    【讨论】:

      【解决方案5】:
      <?php 
      session_start();
      
      if (time()<$_SESSION['time']+10){
      $_SESSION['time'] = time();
      echo "welcome old user";
      }
      
      else{
      session_destroy();
      session_start();
      $_SESSION['time'] = time();
      echo "welcome new user";
      }
      ?>
      

      【讨论】:

        【解决方案6】:
        <script type="text/javascript">
        window.setTimeout("location=('timeout_session.htm');",900000);
        </script>
        

        在站点测试期间,每个页面的标题都为我工作(该站点尚未投入生产)。它落到的 HTML 页面结束会话,只是通知用户需要再次登录。这似乎比玩 PHP 逻辑更简单。 我希望有一些关于这个想法的cmets。有什么我没见过的陷阱吗?

        【讨论】:

        • 如果您在同一个站点上打开了多个选项卡,则必须将它们全部刷新以创建活动,否则如果您继续在 1 个选项卡中工作,其他选项卡将在超时后显示“timeout_session.htm”。非常令人沮丧,特别是如果“timeout_session.htm”正在取消设置/破坏会话。 =)
        【解决方案7】:
            session_cache_expire( 20 );
            session_start(); // NEVER FORGET TO START THE SESSION!!!
            $inactive = 1200; //20 minutes *60
            if(isset($_SESSION['start']) ) {
        $session_life = time() - $_SESSION['start'];
        if($session_life > $inactive){
            header("Location: user_logout.php");
        }
            }
            $_SESSION['start'] = time();
        
            if($_SESSION['valid_user'] != true){
            header('Location: ../....php');
            }else{  
        

        来源:http://www.daniweb.com/web-development/php/threads/124500

        【讨论】:

        • 只是谷歌搜索你遇到的第一个答案并将其粘贴到 Stack Overflow 中不利于本网站的重点。此外, session_cache_expire() 与会话的长度无关,因此您粘贴的答案信息不正确。
        • @DavidBradbury 默认cookie存储session_id,如果cookie过期,客户端请求时无法访问session_id。
        【解决方案8】:

        首先,存储用户最后一次发出请求的时间

        <?php
          $_SESSION['timeout'] = time();
        ?>
        

        在随后的请求中,检查他们多久以前提出过他们的上一个请求(本例中为 10 分钟)

        <?php
          if ($_SESSION['timeout'] + 10 * 60 < time()) {
             // session timed out
          } else {
             // session ok
          }
        ?>
        

        【讨论】:

        • 但是如果您的 PHPINI 中的默认会话超时时间短于您选择的时间,则会话可能会在此之前超时。默认情况下,超时通常少于一小时。如果您不希望客户端控制超时,则需要将此代码与 session.cookie_lifetime 的 ini_set 结合起来。此答案也不处理客户端删除其 cookie 的情况。
        • PHP 默认为 '0',意思是:“直到浏览器关闭”。如果浏览器删除 cookie,$_SESSION['timeout'] 变量将不会被设置在首位。但是,我跳过了所有其他的会话管理,因为这个问题只询问超时。
        猜你喜欢
        • 2011-10-17
        • 2010-12-11
        • 2019-06-28
        • 2011-03-29
        • 2021-06-30
        • 2010-11-20
        相关资源
        最近更新 更多