it-swarm.com.de

Wie verfalle ich a PHP Sitzung nach 30 Minuten?

Ich muss eine Sitzung 30 Minuten am Leben halten und sie dann zerstören. 

969
Tom

Sie sollten ein eigenes Sitzungszeitlimit implementieren. Beide von anderen genannten Optionen ( session.gc_maxlifetime und session.cookie_lifetime ) sind nicht zuverlässig. Ich erkläre die Gründe dafür.

Zuerst:

session.gc_maxlifetime
session.gc_maxlifetime gibt die Anzahl von Sekunden an, nach denen Daten als "Müll" angesehen und bereinigt werden. Die Speicherbereinigung erfolgt während des Sitzungsstarts.

Der Garbage Collection wird jedoch nur mit einer Wahrscheinlichkeit von session.gc_probability geteilt durch session.gc_divisor gestartet. Bei Verwendung der Standardwerte für diese Optionen (1 bzw. 100) beträgt die Wahrscheinlichkeit nur 1%.

Nun, Sie können diese Werte einfach anpassen, sodass der Garbage Collector häufiger gestartet wird. Wenn der Garbage Collector gestartet wird, überprüft er jedoch die Gültigkeit für jede registrierte Sitzung. Und das ist kostenintensiv.

Wenn Sie die Standarddateien von session.save_handler von PHP verwenden, werden die Sitzungsdaten in einem Pfad gespeichert, der in session.save_path angegeben ist. Mit diesem Session-Handler wird das Alter der Session-Daten am letzten Änderungsdatum der Datei und nicht am letzten Zugriffsdatum berechnet:

Note: Wenn Sie den standardmäßigen dateibasierten Sitzungshandler verwenden, muss Ihr Dateisystem die Zugriffszeiten (atime) überwachen. Windows FAT bietet keine Möglichkeit, die Müllabfuhr Ihrer Sitzung auf andere Weise zu erledigen, wenn Sie sich in einem FAT-Dateisystem oder einem anderen Dateisystem befinden, für das Atime Tracking nicht verfügbar ist. Seit PHP 4.2.3 wurde mtime (Änderungsdatum) anstelle von atime verwendet. Sie haben also keine Probleme mit Dateisystemen, bei denen Atime-Tracking nicht verfügbar ist.

Es kann daher zusätzlich vorkommen, dass eine Sitzungsdatendatei gelöscht wird, während die Sitzung selbst noch als gültig betrachtet wird, da die Sitzungsdaten kürzlich nicht aktualisiert wurden.

Und zweitens:

session.cookie_lifetime
session.cookie_lifetime gibt die Lebensdauer des Cookies in Sekunden an, die an den Browser gesendet wird. […]

Ja, das ist richtig. Dies wirkt sich nur auf die Lebensdauer des Cookies aus und die Sitzung selbst ist möglicherweise noch gültig. Es ist jedoch die Aufgabe des Servers, eine Sitzung zu annullieren, nicht den Client. Das hilft also nichts. Wenn session.cookie_lifetime auf 0 gesetzt ist, wird das Cookie der Sitzung zu einem echten Sitzungs-Cookie , der nur gültig ist, bis der Browser geschlossen wird.

Schlussfolgerung/beste Lösung:

Die beste Lösung ist, ein eigenes Zeitlimit für Sitzungen zu implementieren. Verwenden Sie einen einfachen Zeitstempel, der den Zeitpunkt der letzten Aktivität (d. H. Anforderung) angibt, und aktualisieren Sie ihn bei jeder Anforderung:

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

Durch das Aktualisieren der Sitzungsdaten mit jeder Anforderung wird auch das Änderungsdatum der Sitzungsdatei geändert, sodass die Sitzung nicht vorzeitig vom Garbage Collection-Collector entfernt wird.

Sie können auch einen zusätzlichen Zeitstempel verwenden, um die Sitzungs-ID regelmäßig neu zu generieren, um Angriffe auf Sitzungen wie Sitzungsfixierung zu vermeiden:

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // session started more than 30 minutes ago
    session_regenerate_id(true);    // change session ID for the current session and invalidate old session ID
    $_SESSION['CREATED'] = time();  // update creation time
}

Anmerkungen:

  • session.gc_maxlifetime sollte mindestens der Lebensdauer dieses benutzerdefinierten Ablaufhandlers (in diesem Beispiel 1800) entsprechen.
  • wenn Sie die Sitzung nach 30 Minuten von activity anstatt nach 30 Minuten seit start ablaufen lassen möchten, müssen Sie auch setcookie mit einem Ablauf von time()+60*30 verwenden, um das Session-Cookie aktiv zu halten.
1567
Gumbo

Einfache PHP Sitzung läuft in 30 Minuten ab.

Hinweis: Wenn Sie die Uhrzeit ändern möchten, ändern Sie einfach die 30 mit der gewünschten Uhrzeit und ändern Sie nicht * 60.


In Minuten: (30 * 60) 
.__ in Tagen: (n * 24 * 60 * 60) n = keine Anzahl von Tagen 


Login.php

<?php
    session_start();
?>

<html>
    <form name="form1" method="post">
        <table>
            <tr>
                <td>Username</td>
                <td><input type="text" name="text"></td>
            </tr>
            <tr>
                <td>Password</td>
                <td><input type="password" name="pwd"></td>
            </tr>
            <tr>
                <td><input type="submit" value="SignIn" name="submit"></td>
            </tr>
        </table>
    </form>
</html>

<?php
    if (isset($_POST['submit'])) {
        $v1 = "FirstUser";
        $v2 = "MyPassword";
        $v3 = $_POST['text'];
        $v4 = $_POST['pwd'];
        if ($v1 == $v3 && $v2 == $v4) {
            $_SESSION['luser'] = $v1;
            $_SESSION['start'] = time(); // Taking now logged in time.
            // Ending a session in 30 minutes from the starting time.
            $_SESSION['expire'] = $_SESSION['start'] + (30 * 60);
            header('Location: http://localhost/somefolder/homepage.php');
        } else {
            echo "Please enter the username or password again!";
        }
    }
?>

HomePage.php

<?php
    session_start();

    if (!isset($_SESSION['luser'])) {
        echo "Please Login again";
        echo "<a href='http://localhost/somefolder/login.php'>Click Here to Login</a>";
    }
    else {
        $now = time(); // Checking the time now when home page starts.

        if ($now > $_SESSION['expire']) {
            session_destroy();
            echo "Your session has expired! <a href='http://localhost/somefolder/login.php'>Login here</a>";
        }
        else { //Starting this else one [else1]
?>
            <!-- From here all HTML coding can be done -->
            <html>
                Welcome
                <?php
                    echo $_SESSION['luser'];
                    echo "<a href='http://localhost/somefolder/logout.php'>Log out</a>";
                ?>
            </html>
<?php
        }
    }
?>

LogOut.php

<?php
    session_start();
    session_destroy();
    header('Location: http://localhost/somefolder/login.php');
?>
121
Rafee

Soll der Benutzer nach einer festgelegten Zeit abgemeldet werden? Legen Sie den Zeitpunkt für die Sitzungserstellung (oder einen Ablaufzeitpunkt) fest, zu dem sie registriert wird, und prüfen Sie dann, ob die Ladezeit für jede Seite dies bewältigen kann.

Z.B.:

$_SESSION['example'] = array('foo' => 'bar', 'registered' => time());

// later

if ((time() - $_SESSION['example']['registered']) > (60 * 30)) {
    unset($_SESSION['example']);
}

Edit: Ich habe das Gefühl, du meinst etwas anderes.

Sie können Sitzungen nach einer bestimmten Lebensdauer mit der Einstellung session.gc_maxlifetime ini ausschneiden:

Edit: ini_set ('session.gc_maxlifetime', 60 * 30);

36
Ross

Dieser Beitrag zeigt einige Möglichkeiten, um das Sitzungszeitlimit zu steuern: http://bytes.com/topic/php/insights/889606-setting-timeout-php-sessions

IMHO ist die zweite Option eine schöne Lösung:

<?php
/***
 * Starts a session with a specific timeout and a specific GC probability.
 * @param int $timeout The number of seconds until it should time out.
 * @param int $probability The probablity, in int percentage, that the garbage 
 *        collection routine will be triggered right now.
 * @param strint $cookie_domain The domain path for the cookie.
 */
function session_start_timeout($timeout=5, $probability=100, $cookie_domain='/') {
    // Set the max lifetime
    ini_set("session.gc_maxlifetime", $timeout);

    // Set the session cookie to timout
    ini_set("session.cookie_lifetime", $timeout);

    // Change the save path. Sessions stored in teh same path
    // all share the same lifetime; the lowest lifetime will be
    // used for all. Therefore, for this to work, the session
    // must be stored in a directory where only sessions sharing
    // it's lifetime are. Best to just dynamically create on.
    $seperator = strstr(strtoupper(substr(PHP_OS, 0, 3)), "WIN") ? "\\" : "/";
    $path = ini_get("session.save_path") . $seperator . "session_" . $timeout . "sec";
    if(!file_exists($path)) {
        if(!mkdir($path, 600)) {
            trigger_error("Failed to create session save path directory '$path'. Check permissions.", E_USER_ERROR);
        }
    }
    ini_set("session.save_path", $path);

    // Set the chance to trigger the garbage collection.
    ini_set("session.gc_probability", $probability);
    ini_set("session.gc_divisor", 100); // Should always be 100

    // Start the session!
    session_start();

    // Renew the time left until this session times out.
    // If you skip this, the session will time out based
    // on the time when it was created, rather than when
    // it was last used.
    if(isset($_COOKIE[session_name()])) {
        setcookie(session_name(), $_COOKIE[session_name()], time() + $timeout, $cookie_domain);
    }
}
20
Pablo Pazos

Ich verstehe, dass die obigen Antworten richtig sind, aber sie sind auf Anwendungsebene. Warum verwenden wir nicht einfach die .htaccess-Datei, um die Ablaufzeit festzulegen?

<IfModule mod_php5.c>
    #Session timeout
    php_value session.cookie_lifetime 1800
    php_value session.gc_maxlifetime 1800
</IfModule>
17
Touqeer Shafi
if (isSet($_SESSION['started'])){
    if((mktime() - $_SESSION['started'] - 60*30) > 0){
        //Logout, destroy session, etc.
    }
}
else {
    $_SESSION['started'] = mktime();
}
14
middus

Verwenden Sie den session_set_cookie_paramsfunciton, um dies durchzuführen.

Muss diese Funktion vor dem Aufruf von session_start() aufgerufen werden.

Versuche dies:

$lifetime = strtotime('+30 minutes', 0);

session_set_cookie_params($lifetime);

session_start();

Weitere Informationen finden Sie unter: http://php.net/manual/function.session-set-cookie-params.php

13
Wallace Maxters

Mit einer Funktion wie der folgenden ist es eigentlich einfach. Es verwendet den Datenbanktabellennamen 'sessions' mit den Feldern 'id' und 'time'.

Jedes Mal, wenn der Benutzer Ihre Site oder Ihren Dienst erneut besucht, sollten Sie diese Funktion aufrufen, um zu prüfen, ob der Rückgabewert TRUE ist. Wenn der Wert FALSE ist, ist der Benutzer abgelaufen und die Sitzung wird zerstört. (Hinweis: Diese Funktion verwendet eine Datenbankklasse, um eine Verbindung herzustellen und die Datenbank abzufragen. Natürlich können Sie dies auch innerhalb Ihrer Funktion oder ähnlichem tun)

function session_timeout_ok() {
    global $db;
    $timeout = SESSION_TIMEOUT; //const, e.g. 6 * 60 for 6 minutes
    $ok = false;
    $session_id = session_id();
    $sql = "SELECT time FROM sessions WHERE session_id = '".$session_id."'";
    $rows = $db->query($sql);
    if ($rows === false) {
        //Timestamp could not be read
        $ok = FALSE;
    }
    else {
        //Timestamp was read succesfully
        if (count($rows) > 0) {
            $zeile = $rows[0];
            $time_past = $zeile['time'];
            if ( $timeout + $time_past < time() ) {
                //Time has expired
                session_destroy();
                $sql = "DELETE FROM sessions WHERE session_id = '" . $session_id . "'";
                $affected = $db -> query($sql);
                $ok = FALSE;
            }
            else {
                //Time is okay
                $ok = TRUE;
                $sql = "UPDATE sessions SET time='" . time() . "' WHERE session_id = '" . $session_id . "'";
                $erg = $db -> query($sql);
                if ($erg == false) {
                    //DB error
                }
            }
        }
        else {
            //Session is new, write it to database table sessions
            $sql = "INSERT INTO sessions(session_id,time) VALUES ('".$session_id."','".time()."')";
            $res = $db->query($sql);
            if ($res === FALSE) {
                //Database error
                $ok = false;
            }
            $ok = true;
        }
        return $ok;
    }
    return $ok;
}
11
Torsten Barthel

Speichern Sie einen Zeitstempel in der Sitzung


<?php    
$user = $_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($user), mysql_real_escape_string($pass));

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

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

Überprüfen Sie nun, ob sich der Zeitstempel im zulässigen Zeitfenster befindet (1800 Sekunden sind 30 Minuten)

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

Bitte verwenden Sie den folgenden Codeblock in Ihrer Include-Datei, der auf jeder Seite geladen wird.

$expiry = 1800 ;//session expiry required after 30 mins
    if (isset($_SESSION['LAST']) && (time() - $_SESSION['LAST'] > $expiry)) {
        session_unset();
        session_destroy();
    }
    $_SESSION['LAST'] = time();
7
lnepal

Verwenden Sie diese Klasse für 30 Minuten

class Session{
    public static function init(){
        ini_set('session.gc_maxlifetime', 1800) ;
        session_start();
    }
    public static function set($key, $val){
        $_SESSION[$key] =$val;
    }
    public static function get($key){
        if(isset($_SESSION[$key])){
            return $_SESSION[$key];
        } else{
            return false;
        }
    }
    public static function checkSession(){
        self::init();
        if(self::get("adminlogin")==false){
            self::destroy();
            header("Location:login.php");
        }
    }
    public static function checkLogin(){
        self::init();
        if(self::get("adminlogin")==true){
            header("Location:index.php");
        }
    }
    public static function destroy(){
        session_destroy();
        header("Location:login.php");
    }
}
0
Amranur Rahman

Alternativ können Sie auch einen DB verwenden. Ich benutze dazu eine DB-Funktion, die ich chk_lgn aufrufe.

Check login prüft, ob sie angemeldet sind oder nicht und setzt dabei den Datums-/Zeitstempel der Prüfung als zuletzt aktiv in der Datenbankzeile/-spalte des Benutzers.

Dort überprüfe ich auch die Uhrzeit. Dies funktioniert momentan für mich, da ich diese Funktion für jede Seite verwende.

P.S. Niemand, den ich gesehen hatte, hatte eine reine DB-Lösung vorgeschlagen.

0
JSG

Zeitstempel verwenden ...

<?php
if (!isset($_SESSION)) {
    $session = session_start();
} 
if ($session && !isset($_SESSION['login_time'])) {
    if ($session == 1) {
        $_SESSION['login_time']=time();
        echo "Login :".$_SESSION['login_time'];
        echo "<br>";
        $_SESSION['idle_time']=$_SESSION['login_time']+20;
        echo "Session Idle :".$_SESSION['idle_time'];
        echo "<br>";
    } else{
        $_SESSION['login_time']="";
    }
} else {
    if (time()>$_SESSION['idle_time']){
        echo "Session Idle :".$_SESSION['idle_time'];
        echo "<br>";
        echo "Current :".time();
        echo "<br>";
        echo "Session Time Out";
        session_destroy();
        session_unset();
    } else {
        echo "Logged In<br>";
    }
}
?>

Ich habe 20 Sekunden gebraucht, um die Sitzung mit Zeitstempel abzulaufen

Wenn Sie 30 Minuten brauchen, fügen Sie 1800 hinzu (30 Minuten in Sekunden) ...

0
Sarvan Kumar