【问题标题】:PHP - make session expire after X minutesPHP - 使会话在 X 分钟后过期
【发布时间】:2011-04-15 18:29:33
【问题描述】:

我正在使用以下技术...

login.php 表单发布到我执行此操作的页面check.php

<?php    
$uzer = $_POST['user_name'];
$pass = $_POST['user_pass'];

require ('DB_connection.php');

$result = mysql_query("SELECT * FROM accounts WHERE user_Name='$uzer' AND user_Pass='$pass'");

if( mysql_num_rows( $result ) > 0)
{
    $array = mysql_fetch_assoc($result);    

    session_start();
    $_SESSION['user_id'] = $uzer;
    header("Location:loggedin.php");            
}
else
{
    header("Location:login.php");
}
?>

loggedin.php 页面上我做的第一件事是

<?php
session_start();
if( !isset( $_SESSION['user_id'] ) )
{
    header("Location:login.php");
}
else
{
    echo ( "this session is ". $_SESSION['user_id'] );
    //show rest of the page and all
}
?>

但一旦登录,当我直接输入 url localhost\myProject\loggedin.php 时,它会显示页面...这很有意义,因为会话已经开始

我想要实现的是

  • 直接 URL\会话在会话终止\过期\超时后工作 10 分钟,然后使用必须再次登录并且可能获得相同的会话 ID,但 10 分钟后使用将无法使用同一会话

我需要做什么或学习什么

【问题讨论】:

  • 我知道这是一个非常古老的问题,但这是 Google 中多个会话搜索的最佳结果。阅读本文的任何人都应该知道,问题中的代码非常不安全并且容易受到 SQL 注入的影响。我们不希望任何初学者在谷歌上搜索不良习惯。 :-) 如果您想了解更多信息,关于 SO 的这个问题应该会有所帮助:stackoverflow.com/questions/60174/…

标签: php session session-timeout


【解决方案1】:

在会话中存储一个时间戳:

<?php    
$uzer = $_POST['user_name'];
$pass = $_POST['user_pass'];

require ('DB_connection.php');

// Hey, always escape input if necessary!
$result = mysql_query(sprintf("SELECT * FROM accounts WHERE user_Name='%s' AND user_Pass='%s'", mysql_real_escape_string($uzer), mysql_real_escape_string($pass));

if( mysql_num_rows( $result ) > 0)
{
    $array = mysql_fetch_assoc($result);    

    session_start();
    $_SESSION['user_id'] = $uzer;
    $_SESSION['login_time'] = time();
    header("Location:loggedin.php");            
}
else
{
    header("Location:login.php");
}
?>

检查时间戳是否在允许的时间窗口内(600 秒为 10 分钟):

<?php
session_start();
if( !isset( $_SESSION['user_id'] ) || time() - $_SESSION['login_time'] > 600)
{
    header("Location:login.php");
}
else
{
    // uncomment the next line to refresh the session, so it will expire after ten minutes of inactivity, and not 10 minutes after login
    //$_SESSION['login_time'] = time();
    echo ( "this session is ". $_SESSION['user_id'] );
    //show rest of the page and all
}
?>

【讨论】:

  • 只是&gt; 代替了&lt;
  • 已更正。为避免会话固定,您可能需要在 session_start(); 之后添加 session_regenerate_id(false);session_destroy();session_start();;
  • 这是 10 分钟没有活动还是只有 10 分钟?我正在尝试使用它来让他们在 30 分钟内不活动时退出,但我不知道如何...
  • 登录后 10 分钟后过期。如果您希望在 10 分钟后使会话过期,请阅读第二个代码块中的 cmets 并取消注释右侧的行。
【解决方案2】:

我会看看session_set_cookie_paramsini_set("session.gc_maxlifetime", "18000");

【讨论】:

  • gc_maxlifetime 是垃圾收集器,与实际会话生命周期没有任何关系。就在它被移到垃圾桶时。但是,session_set_cookie_params 是正确的。
  • 我知道这是一篇非常古老的帖子,但我今天在 4 月 1 日点击了您的链接,然后它在旋转。哎哟
【解决方案3】:

在您将开始会话的 php 文件中使用会话设置 cookie 函数,它将在定义 x 分钟后过期。

session_set_cookie_params(600);

如上所述,10 分钟后会话过期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-05
    • 2017-05-17
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多