PHP Dokument erloschen. Lösungsvorschläge

Don_SyStEmS

Cadet 3rd Year
Registriert
Juni 2009
Beiträge
53
Hallo,

ich habe eine kleine Website programmiert bei der man sich auch einloggen kann.

Loggt man sich aus und geht zweimal im Browser zurück kommt der Dokument Erloschen-Fehler. Drückt man dann F5 muss man das erneute Senden der Daten bestätigen und man ist wieder eingeloggt.

Ich hatte mir jetzt überlegt das Problem zu lösen indem ich die UserID verschlüsselt per GET-Parameter an das Logout-Script (logout.php) weitergebe und beim Wiederaufruf soll der User eingeloggt werden, falls er das noch nicht war.

Klingt zwar komisch, sollte das Problem aber aus der Welt schaffen.

Nur weiß ich nicht genau wie ein solch verschlüsselter Code aussehen soll.
MD5 wollte ich nicht nutzen, und andere Algorithmen kenne ich nicht die mir einen verschlüsselten Code liefern.

Hier bei Computerbase wird das auch so ähnlich gelöst, zumindest gibt es beim Ausloggen auch einen solchen Code.

Ich hoffe dass ihr mir einen besseren Lösungsvorschlag geben könnt.

Gruß
 
Aktuell wird nur folgendes beim Logout ausgeführt:
PHP:
$_SESSION=array();
Ist session_unset(); auch notwendig?

EDIT: Füge ich session_unset(); in das Logout-Script ein, dann kommt der Dokument Erloschen-Fehler schon nach dem ersten Zurückgehen im Browser.
 
Zuletzt bearbeitet:
Ich habe das nur selbst von einer Webseite. Eigentlich reicht einer der Befehle da quasi das selbe dabei herauskommt.

Bist du denn irklich wieder angemeldet oder wird dir nur angezeigt, dass du angemeldet wärst? Sprich wenn du dann eine Aktion ausführt für das du eine Sessionvariable bräuchtest, klappt das dann?

Gehst du zufälligerweise mit dem 2x zurück auf die Loginseite zurück und der Browser leitet dann die Logindaten nochmal ans Formular und loggt dich erneut an oder wird einfach nur eine zuvor gespeicherte Seite ausgegeben und der Server loggt dich eigentlich nicht erneut ein?

kannst ja dann man abfragen lassen was in deiner Session steht. ( Oder ob es die halt nicht mehr gibt. ) In dem Fall vielleicht einfach prüfen ob eine Session noch exisitert?
 
Wenn man das absenden der Daten bestätigt, dann müsste doch das ausgefüllte Login-Formular abgeschickt werden. Ergo: Wäre logisch, wenn man (nach dem absenden des Login-Requests) wieder eingeloggt wäre.
 
Suxxess schrieb:
Bist du denn irklich wieder angemeldet oder wird dir nur angezeigt, dass du angemeldet wärst? Sprich wenn du dann eine Aktion ausführt für das du eine Sessionvariable bräuchtest, klappt das dann?
Ja, danach bin ich wieder angemeldet. Wenn ich aber nach dem Einloggen und vor dem Ausloggen ein anderes Formular absende (z.b. die Suche) erscheint wieder der Dokument Erloschen-Fehler, jedoch bin ich dann nach dem erneuten Absenden der Daten nicht mehr eingeloggt.
Anscheinend wird nur das zuletzt abgesendete Formular erneut abgesendet.

Suxxess schrieb:
Gehst du zufälligerweise mit dem 2x zurück auf die Loginseite zurück und der Browser leitet dann die Logindaten nochmal ans Formular und loggt dich erneut an oder wird einfach nur eine zuvor gespeicherte Seite ausgegeben und der Server loggt dich eigentlich nicht erneut ein?
Das hängt vom zuletzt abgesendeten Formular ab.
Gerade getestet: Das mit dem zweimal zurück gehen ist Quatsch. Der Fehler erscheint immer dann wenn ich ein zuletzt abgesendetes Formular durch zurückgehen erreiche.
Suxxess schrieb:
kannst ja dann man abfragen lassen was in deiner Session steht. ( Oder ob es die halt nicht mehr gibt. ) In dem Fall vielleicht einfach prüfen ob eine Session noch exisitert?
Ich habe den Code jetzt etwas abgeändert.
$_SESSION = array(); wird jetzt nur noch ausgeführt wenn der Benutzer vorher eingeloggt war.
Außerdem kommt man jetzt nach dem Einloggen zurück auf die Startseite anstatt auf die Seite auf der man sich ausgeloggt hat.

voodoo44 schrieb:
Wäre logisch, wenn man (nach dem absenden des Login-Requests) wieder eingeloggt wäre.
Mir wäre es aber lieber wenn man sich wieder manuell einloggen muss anstatt einfach nur das erneute Absenden der Login-Informationen zu Bestätigen. Denn vor dem Absenden kommt der Dokument Erloschen-Fehler und diesen möchte ich nicht haben.
 
Zuletzt bearbeitet:
Don_SyStEmS schrieb:
Mir wäre es aber lieber wenn man sich wieder manuell einloggen muss anstatt einfach nur das erneute Absenden der Login-Informationen zu Bestätigen. Denn vor dem Absenden kommt der Dokument Erloschen-Fehler und diesen möchte ich nicht haben.
Aber wie willst du das denn verhindern? Wenn ich das Formular ausfülle, auf absenden klicke, dann bin ich eingeloggt. Das ist das gleiche, wie wenn ich F5 drücke und die Formulardaten neu abgeschickt werden.

Oder verstehe ich deine Anforderung/Frage gerade nicht?
 
Don_SyStEmS schrieb:
Gerade getestet: Das mit dem zweimal zurück gehen ist Quatsch. Der Fehler erscheint immer dann wenn ich ein zuletzt abgesendetes Formular durch zurückgehen erreiche.
Und das ist vollkommen normal. So verhalten sich HTTP POST Requests nun einmal. Das hat nichts mit PHP zu tun.

voodoo44 schrieb:
Aber wie willst du das denn verhindern? Wenn ich das Formular ausfülle, auf absenden klicke, dann bin ich eingeloggt. Das ist das gleiche, wie wenn ich F5 drücke und die Formulardaten neu abgeschickt werden.
Für das Problem mit Formular-Reloads gibt es sehr wohl Lösungen. Hier kann man z.B. mal bei Contao abgucken. Die Lösung dort ist zwar wirklich sehr restriktiv, funktioniert aber.
 
Nen CSRF-Token in das Anmeldeformular einbauen, das wird solche Replay-"Angriffe" unterbinden.
 
Don_SyStEmS schrieb:
Aktuell wird nur folgendes beim Logout ausgeführt:
PHP:
$_SESSION=array();
Ist session_unset(); auch notwendig?

EDIT: Füge ich session_unset(); in das Logout-Script ein, dann kommt der Dokument Erloschen-Fehler schon nach dem ersten Zurückgehen im Browser.

Mach mal session_destroy(). Das entfernt tatsächlich die Session und nicht nur die darin gespeicherten Daten.
 
session_destroy(); macht den Fehler leider auch nicht ungeschehen.

Inzwischen liegt der Fehler außerdem nicht mehr an dem Problem mit dem Ein- und Ausloggen (bzw. der SESSION) sondern ganz einfach an irgendeinem Formular welches man abgesendet hat und dann wieder per Zurückbutton dahin gelangt ist.

Ich glaube ich habe mich etwas falsch ausgedrückt.
Beim Zurückgehen kann ruhig das Fenster erscheinen bei dem man bestätigen muss, dass man die abgesendeten Daten erneut absendet. Das stört mich nicht.

Nur will nicht nicht, dass der Dokument Erloschen-Fehler kommt, der immer dann erscheint wenn man per Zurückgehen im Browser ein zuletzt abgesendetes Formular erreicht.
 
Don_SyStEmS schrieb:
Nur will nicht nicht, dass der Dokument Erloschen-Fehler kommt, der immer dann erscheint wenn man per Zurückgehen im Browser ein zuletzt abgesendetes Formular erreicht.

Das ist eine Browserfunktion für jeden POST-Request, das kannst du nicht ausschalten. Du kannst es nur umgehen, indem du kein POST mehr nutzt.
 
ice-breaker schrieb:
Das ist eine Browserfunktion für jeden POST-Request, das kannst du nicht ausschalten. Du kannst es nur umgehen, indem du kein POST mehr nutzt.
Kein POST ist auch keine Lösung. Erzähl hier nicht sowas, sonst fangen Leute noch an, Logins, Einkaufskörbe oder Zahlungsinformationen per GET zu übertragen...
 
Ich habe zum Test folgenden Header eingefügt:

PHP:
header("Cache-Control: max-age=600");

Und wie mir scheint ist der Fehler verschwunden. Ich hoffe dieser Befehl keine neuen Probleme herbeiruft.

Jetzt muss ich mich nur noch mit Cookies beschäftigen, damit mein User auch über einen längeren Zeitraum angemeldet bleiben kann und dann kann ich mich endlich dem Frontend zuwenden.
 
Zuletzt bearbeitet:
Das heißt doch effektiv nur, dass deine Seite nach 10 Minuten abgelaufen ist... was sie ja in Wahrheit wohl kaum sein dürfte. Damit erzeugst du nur unnötig Last bei Client und Server, aber weder Schutz noch Usability.

Nimm eine Lösung mit CSRF-Token, das ist der sinnvollste Weg.
 
Naja, Änderungen auf der Seite werden Nutzern dann erst nach 10 Minuten angezeigt, da der Browser nur alle 10 Minuten den Cache löscht und die Seite neu vom Server anfordert. Ist das ein Problem bei deiner Seite?
 
Nagut, die Zeile mit dem Header habe ich wieder auskommentiert.

Diesen CSRF-Token hatte ich bereits versucht und es hat den Fehler nicht behoben.

Ich habe die Dateien heruntergeladen (0.7.1) und auch korrekt installiert und konfiguriert.
Sollte der Token ungültig sein wird die session geleert und man wird auf die Startseite weitergeleitet.

Dennoch kommt der Dokument Erloschen-Fehler.
Jedoch ist man nach dem erneuten Absenden der Daten nicht mehr eingeloggt.
 
Das mit "Erloschen" ist gaaaaaaanz normales und korrektes Verhalten des HTTP-Protokolls in Verbindung mit POST-Übertragungen. Das wirst du nie lösen können. Bring deinen Usern bei, nach Übermittlung eines POST-Formulars nicht wie blöde auf Zurück zu drücken.
 
Auch wenn es kindisch klingt, "aber bei den anderen funktioniert es doch auch!" :D

Dann lass ich erst erstmal so.

Nebenbei habe ich noch ein paar andere Fragen:

1. Könnt ihr mir eine Seite empfehlen, die die Verwendung von Cookies gut erläutert? (englische Seiten wären auch wilkommen) Denn ich kenne mich nicht so gut aus und würde wahrscheinlich nur solche Seiten finden, dir mir Post #15 empfehlen, was ja eigentlich totaler Mist ist.

2. Wie wichtig ist valider HTML-Code? Also wie wichtig ist es, dass meine Seite keine Fehler bei validator.w3.org ausspuckt? Gibt das einen besseren Page-Rank?

3. Wie wichtig sind komprimierte JS- und CSS-Dateien? Auch hier, besserer Page-Rank?

4. Wie kann ich meine Seite auf ihre Sicherheit prüfen? Also PHP/MYSQL-Injection?

5. Was muss ich bei einer korrekten Validierung der PHP-Dateien beachten?

6. Dasselbe wie 1. nur ein guter Link der SEO gut erklärt? Auch hier habe ich gesucht und ne Menge Blog-Einträge gefunden, die ihre ach so tollen Methoden preisgeben, jedoch weiß ich nicht was etwas bringt und was nicht.

7. Bringt es performancemäßig mehr lieber ein paar Große Dateien zu includen (also am Anfang, z.b. die functions.php) oder lieber immer die Funktionen die gebraucht werden in die jeweilige Datei zu schreiben und dann nur die gemeinsamen Funktionen zu includen?
 
Zurück
Oben