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 会话超时的主要内容,如果未能解决你的问题,请参考以下文章