2010-09-22 7 views
6

i die folgende Technik verwende ...PHP - machen Sitzung verfallen nach X Minuten

Vom login.php die Formular Beiträge auf die Seite check.php wo ich dies tun

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

und auf loggedin.php Seite der das erste, was ich tun ist

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

aber einmal eingeloggt, wenn ich die uRL direkt eingeben localhost\myProject\loggedin.php es zeigt die Seite ... Das macht durchaus Sinn, da die Sitzung

begonnen hat ich will, was implementieren ist

  • Die direkte URL \ Sitzung für 10 Minuten nach dem arbeitet, dass die Sitzung beendet wird \ abgelaufen \ abgelaufen und dann muss Verwendung anmelden kann die gleiche Session-ID erhalten immer aber nach 10 Minuten Gebrauch nicht in der Lage sein, mit der gleichen Sitzung

zu durchsuchen, was ich tun tun müssen, oder lernen,

+1

Siehe [Wie veralte ich eine PHP-Sitzung nach 30 Minuten ab?] (Http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes) – Gumbo

+0

Ich weiß Dies ist eine sehr alte Frage, aber dies ist ein Top-Ergebnis für mehrere Session-Suchen in Google. Jeder, der dies liest, sollte sich bewusst sein, dass der Code in der Frage extrem unsicher und anfällig für SQL-Injection ist. Wir möchten nicht, dass Anfänger googeln, um schlechte Angewohnheiten aufzugreifen. :-) Diese Frage auf SO sollte helfen, wenn Sie mehr erfahren möchten: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

Antwort

10

Shop ein Zeitstempel in der Sitzung:

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

Überprüfen Sie, ob der Zeitstempel innerhalb des erlaubten Zeitfensters (600 Sekunden beträgt 10 Minuten):

<?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 ist nur, dass es '>' anstelle von '<' – Moon

+1

Korrigiert. Um Session Fixation zu vermeiden, können Sie hinzufügen 'session_regenerate_id (false); session_destroy(); session_start();' nach session_start(); – Lekensteyn

+0

Wird dies 10 Minuten ohne Aktivität oder nur 10 Minuten sein? Ich versuche, dies zu verwenden, um sie auszuloggen, wenn sie für 30 Minuten nicht aktiv sind, aber ich weiß nicht, wie man ... – Nathan

1

Ich würde Blick auf session_set_cookie_params und ini_set("session.gc_maxlifetime", "18000");

+0

'gc_maxlifetime' ist der Garbage Collector und hat nichts mit der tatsächlichen Lebensdauer der Sitzungen zu tun. Gerade wenn es in den Müll kommt. Das 'session_set_cookie_params' ist jedoch korrekt. –

+0

Ich weiß, dass dies ein sehr alter Beitrag ist, aber ich habe Ihren Link heute am 1. April angeklickt und es dreht sich. autsch – Marriott81