2010-09-22 16 views
6

estoy usando la siguiente técnica ...PHP - hacer que la sesión caduque después de X minutos

Desde el login.php que el formulario a la página check.php En lo que sí esta

<?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"); 
} 
?> 

y en la página loggedin.php lo primero que hago es

<?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 
} 
?> 

pero una vez conectado al escribir directamente la URL localhost\myProject\loggedin.php que muestra la página ... el cual tiene mucho sentido porque la sesión ha comenzado

lo que quiero implementar es

  • La URL \ sesión directa funciona durante 10 minutos después de que se termina la sesión \ expiró \ Tiempo de espera agotado y luego uso debe iniciar sesión de nuevo y puede obtener el mismo identificador de sesión, pero después de 10 minutos uso no será capaz de navegar con la misma sesión

¿QUÉ NECESITO hacer o aprender

+1

Ver [¿Cómo expiraré una sesión de PHP después de 30 minutos?] (Http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes) – Gumbo

+0

Sé esta es una pregunta muy antigua, pero este es un resultado superior para varias búsquedas de Sesión en Google. Cualquiera que lea esto debería saber que el código en la pregunta es extremadamente inseguro y susceptible a la inyección de SQL. No deseamos que ningún principiante en Google busque malos hábitos. :-) Esta pregunta sobre SO debería ayudar si desea obtener más información: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

Respuesta

10

tienda una marca de tiempo en la sesión:

<?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"); 
} 
?> 

Compruebe si la marca de tiempo está dentro de la ventana de tiempo permitido (600 segundos es de 10 minutos):

<?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 
} 
?> 
+0

es solo que hay '>' en lugar de '<' – Moon

+1

Corregido. Para evitar la fijación de la sesión, es posible que desee agregar 'session_regenerate_id (false); session_destroy(); session_start();' after session_start(); – Lekensteyn

+0

¿Serán 10 minutos sin actividad o solo 10 minutos? Intento utilizar esto para que se cierren si no están activos durante 30 minutos, pero no sé cómo ... – Nathan

1

Me gustaría ver session_set_cookie_params y ini_set("session.gc_maxlifetime", "18000");

+0

'gc_maxlifetime' es el recolector de basura y no tiene nada que ver con la duración real de las sesiones. Justo cuando se mueve a la basura. El 'session_set_cookie_params' es correcto, sin embargo. –

+0

Sé que esta es una publicación muy antigua, pero hice clic en su enlace hoy el 1 de abril y su giro. ouch – Marriott81

Cuestiones relacionadas