PHP 会话超时

Posted

技术标签:

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

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

$_SESSION['id'] = $id;

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

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

【问题讨论】:

How do I expire a php session after 30 minutes? 的可能重复项 【参考方案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 解决方案有问题,因为:

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

对于 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'] 变量将不会被设置在首位。但是,我跳过了所有其他的会话管理,因为这个问题只询问超时。

以上是关于PHP 会话超时的主要内容,如果未能解决你的问题,请参考以下文章

PHP会话默认超时[重复]

PHP会话默认超时[重复]

带有警告的 PHP/Javascript 会话超时

在php中更新会话超时的数据库表

PHP会话超时脚本[重复]

通过 .htaccess 在 PHP 中延长会话超时