vielleicht ist euch das folgende Problem ja bekannt, falls nicht, werdet
ihr es nach meinen Erläuterungen haben ;-)
Sessions erhalten eine (möglichst) eindeutige SessionID. Diese SessionID
muss bei Aufruf eines PHP-Skripts übergeben werden, entweder per Cookie /
GET/POST-Parameter / URL-rewrite. Probleme treten auf, wenn ein User sich
eine Seite ansieht, dann (im IE, NS?) STRG+N drückt, also eine neue
Browserinstanz (=BI) öffnet und dort weiternavigiert. Beide Instanzen
laufen nun unter der selben SessionID ab, was meiner Meinung nach unter
Umständen zu Problemen führen kann, als Beispiel:
- Sei formular.php eine Datei, die ein Eingabeformular, verteilt über 3
Seiten, darstellen soll, die bsplsweise folgende 5 Zustände hat:
1. Seite 1 des Formulares anzeigen
2. Seite 2 des Formulares anzeigen
3. Seite 3 des Formulares anzeigen
4. Allgemeinen Fehler anzeigen ("Sie müssen Feld X ausfüllen")
5. Abschlussseite ("Vielen Dank für die Eingaben")
- der Programmierer möchte die Eingabedaten des Benutzers in
Sessionvariablen speichern, solange noch nicht alle 3 Seiten eingegeben
wurden. Erst, wenn alle benötigten Daten vorhanden sind, wird die
Datenbank-Einfüge-Operation ausgeführt
Einen Konflikt gibt es, falls folgende Situation auftritt:
- Benutzer A ruft [1] (=formular.php im Zustand 1) auf, gibt dort seine
Daten ein und klickt auf Abschicken
- formular.php speichert die eingegebenen Daten in Session-Variablen ab und
liefert A [2] zurück
- A füllt die 2. Seite aus und klickt auf Abschicken
- formular.php speichert die eingegebenen Daten in sessvars ab und liefert
A [3] zurück
- A drückt STRG+N, öffnet also eine neue Browser-Instanz (BI2) mit
_derselben_ SessionID wie die bereits laufende Browserinstanz (BI1)
- A wechselt in BI1 zurück zu [1], ändert dort seine Daten, geht dann
Zustände [2], [3], [5] durch, hat also alles ausgefüllt und ist fertig,
formular.php löscht im Zustand [5] alle Session-Variablen, da sie ja nicht
mehr benötigt werden
- wir erinnern uns: BI2 ist im Zustand [3], der Benutzer füllt das Formular
nochmals aus, schickt es ab... und jetzt? Normalerweise sollte er zu [5]
kommen, allerdings kommt er zu [4] mit dem Hinweis, alle Daten vollständig
einzutragen, diese fehlen jedoch aus [1] und [2], da in BI1 die sessvars
alle gelöscht wurden
Das ist jetzt noch kein kritisches Problem, ärgerlich wird es jedoch, wenn
man Session-Variablen benutzt, um Zustände (so etwas wie "Kunde hat Zahlung
vorgenommen") speichert, dies könnte meines Erachtens sogar u.U. zum
Sicherheitsproblem werden.
Ich wurde in einem früheren Posting bereits darauf hingewiesen, dass man
eine Art "One-Time-Session-ID" (OTSID) einführen müsste. Eine ID, die sich
von Seitenaufruf zu Seitenaufruf ändert. Ich habe mir jetzt folgendes
ausgedacht, mit der Bitte, diese Idee zu beurteilen:
Ziel: Einführung einer OTSID
Weg : Erweiterung der SID um die OTSID. Sei SID ein md5()-Wert, OTSID
ebenfalls, die neue SID besteht somit aus 32 Zeichen fester SID und 32
Zeichen von Seite zu Seite sich ändernder OTSID
Pseudo-Befehle stehen in eckigen Klammer []:
session_register('sess_otsid'); // OTSID als sessvar registrieren
[SID und OTSID trennen]
if ($sess_otsid != $OTSID) {
// neue Browserinstanz / page reload / back-button?
[neue Session (im herkömmlichen Sinne) anlegen]
[alle sessvars dieser Session in die neue kopieren]
[die neue Session als aktive Session für diese BI festlegen]
}
sess_otsid = md5(...); // neue OTSID bilden
[SID und OTSID wieder zu einer ID verknüpfen]
Probleme wird es leider geben bei:
- Frames
- URL-rewrite
- ???
Vielleicht hat ja jemand eine andere Lösung / Idee bereit?
Mit Bitte um Kommentar.
Grüße,
Marcel
> - wir erinnern uns: BI2 ist im Zustand [3], der Benutzer füllt das
> Formular nochmals aus, schickt es ab... und jetzt? Normalerweise
> sollte er zu [5] kommen, allerdings kommt er zu [4] mit dem Hinweis,
> alle Daten vollständig einzutragen, diese fehlen jedoch aus [1] und
> [2], da in BI1 die sessvars alle gelöscht wurden
Warum willst Du die Session-Variablen löschen? Du kannst zusätzlich eine
Session-Variable anlegen, der Du entnehmen kannst, das das Formular
bereits erfolgreich abgeschickt wurde und auf einen erneuten Versuch
entsprechend reagieren. Eine zusätzliche, nach einmaliger Übermittlung
verfallende ID bringt Dir hier keine Vorteile
> Das ist jetzt noch kein kritisches Problem, ärgerlich wird es jedoch,
> wenn man Session-Variablen benutzt, um Zustände (so etwas wie
> "Kunde hat Zahlung vorgenommen") speichert, dies könnte meines
> Erachtens sogar u.U. zum Sicherheitsproblem werden.
Nur, wenn Du auch hier wieder auf die komische Idee kommst, die
Sessionvariablen nach erfolgreichem Abschluss des Vorgangs zu löschen.
Ansonsten wirst Du in einer Sessionvariable den erfolgreichen
Zahlungsstatus ablegen und beim Versuch einer nochmaligen Übermittlung
dem User sagen, das die Zahlung bereits erfolgt ist.
Guido Haeger
Ja, das stimmt allerdings. Aber gibt es wirklich keine Situation, die du
dir vorstellen könntest, wo Konflikte auftreten könnten?
Grüße,
Marcel