2010-09-22 16 views
6

Sto usando la seguente tecnica ...PHP - rendere sessione scadono dopo X minuti

Dal login.php il modulo messaggi alla pagina check.php in cui faccio questo

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

e sulla loggedin.php pagina prima cosa che faccio è

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

ma una volta effettuato l'accesso quando si digita direttamente l'url localhost\myProject\loggedin.php visualizza la pagina ... che rende perfettamente senso, perché la sessione è iniziata

quello che voglio implementare è

  • L'URL \ sessione diretta funziona per 10 minuti dopo che la sessione è terminata \ scaduto \ scaduta e quindi l'uso deve accedere di nuovo e può ottenere lo stesso ID di sessione, ma dopo 10 minuti di utilizzo non sarà in grado di navigare con la stessa sessione di

COSA DEVO FARE o imparare

+1

Vedi [Come faccio a scadere una sessione PHP dopo 30 minuti?] (Http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes) – Gumbo

+0

So questa è una domanda molto vecchia, ma questo è un ottimo risultato per diverse ricerche di sessione in Google. Chiunque legga questo dovrebbe essere consapevole del fatto che il codice nella domanda è estremamente insicuro e suscettibile all'iniezione SQL. Non vorremmo che i principianti su Google prendessero cattive abitudini. :-) Questa domanda su SO dovrebbe essere d'aiuto se vuoi saperne di più: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

risposta

10

Conservare un timestamp nella sessione:

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

Controllare se il timestamp è all'interno della finestra temporale consentita (600 secondi è di 10 minuti):

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

è solo che c'è '>' al posto di '<' – Moon

+1

corretto. Per evitare la fissazione della sessione, potresti voler aggiungere 'session_regenerate_id (false); session_destroy(); session_start();' after session_start(); – Lekensteyn

+0

Saranno 10 minuti di nessuna attività o solo 10 minuti? Sto cercando di usarlo per farli disconnettere se non sono attivi per 30 minuti, ma non so come ... – Nathan

1

Vorrei guardare session_set_cookie_params e ini_set("session.gc_maxlifetime", "18000");

+0

'gc_maxlifetime' è il garbage collector e non ha nulla a che fare con la durata effettiva delle sessioni. Proprio quando viene spostato nella spazzatura. Il 'session_set_cookie_params' è corretto, tuttavia. –

+0

So che questo è un post molto vecchio, ma ho cliccato il tuo link oggi 1 aprile e la sua rotazione. ao – Marriott81