Jörg Reinholz: Ein Loginscript - so weit, so gut

Beitrag lesen

Moin!

Ich möchte auf gar keinen Fall selber irgendwelche Textdateien erstellen und speichern müssen, weil das meist der Anfang vom Ende ist :)

Kleine Einrede:
Du willst nicht ernsthaft "was mit login" machen und hast beim Umgang mit Dateien Probleme? Oi oi!

Zum Stoff:

Wenn Du an Deinem PHP nicht herumgespielt hast, dann wird die Session im /tmp/ gespeichert. Es ist eine Textdatei mit der Session-ID im Name.

Ich geh mal kucken ...

Ah! Da ist eine:

-rw------- 1 www-data www-data 112 Feb 29 12:06 sess_mdtta7ok5l0id56cep4qvcoln0

Inhalt:

username|s:3:"foo";groups|a:3:{s:13:"standard-user";b:1;s:4:"test";b:1;s:4:"user";b:1;}last_action|i:1456743973;

(Eine Zeile...)

Das ist die serialisierte Session, aber das muss Dich nicht kümmern.

In PHP sieht die so aus:

$_SESSION['id']|mdtta7ok5l0id56cep4qvcoln0|#Der Dateiname ohne den Vorbau 'sess_'  
$_SESSION['username']|foo|
$_SESSION['groups'][0]|standard-user|
$_SESSION['groups'][1]|test|
$_SESSION['groups'][2]|user|
$_SESSION['last_action']|1456743973|#Sekunden. seit 1.1.1970 00:00

Wenn Du genau diese Daten nochmal speichern willst, dann mach nach dem Login einfach:

$_SESSION['sess_id']=session_id();
$sessJSON = json_encode($_SESSION);
$cookieFile = $deinSessionDir . '/' . $_SESSION['sess_id'];
file_put_contents($cookieFile, $sessData);
$_COOKIE['LoginToken'] = $_SESSION['sess_id'];

Wie gesagt, ein eigener Ordner. Diesen Spaß machst Du Dir bei jedem erfolgreichen Login.

Den hechelst Du regelmäßig durch um zu alte Daten zu löschen:

<?php
## file: delete_old_extrasessions.php

delete_old_extrasessions('/tmp', 10) { # 10 Tage, nicht drei ...
function delete_old_extrasessions( $deinSessionDir = '/tmp', $maxTage = 3 ) {
  $d = dir($deinSessionDir);
  while (false !== ($entry = $d->read())) {
   if ( '.' != substr ( $entry , 0, 1) ) { # kein dir - Eintrag, keine versteckte Datei .htaccess!
    $mtime = filemtime($entry); # letzte Änderung! Sek. seit 1.1.1970
    if ( date('U')-($maxTage * 24 * 60 * 60)) > $mtime ) { # wenn die Datei vor n tagen geändert wurde
     unlink($entry); # weg damit!
   }
 }
}

Das kann z.B. ein cronjob erledigen: crontab -e und das hier eintragen:

#m h  dom mon dow command
 * \1 *   *   *   /usr/bin/php /pfad/zu/delete_old_extrasessions.php

Sonst irgendwo includieren, was einmal am Tag aber nicht aller 2 Sekunden aufgerufen wird.

So. Jetzt kommt ein Benutzer vorbei.

1. Prüfung: hat er eine Session-ID?

wenn ja -> wie gehabt.

wenn nein:

2. Prüfung: Sendet er ein Cookie mit einem Token (die sess_id reicht...?

wenn nein -> login();

wenn ja:

3. Prüfung: Gibt es die Datei mit dem Token als Dateiname?

wenn nein -> login();

wenn ja:

$json = file_get_contents($_COOKIE['Token']);
session start();
$_SESSION = json_decode($json);
$_SESSION['last_action']=date('U');

Und das war es... behandle den Benutzer wie soeben eingeloggt. Speichere also auch die Datei für den Cookie-Abgleich neu ($_SESSION['last_action'] sei jetzt und hier der Zeitpunkt des letzten Logins) und sende auch das Cookie neu um dessen Gültigkeitsfrist neu zu setzen.

Jörg Reinholz

0 58

Ein Loginscript

Malcolm Beck`s
  • datenbank
  • php
  1. -2
    pl
    1. 0
      Orlok
      • perl
      • zu diesem forum
  2. 0
    Jörg Reinholz
    1. 0
      Jörg Reinholz
      1. 0
        Malcolm Beck`s
        1. 0
          Jörg Reinholz
          1. 0
            woodfighter
            1. 0
              Auge
              • datenbank
              • menschelei
              • php
              1. 0
                Christian Kruse
                1. 0
                  Jörg Reinholz
          2. 0
            Malcolm Beck`s
            1. 2
              Auge
              • php
              • sicherheit
              1. 0
                Malcolm Beck`s
                1. 2
                  Jörg Reinholz
                  1. 0

                    Ein Loginscript - so weit, so gut

                    Malcolm Beck`s
                    1. 0
                      Matthias Apsel
                      1. 0
                        Malcolm Beck`s
                        1. 1
                          Auge
                          • internet-anbindung
                          • sicherheit
                          1. 0
                            woodfighter
                            • internet-anbindung
                            1. 0
                              Auge
                              1. 0
                                woodfighter
                                1. 0
                                  Auge
                      2. 0
                        woodfighter
                        1. 0
                          Jörg Reinholz
                        2. 0
                          Matthias Apsel
                          1. 0
                            woodfighter
                            • internet-anbindung
                    2. 1
                      Jörg Reinholz
                      • php
                      • programmiertechnik
                      • programmiertechnik
                      1. 0

                        Ein Loginscript - so weit geklärt

                        Malcolm Beck`s
                    3. 1
                      Jörg Reinholz
                      1. 0
                        Malcolm Beck`s
            2. 1
              woodfighter
    2. 0
      Malcolm Beck`s
      1. 0
        woodfighter
      2. 1
        Jörg Reinholz
    3. 3
      1unitedpower
  3. 2
    Felix Riesterer
    1. 4
      Christian Kruse
      1. 0
        Malcolm Beck`s
        1. 1
          Christian Kruse
          1. 0
            Malcolm Beck`s
            1. 0
              Christian Kruse
              1. 0
                Malcolm Beck`s
            2. 2
              woodfighter
              1. 0
                woodfighter
                • sicherheit
            3. 1
              Tabellenkalk
              1. 0
                Auge
                • datenbank
                • menschelei
                • php
              2. 0
                Jörg Reinholz
      2. 0
        Felix Riesterer
        1. 0
          Christian Kruse
      3. -2
        pl
        1. 0
          woodfighter
    2. 0
      Malcolm Beck`s
      1. 3
        Christian Kruse
        1. 0
          Malcolm Beck`s
          1. 0
            Christian Kruse
            1. 0
              Malcolm Beck`s
              1. 0
                Christian Kruse