Ich verwende die aktuelle Version von restful_authentication, die auf Github gefunden wird, und ich habe eine Reihe von seltsamen Sitzungsprobleme. Der Server scheint Benutzern irgendwie Sitzungen zuzuweisen, die es nicht sein sollte. Dies geschieht nur beim Überschreiten der ausgeloggten/eingeloggten Sperre.Unerwartetes Session-Hijacking-Problem mit Restful-Authentifizierung
Hier ist ein Beispiel. Wenn keine Sitzungen auf dem Server aktiv sind, melde ich mich bei einem Benutzer A an. Auf einem anderen Computer logge ich mich mit Benutzer B ein. Wenn ich mich dann von Benutzer B abmelde, werde ich nach der Abmeldeumleitung eingeloggt sein Benutzer A. Von diesem Punkt aus kann ich weiter durch die Site navigieren, als ob ich mich als dieser Benutzer angemeldet hätte! Etwas, das ich über die Logs beobachtet habe, ist, dass die Sitzungs-IDs bei diesem Hijack nicht identisch sind. Benutzer A ist in beiden Sitzungen angemeldet, die Sitzungs-IDs unterscheiden sich jedoch vollständig. Dies ist nur ein Beispiel dafür, was passieren könnte. Ich kann das Problem nicht zuverlässig reproduzieren, da es scheinbar zufällig ist.
Es scheint nicht ein Symptom der Umgebung oder des Servers zu sein, auf dem es läuft. Ich kann das Problem reproduzieren, indem ich Mongrel und Passagier benutze. Ich habe es auch in Entwicklung und Produktion gesehen. Ich verwende db-basierte Sitzungen in dieser Anwendung und es läuft auf Rails 2.1.1. Ich habe die Stateful-Option beim Aufruf des Generators angewendet. Ansonsten wurden keine weiteren Änderungen an der Behandlung von Sitzungen vorgenommen.
Update Hier ist die problematische Methode, die direkt von restful_authentication kam.
Dies scheint eine plausible Antwort zu sein, aber ich konnte dieses Hijacking-Verhalten immer noch reproduzieren, nachdem ich den Speicher des current_user-Objekts aus dem Speicher in einer Cache-Variablen entfernt hatte. – Jared
Wenn Sie den aktuellen Benutzer in einer Klassenvariablen zwischenspeichern, müssen Sie sich daran erinnern, ihn vor jeder Anfrage zu bereinigen. Etwas wie: 'Vorher Filter: clean_user; before_filter: authenticate' – Arsen7