Hallo allerseits,
nach umfangreicher Problemanalyse nun eine Zusammenfassung meiner "Nöte". Leider habe ich im Internet keinen Präzedenzfall gefunden. Hier mal die Bedingungen:
Ich habe 2 kleinere Systeme mit PHP und MySQL erstellt, die ihren Einsatz in der Forschung finden. Das 1. Script verwaltet Bücher, Zeitschriften und Publikationen eines kleinen Archivs, das 2. Script verwaltet chemische Rezepturen.
Beide Systeme verfügen über eine Loginroutine, die es erlauben einzuloggen und Änderungen am Datenbestand vorzunehmen. Dazu benutze ich jeweils eine eigene Benutzertabelle und eine eigene Datensatztabelle im Hintergrund (mySQL).
Beide Systeme verwenden Sessions, um die Benutzerdaten (Benutzername, Benutzerrang und ein Securityflag) im Speicher zu halten. Der Vollständigkeit halber hier ein kurzer Auszug:
Diese Passage ist in beiden Systemen gleich.
Beide Systeme sind auf der selben Domain installiert. Also so:
http://www.meinedomain.xyz/system_A
http://www.meinedomain.xyz/system_B
Nun das eigentliche Problem, das mir erst gestern zufällig aufgefallen ist:
Wenn ich mich in System A einlogge, öffne ein 2. Fenster und rufe im Browser System B auf, dann bin ich dort ebenfalls eingeloggt ohne mich dort je mit username/passwort angemeldet zu haben. Mir war schnell klar, dass beide Systeme in diesem Moment in der gleichen Session arbeiten und sich das Array $_SESSION teilen. Klassischer Fall von SESSION hijacking, aber eher unbeabsichtig. Das wird wohl bedingt durch das session_start() am Anfang meiner Scripte, das ein Fortsetzen der jeweils aktuellen Session bewirkt.
Nun die Frage: Wie bekomme ich das abgestellt und stelle sicher, dass sich die Systeme nicht in die Quere kommen, sofern sie gemeinsam laufen?
Folgende Denkanstöße habe ich bereits via google gefunden:
[list=1][*]Einen Session_name setzen
=> Ist das denn sicher? Wie verhält sich das, wenn ein Programm auf der selben Domain den selben Sessionname hat?
[*]Ein eindeutige Variable in das $_SESSION Array einbauen und bei jedem Scriptaufruf testen, ob diese vorhanden ist. In der Art
=> Kommt mir sehr improvisiert vor.
[*]Gänzlich auf Sessions verzichten und auf globale Variablen&mySQL ausweichen.
=> Schlecht für die Modularität
[*]ein Prefix für jede Variable eines Programms wählen
=> immer noch keine saubere Trennung im Array $_SESSION.[/list=1]
Ich bin unschlüssig, was da die praktikabelste Lösung ist bzw. was überhaupt sinnvoll ist. Es wäre nett, wenn sich da jemand äußert, der sich mit der Problematik auskennt. Bin sicher da gibt es eine "anständige" Vorgehensweise. Danke schonmal!
Beste Grüße
Daniel
PS. Ich habe diese Frage in keinem anderen Forum gestellt.
nach umfangreicher Problemanalyse nun eine Zusammenfassung meiner "Nöte". Leider habe ich im Internet keinen Präzedenzfall gefunden. Hier mal die Bedingungen:
Ich habe 2 kleinere Systeme mit PHP und MySQL erstellt, die ihren Einsatz in der Forschung finden. Das 1. Script verwaltet Bücher, Zeitschriften und Publikationen eines kleinen Archivs, das 2. Script verwaltet chemische Rezepturen.
Beide Systeme verfügen über eine Loginroutine, die es erlauben einzuloggen und Änderungen am Datenbestand vorzunehmen. Dazu benutze ich jeweils eine eigene Benutzertabelle und eine eigene Datensatztabelle im Hintergrund (mySQL).
Beide Systeme verwenden Sessions, um die Benutzerdaten (Benutzername, Benutzerrang und ein Securityflag) im Speicher zu halten. Der Vollständigkeit halber hier ein kurzer Auszug:
PHP-Code:
... Hier kommt die ganze Abfrage in Mysql mit username usw...
if ($result['passwort'] == md5($_POST['passwort']) ) {
$_SESSION['username'] = $result['email'];
$_SESSION['user_status'] = $result['status'];
$_SESSION['angemeldet'] = true;
}
Beide Systeme sind auf der selben Domain installiert. Also so:
http://www.meinedomain.xyz/system_A
http://www.meinedomain.xyz/system_B
Nun das eigentliche Problem, das mir erst gestern zufällig aufgefallen ist:
Wenn ich mich in System A einlogge, öffne ein 2. Fenster und rufe im Browser System B auf, dann bin ich dort ebenfalls eingeloggt ohne mich dort je mit username/passwort angemeldet zu haben. Mir war schnell klar, dass beide Systeme in diesem Moment in der gleichen Session arbeiten und sich das Array $_SESSION teilen. Klassischer Fall von SESSION hijacking, aber eher unbeabsichtig. Das wird wohl bedingt durch das session_start() am Anfang meiner Scripte, das ein Fortsetzen der jeweils aktuellen Session bewirkt.
Nun die Frage: Wie bekomme ich das abgestellt und stelle sicher, dass sich die Systeme nicht in die Quere kommen, sofern sie gemeinsam laufen?
Folgende Denkanstöße habe ich bereits via google gefunden:
[list=1][*]Einen Session_name setzen
=> Ist das denn sicher? Wie verhält sich das, wenn ein Programm auf der selben Domain den selben Sessionname hat?
[*]Ein eindeutige Variable in das $_SESSION Array einbauen und bei jedem Scriptaufruf testen, ob diese vorhanden ist. In der Art
PHP-Code:
$_SESSION['rezeptesystem'] = true;
[*]Gänzlich auf Sessions verzichten und auf globale Variablen&mySQL ausweichen.
=> Schlecht für die Modularität
[*]ein Prefix für jede Variable eines Programms wählen
PHP-Code:
$_SESSION['rezeptesystem_username'] = .... ;
$_SESSION['rezeptesystem_user_status'] = .... ;
$_SESSION['rezeptsystem_angemeldet'] = true;
Ich bin unschlüssig, was da die praktikabelste Lösung ist bzw. was überhaupt sinnvoll ist. Es wäre nett, wenn sich da jemand äußert, der sich mit der Problematik auskennt. Bin sicher da gibt es eine "anständige" Vorgehensweise. Danke schonmal!
Beste Grüße
Daniel
PS. Ich habe diese Frage in keinem anderen Forum gestellt.
Kommentar