2012-10-31 5 views
6

Ich habe diese PHP-Webanwendung entwickelt, die jetzt seit einigen Monaten läuft. Plötzlich beschwerte sich einer der Nutzer, dass er sich einloggen konnte, aber die Sitzung wurde beendet, sobald er auf einen beliebigen Button geklickt hat! Das gleiche Problem ist bei verschiedenen Browsern aufgetreten.PHP-Sitzung läuft sofort ab, wenn die Uhr des Clients in der Zukunft eingestellt wird

Nach einigen Tests stellte ich fest, dass eine neue Sitzungs-ID jedes Mal erstellt wurde, wenn der Benutzer auf eine Schaltfläche klickte, wahrscheinlich weil die ursprüngliche Sitzung abgelaufen war.

Aus irgendeinem Grund warf ich einen Blick auf die Computeruhr des Benutzers und ... Überraschung! Seine Uhr war 3 Monate in der Zukunft! Ich wusste nicht, ob das etwas mit dem Fehler zu tun haben könnte, aber ich habe die Uhr repariert. Trotzdem hat es nicht funktioniert. Ich löschte alle Cookies. Immer noch nichts. Also habe ich den Browser neu gestartet - und dann fing es wieder an zu arbeiten!

Die nächste Information, die ich über dieses Problem erhielt, war Shimon Amits Antwort auf this question. Gut, jetzt weiß ich, dass die Uhr "Fehlkonfiguration" die Ursache ist. Das Problem ist ... Ich kann nicht die Computeruhr jedes Kunden unter Kontrolle halten. Einige von ihnen haben möglicherweise ihre Computeruhren in der Zukunft eingestellt.

Meine Frage: Gibt es dafür eine Lösung? Irgendein Trick? Ich möchte nicht, dass Kunden solchen Fehlern gegenüberstehen, weil sie sie "lahm" finden und ihr Vertrauen in die Anwendung brechen, obwohl es nicht wirklich meine Schuld ist (in gewissem Sinne).

+7

Ich denke nicht, es ist unangemessen zu erwarten, dass die Uhr eines Benutzers relativ genau ist. vielleicht nicht auf den zweiten, aber 3 Monate sind ziemlich lächerlich. Nicht so verrückt wie 20 Jahre in der Vergangenheit. –

+0

stimme ich absolut zu. Leider werden die Benutzer ME beschuldigen, wenn die Anwendung aufhört zu arbeiten und schließlich werde ich Zeit mit der Analyse des Fehlers verschwenden müssen - wenn es in der fernen Zukunft passiert, kann ich diesen "Bug" vergessen haben und tagelang versuchen, es herauszufinden. Also suche ich nicht wirklich nach einer echten Lösung, sondern versuche nur, die Anwendung stupid-proof zu machen. – Bizarro

Antwort

2

Sie können das Sitzungszeitlimit zu einem späteren Zeitpunkt verlängern. Vielleicht können Sie Cookies verwenden, die nicht ablaufen (Sitzungen sind auf der Client-Seite mit Cookies verbunden). Ansonsten arbeitet der Browser Ihres Kunden nur so, wie es vorgesehen ist.

EDIT: Javascript Option

Dies ist ein Gesamt Hack, aber Sie könnten Sie Javascript verwenden, um die aktuelle Uhrzeit auf dem Client-Rechner zu bekommen und es zurück an den Server sendet, dann das Timeout auf dem Session-Cookie einstellen drei Monate danach auslaufen. Siehe http://www.w3schools.com/jsref/jsref_gettime.asp

Sobald Sie die Clientzeit abgerufen haben, können Sie den Sitzungsablauf mit session_cache_expire() zurücksetzen.

http://www.php.net/manual/en/function.session-cache-expire.php

EDIT: 100% Server Side Option

Eine weitere Option, die ich dachte, der ohne Ablauf einen Session-Cookie zu setzen, würde aber die Zeit der Cookie verfolgt auf dem Server festgelegt wurde, sagen sie in einem MySQL-Tabelle. Sie müssen auch die letzte Aktivität verfolgen. Wenn ein angemeldeter Benutzer eine Anfrage stellt, können Sie die Startzeit der Sitzung und die letzte Aktivität überprüfen. Wenn die aktuelle Zeit für eine dieser beiden Optionen die zulässige Zeitüberschreitung überschreitet, löschen Sie die Session-Server-Seite und bringen Sie sie auf die Anmeldeseite zurück. Wenn die Sitzung noch in Ordnung ist, aktualisieren Sie die letzte Aktivität, die diesem Benutzer zugeordnet ist, damit Sie die nächste Anfrage vergleichen können. Kein clientseitiger Code notwendig.

+0

OK ... also werde ich die gleiche Frage stellen wie ich zu Sammitch gemacht habe: Gibt es eine Möglichkeit, das Datum des Browsers ohne Javascript zu erfassen? – Bizarro

+0

Ich bin mir einer Nicht-Javascript-Lösung nicht bewusst. Ich habe in der letzten halben Stunde im Internet gesucht und konnte nichts finden. Ich denke, dass Sie in der Lage sein könnten, ein nicht auslaufendes Cookie zu verwenden und es Server-Seite zu behandeln. Ich werde meine Antwort bearbeiten und erklären. –

+0

@Bizarro Ich habe meine Antwort geändert, um Ihrem Problem eine vollständige serverseitige Lösung hinzuzufügen. Vielen Dank! Dieser hat mich zum Nachdenken gebracht! :) –

-1

Versuchen Sie, das Sitzungszeitlimit zu deaktivieren oder zumindest weit in die Zukunft zu setzen. Das sollte den Trick machen.

5

Sitzungscookies (wie alle Cookies) werden kontrolliert und gelöscht, wenn sie vom Clientbrowser abgelaufen sind. Selbst wenn Sie ein weit auslaufendes Verfallsdatum setzen (was Sie ohnehin nicht tun möchten), muss der Client seine Uhr nur noch weiter vorwärts bewegen und sie wird ablaufen.

1

Irgendwelche Tricks?

Verwenden Sie Session-Cookies. Keine Sitzung im Sinne von PHP-Sitzungen, sondern Browsersitzung. Session cookies werden gespeichert, bis der Benutzer den Browser schließt. Sie sind immun gegenüber welcher Uhr auch immer der Benutzer ihren Computer eingestellt hat. Sie dauern bis der Browser geschlossen ist.

Dies ist normalerweise für PHP-Session-bezogene Cookies geeignet.

Für PHP benötigen Sie, dass die Session-Cookie-Parameter Lebensdauer 0, bevor die Sitzung beginnt ist so konfiguriert, um sicherzustellen. Das ist entweder die Ini-Einstellung session.cookie_lifetime oder durch Aufruf der session_set_cookie_params Funktion.

Eine genauere Beschreibung der Cookie-Parameter finden Sie in der Dokumentation der Funktion setcookie.

Zweiter Teil des Trick besteht darin, dass Sie eine Session-Start-Zeitstempel und eine letzte Aktivität Zeitstempel in die PHP $_SESSION platzieren. Diese sind serverbasiert, haben also immer die gleiche Basis.

Überprüfen Sie sie, z.B. Wenn die Sitzung zu alt ist, die letzte Aktivität zu lange zurückliegt usw., zerstören Sie die Sitzung und zwingen Sie den Benutzer, sich erneut anzumelden.

Man könnte sogar diesen zweiten Teil des Tricks verwenden Sie es mit einem Cookie zu kombinieren, es ist Ablauf 10 Jahre in der Zukunft (okay, Browser möglicherweise nicht wie das, vielleicht haben Sie nur wollen, um Ihre 3 Monate) hat.

+0

Ich muss gestehen, dass mein Sitzungswissen ziemlich schlecht ist. Ich müsste Ihre Post sorgfältig studieren, aber ich kann schon sagen, dass diese Lösung "sauberer" (oder "korrekter") aussieht als meine eigene Herangehensweise. Der einzige persönliche Nachteil ist, dass ich Teile meiner Bewerbung neu schreiben müsste - das wäre zeitaufwendig. – Bizarro

+0

Nun, der erste Teil ist eigentlich PHP-Konfiguration (und 0 der Standardwert). Der zweite Teil ist zusätzlich, aber im Allgemeinen ist es gut, dass die Sitzungen nicht ewig dauern. Wenn Sie diese Zeiten verfolgen, können Sie mehr tun, nicht nur das Problem in Ihrer Frage lösen, sondern auch Sitzungen nach einiger Zeit der Inaktivität oder allgemeinen Sitzung schließen Daher müssen sich die Benutzer aus Sicherheitsgründen erneut anmelden. – hakre

2

Ich stimme dem Kommentar von @ MarcB voll und ganz zu, dass Sie keine Verantwortung dafür übernehmen können, wie grob falsch konfiguriert der Computer eines Benutzers sein könnte. Wenn Sie wirklich einen Unterschied in dieser Hinsicht machen wollen, würde ich vorschlagen, PHP zu verwenden, um ein kleines Schnipsel von Javascript auszugeben, das die Zeit auf dem Server einschließt. Das Snippet vergleicht diese Uhrzeit mit der Zeit auf dem Clientcomputer und löst eine Warnung aus, wenn die Zeit um mehr als X vom Server abweicht. [sagen, 24 Stunden oder so]

+0

Ich mag das ... der einzige Punkt ist: Ich versuche, die Anwendung so zu entwickeln, dass sie mit oder ohne Javascript funktioniert. Wäre es möglich, die gleiche Überprüfung auf der Serverseite durchzuführen, vielleicht das Datum des Browsers? Ist es überhaupt möglich? – Bizarro

+0

Soweit ich weiß, senden Browser keine Zeitstempel mit HTTP-Anfragen, so dass die einzige Möglichkeit, die auf dem Client-PC eingestellte Zeit zu bestimmen, irgendeine Art von clientseitigem Code wäre, nämlich: JavaScript. Im Ernst, ich würde mich nicht einmal darum kümmern. Wenn die Uhr des Kunden um mehr als 5 Minuten/2 Stunden/24 Stunden abgelaufen ist, wird es immer mehr Probleme mit mehr als nur einer Website geben. – Sammitch

+0

Ich habe etwas recherchiert und die Variable $ _SERVER ['REQUEST_TIME'] gefunden. Es scheint richtig zu funktionieren, deshalb werde ich einen Datumsvergleich zwischen $ _SERVER ['REQUEST_TIME'] und der Serverzeit einbetten. Wenn der Unterschied größer als 30 Minuten ist, kann sich der Benutzer nicht anmelden. Ja, ich werde das Radikal sein :-) – Bizarro