2008-09-28 15 views
10

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.

Antwort

2

Ich weiß nicht, ob dies so eine Antwort ist wie es eine Arbeit ist. Ich habe nur auf Cookie-basierte Sitzungen umgeschaltet und alles funktioniert reibungslos.

3

Dies kann passieren, wenn Sie (oder diejenigen, die restful_authentication geschrieben haben) den aktuellen Benutzer in einer Klassenvariablen zwischenspeichern. Ich habe eine Reihe von Artikeln gesehen, in denen die Verwendung von "User.current_user" befürwortet wird, aber da Klassen über Anfragen hinweg zwischengespeichert werden, kann dies zu einem Tainting der Sitzung führen.

+0

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

+0

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

0

Ist diese Site remote? Loggen Sie sich auf zwei verschiedenen Computern im selben Netzwerk ein?

+0

Ich habe es sowohl lokal in der Entwicklung auf meinem Laptop als auch in der Produktion auf meinem Server laufen. Sie haben Recht bezüglich der 2 Konten im selben Netzwerk. Ich mache das jedoch in separaten Browsern auf separaten Rechnern. – Jared

Verwandte Themen