ThWboard Support-Forum (Archiv)

Ort: / Boardübersicht / Archiv / [fixed] [2.84] Session-timeout wird u.u. übergangen


Seite 1 von 1

Medivh schrieb am 19.02.2004 um 21:06 Uhr

In der header.inc.php findet sich folgendes Konstrukt:

if( time() % 60 > 55 )
{
    // delete some old records
    thwb_query("DELETE FROM ".$pref."online WHERE onlinetime<" . (time() - 300));
}

Dies hat bei Erfüllen der IF Abfrage zur Folge, dass Sessions gelöscht werden, obwohl das Session Time-Out im Adminpanel viel höher eingestellt ist. Ein ersetzen der 300 Sekunden durch die Variable $config['session_timeout'] korrigiert diesen Fehler.

Jürgen S. schrieb am 19.02.2004 um 22:01 Uhr

Kann es sein, das du hier einem Gedankenfehler unterliegst?
Wann wird die if Abfrage ausgeführt? Doch nicht ständig - sondern nur bei einer Aktion des Browsers. (aktualisierung oder Klick)
Dabei wird doch aber ein neuer Eintrag in MySQL $pref."online onlinetime generiert. Das heißt, da ist immer ein neuerer Eintrag da, als mit den -300 gelöscht werden. Ich denke, da könnte sogar ein -5 drinstehen und es würde die Session nicht gelöscht.
Gruß

theDon schrieb am 19.02.2004 um 22:04 Uhr

das problem ist, das auch fremde sessions entfernt werden.

Jürgen S. schrieb am 20.02.2004 um 11:15 Uhr

ist das Gewollt oder Bug?
Das heißt ja, das in einem viel benutzten Forum die User "ständig" rausgeschmissen werden (wenn nicht Cookie benutzt wird)
Man könnte ja auch nur die Einträge löschen lassen, die von der eigenen userid stammen. Damit werden sicher sie anzahl der Datensätze in der MySQL hochschnellen. (Einträge der Gäste mit userid 0 werden dann auch nicht mehr gelöscht)

Gruß

theDon schrieb am 20.02.2004 um 14:33 Uhr

man könnte IN(0, ".$user['userid'].") benutzen.

Medivh schrieb am 20.02.2004 um 15:50 Uhr

theDon postete
das problem ist, das auch fremde sessions entfernt werden.

richtig. bei unsrem board sind immer ca. 10-30 leute gleichzeit online, und folgende situation kommt leider _sehr_ oft vor: ein user schreibt einen langen text (dauer: über 300 sekunden) und will dann posten. beim klick auf "antwort senden" bekommt er den fehler, dass die session-id ungültig ist. ein klick auf den zurück-button des browsers lässt die vorherige seite leider manchmal neu laden, so dass der geschriebene text weg ist.

entweder man nimmt in kauf, dass sich die online tabelle etwas mehr füllt, wenn man als löschzeit die timeout zeit für die sessions verwendet (wie oben vorgeschlagen), oder man lässt wie von jürgen geschrieben, nur die einträge mit eigener userid löschen. ich sehe allerdings bei unserer auslastung kein problem damit, die session-entries in der online tabelle 3600 sec stehen zu lassen. bei unserem board bewegt sich das in der größenordnung von 300-1000 einträgen, welche, wenn ich das richtig beobachtet habe, keine merkbare auswirkung auf die performance haben.

Medivh schrieb am 20.02.2004 um 15:54 Uhr

Jürgen S. postete
Das heißt ja, das in einem viel benutzten Forum die User "ständig" rausgeschmissen werden (wenn nicht Cookie benutzt wird)

Der Fehler tritt übrigens unabhängig davon auf, ob Cookies benutzt werden oder nicht. Wenn ich mit Cookie eingeloggt bin, wird ja in meinem Cookie nur die SID gespeichert. Wenn diese aber in der Zwischenzeit in der online Tabelle gelöscht worden ist, verliert die SID im Cookie ebenfalls ihre Gültigkeit. Beim Posten kommt dann ebenfalls der "Session ungültig"-Fehler, mit den gleichen Auswirkungen, dass sehr oft der geschriebene Text nach Klick auf den "Zurück" Button einfach weg ist. Damit die SID im Cookie aktualisiert wird, müsste ich eine beliebige Forenseite laden - nur ist dann der geschriebene Text eben schon verschwunden, was ja das Hauptproblem an der Sache ist.

theDon schrieb am 20.02.2004 um 15:59 Uhr

Medivh postete
Der Fehler tritt übrigens unabhängig davon auf, ob Cookies benutzt werden oder nicht. Wenn ich mit Cookie eingeloggt bin, wird ja in meinem Cookie nur die SID gespeichert. Wenn diese aber in der Zwischenzeit in der online Tabelle gelöscht worden ist, verliert die SID im Cookie ebenfalls ihre Gültigkeit. Beim Posten kommt dann ebenfalls der "Session ungültig"-Fehler, mit den gleichen Auswirkungen, dass sehr oft der geschriebene Text nach Klick auf den "Zurück" Button einfach weg ist. Damit die SID im Cookie aktualisiert wird, müsste ich eine beliebige Forenseite laden - nur ist dann der geschriebene Text eben schon verschwunden, was ja das Hauptproblem an der Sache ist.

das stimmt so nicht, allerdings stimmen die symptome.

Jürgen S. schrieb am 20.02.2004 um 21:06 Uhr

Ich habe es mal so probiert.
Alter Script:

if( time() % 60 > 55 )
{
    // delete some old records
    thwb_query("DELETE FROM ".$pref."online WHERE onlinetime<" . (time() - 300));
}

Neues Script:

if( time() % 60 > 55 )
{
    // delete some old records
    thwb_query("DELETE FROM ".$pref."online WHERE (userid = ". $g_user['userid']. " OR userid = 0 ) AND onlinetime<" . (time() - 300));
}

Damit sollte das Script eigentlich nur die einträge für den User selbst und für gäste löschen.
Mit deinem Code theDon

man könnte IN(0, ".$user['userid'].") benutzen.

hab ich das nicht hinbekommen.
Gruß

theDon schrieb am 20.02.2004 um 22:59 Uhr

ehm, sollte auch $g_user['userid'] heißen.

/e: und die zeit ist immernoch nicht angepasst ;)

Jürgen S. schrieb am 21.02.2004 um 14:06 Uhr

das mit dem

IN(0, ".$g_user['userid'].")

funktioniert nicht. Allerdings muß ich sagen, ich komme mit dem "IN" nicht ganz klar. Script lautet bei mir

thwb_query("DELETE FROM ".$pref."online WHERE onlinetime<" . (time() - 300). " IN(0, ".$g_user['userid'].") ");

Da werden alle einträge gelöscht - es wird keine Rücksicht aud die userid genommen. mit

thwb_query("DELETE FROM ".$pref."online WHERE (userid = ". $g_user['userid']. " OR userid = 0 ) AND onlinetime<" . (time() - 300));

funktioniert es. Allerdings könnte die Zeit runtergesetzt werden. -300 läßt noch sehr viele einträge in der DB, mit -50 sollte es auch gehen.
Was meinst du mit

/e: und die zeit ist immernoch nicht angepasst

Die Zeitkomponente dürfte dann doch dann keine Rolle mehr spielen. Es werden dann doch nur noch die eigenen Daten gelöscht, die älter sind.
Gruß

theDon schrieb am 21.02.2004 um 16:31 Uhr

thwb_query("DELETE FROM ".$pref."online WHERE userid IN (0, ".$g_user['userid'].") AND onlinetime<" . (time() - $config['session_timeout']));

so ists im cvs und so funktionierts auch.

Jürgen S. schrieb am 21.02.2004 um 18:56 Uhr

Ja ist klar, ich habe das userid zwischen WHERE und IN nicht gehabt.
Aber wollt ihr wirklich die Variable $config['session_timeout'] mit reinnehmen?
Das gibt ganz schön unnötige Datensätze. Gut ist ja nur bis zum ausloggen, dann werden die Daten ja sowieso gelöscht.

pixeltrends schrieb am 06.03.2004 um 09:52 Uhr

Hallo,

ich habe das nun alles gelesen aber weiss nun noch nicht wie man was machen soll?

Könnte mir bitte jemand (für einen Nichtskönner) erklären wie ich was einstellen muss? Ich habe das Problem auch mit den 300 sek.

Vielen Dank

Ralf

Jürgen S. schrieb am 06.03.2004 um 10:24 Uhr

Hallo,

In der header.inc.php steht folgendes

if( time() % 60 > 55 )
{
// delete some old records
thwb_query("DELETE FROM ".$pref."online WHERE onlinetime<" . (time() - 300));
}

Ersetz es mal durch das

if( time() % 60 > 55 )
{
// delete some old records

thwb_query("DELETE FROM ".$pref."online WHERE userid IN (0, ".$g_user['userid'].") AND onlinetime<" . (time() - $config['session_timeout']));
}

Gruß
jürgen s.

pixeltrends schrieb am 06.03.2004 um 10:46 Uhr

Hallo Jürgen,

Danke für die schnelle Hilfe!!!!

Ralf

pixeltrends schrieb am 06.03.2004 um 10:49 Uhr

###### okay habe Sie sorry ############

Hallo,

also ich finde keine header.inc.php Datei?
Wo hat die sich versteckt?

Ralf

MrNase schrieb am 06.03.2004 um 16:00 Uhr

im Ordner ./inc/ ;)

Sh4d0w schrieb am 05.05.2004 um 22:25 Uhr

öhm, ich hab da ma ne frage! ich hab mein 2.81er board gebackuped und auf nem andern acc in die DB eingespielt und auf 2.84 geupdated. läuft, ich benutze zu den SIDs auch cookies... wenn jetz die session-timeout wie nach der install standardmäßig auf 1800 steht, bekomme ich ne halbe std nach dem einloggn im forum die meldung meine SID sei abgelaufn... wenn ich dann aber über navpath o.ä. wieder aufs forum geh, bin ich trotzdem immer noch eingeloggt... hat das hiermit zu tun & ich werde dieses problem durch die zuletzt beschriebene nachbesserung in der header.inc los???

mille schrieb am 07.05.2004 um 10:46 Uhr

Mal nen paar dumme Frage bezüglich dieses Problems mit der Session-ID:

1. Das Problem tritt doch nur bei einigen Funktionen auf?! Weil wenn ich mir nen Board oder so anzeigen lasse, dann schaut der ja erst nach dem Cookie, wo ich meine Login-Daten dauerhaft drin habe, oder?
Wäre es dann nicht möglich die andren Funktionen so umzuschreiben, dass da auch immer des eine bestimmte Cookie überprüft wird und net nur das mit der Session-ID?! (Oder hau ich was durcheinander und es gibt nur ein Cookie mit der Session-ID und kein zweites mit den Login-Daten?!)

2. Was wären zu empfehlende Einstellungen für Session-ID-Timeout?! Ich will ja auch nicht stundenlang nicht-aktive User in der Liste haben... andrerseits sollen sie sich ja auch net im 5 Minutentakt neu einloggen müssen. Was gibts da für Erfahrungen in der Praxis? ;) Reichen 15 Min oder eher 30/ 45/ etc.?!

Schon mal danke fürs Durchlesen =)



Edit: Hab gerade festgestellt, dass das Problem ja doch bei allen Funktionen des Forums auftritt?! Wäre es kompliziert, wenn man es so umschreiben würde, dass zumindest die, die den automatischen Login da aktiviert haben, nicht diese Fehlermeldung bekommen? Also dass er, sobald er merkt, dass die Session-ID abgelaufen ist, sofort versucht ne neue Session zu starten mit den Daten aus dem dauerhaften Cookie?!

Was passiert, wenn ich folgendes mache:

message("Fehler", "Diese Session-ID ist ungültig.");

...wird ersetzt durch:

if( isset( $HTTP_COOKIE_VARS['thwb_cookie'] ) )
        {
          $thwb_cookie = $HTTP_COOKIE_VARS['thwb_cookie'];
        }
      else
        {
      message("Fehler", "Diese Session-ID ist ungültig.");
        };

und dann noch:

// timed out
            thwb_query("DELETE FROM ".$pref."online WHERE sessionid='".addslashes($s)."'");
      
            message("Timeout", "Sie wurden automatisch ausgeloggt, weil Ihre Session-ID abgelaufen ist. <br>Bitte <a href=\"".build_link("login.php?source=".$path)."\">loggen</a> Sie sich neu ein.");

...wird ersetzt durch:

if( isset( $HTTP_COOKIE_VARS['thwb_cookie'] ) )
          {
            $thwb_cookie = $HTTP_COOKIE_VARS['thwb_cookie'];
          }
        else
          {
            // timed out
            thwb_query("DELETE FROM ".$pref."online WHERE sessionid='".addslashes($s)."'");
      
            message("Timeout", "Sie wurden automatisch ausgeloggt, weil Ihre Session-ID abgelaufen ist. <br>Bitte <a href=\"".build_link("login.php?source=".$path)."\">loggen</a> Sie sich neu ein.");
          };

Öhm, was hab ich damit jetzt gemacht?! Überprüft der dann nochmal, ob er auf Daten ausm Cookie zurückgreifen kann und geht da auch sonst nix schief?!
Zumindest scheint es bei mir gut zu funktionieren...

Ne andre Frage: Das Alter von Session-IDs wird doch immer wieder auf 0 gesetzt, wenn ein User irgendwas macht oder?
Die Anzeige, wieviel User online sind, zeigt aber nur USer mit ner Session-ID bis zu nem bestimmten Alter oder? =)
Sorry, hab kein Plan von Sessions und auch nur nen bissl Standard-PHP-Kenntnisse :(

Also mir ist aufgefallen, dass da eine Funktion beschrieben wird mit sowas wie "keine id, aba cookie da"... was isn mit der? wieso geht die net? :/

Außerdem noch was direkt zu dem Bugfix für SID-Timeout... also das was Juergen gepostet hat: Kann es sein, dass sich danach die Online-Table so ziemlich stark zugemüllt wird? *g* Weil da sind auch Daten drin, die über 3 Stunden alt sind, obwohl SID-Timeout auf 1800 steht... oder ich hab time falsch umgerechnet, aber das war doch einfach die Zeit in Sekunden vom 01.01.70 ausgehen?! Hilfe :/

Seite 1 von 1