Cruz: sicherheit bei perl/cgi skript mit Anmeldefunktion

Beitrag lesen

Hallo steckl,

nachdem ich in den letzten 5 Jahren nach und nach ein ausgereiftes Session Handling entwickelt habe, habe ich hier noch ein paar Cent hinzuzufügen.

Dein grundsätzlicher Ansatz ist richtig, es wird überall so gemacht. Deine Funktion eine Session ID zu generieren sieht für mich grundsätzlich OK aus. Mach doch mal den ultimativen Test und generiere so schnell es geht hintereinander 1 Million Session IDs und schreib sie in eine mysql Tabelle. Du kriegst dann erstmal ein Gefühl für die Performance und danach machst du noch ein SELECT DISTINCT um festzustellen, ob wirklich alle 1 Million IDs unterschiedlich geworden sind. Wenn die Routine diesen Test besteht, ist sie m.E. nach ausreichend sicher.

Fuer die SID wird jetzt ein SID-File auf dem Server angelegt. Hier steht u.a. die USER-ID und die Gruppen-ID. Alle Scripts lesen jetzt hier die User-Daten aus und ueberpruefen wenn noetig ob der User Zugriffsrechte fuer die anzuzeigenden Datensaetze hat.

Wie jetzt. Für jede einzelne Session legst du eine eigene Datei an? Also das würde ich nicht so machen. Es erscheint mir unhandlich und seeehr langsam. Legt doch lieber eine mysql Tabelle für die Sessions an, oder noch besser, benutze BerkleyDB. Schau dir mal das DB_File Perl Modul an. Man kann damit einen Hash an eine BerkleyDB Datei "tie"-en. Das ist sehr elegant zu handhaben, ratten schnell und als Bonus wird deine Sessionverwaltung auch noch unabhängig von einer Datenbank (als Vergleich zu der mysql Lösung).

Jetzt wuerde mich folgendes interessieren:

  • ist das Loesungskonzept einigermassen sicher?

Einigermassen. Es wäre noch sinnvoll zumindest die IP Adresse des Clients mit der Session abzuspeichern. Wenn sich die IP Adresse während der Session ändert, ist das ein Zeichen für ein Session Hijacking Versuch. Dann solltest du die Session zerstören und den User neu einloggen lassen.

  • Waere es ein Sicherheitsrisiko, die Login-Daten und/oder die SID in Cookies abzuspeichern?

Nein ganz im Gegenteil. Du kannst ein Cookie verwenden, um die Sicherheit noch weiter zu erhöhen. Hast du bei einem eingeloggten User erfolgreich die Session ID in einen Cookie schreiben können und stimmt irgendwann die Session ID im Cookie nicht mit der im URL (bzw. per POST) übergebenen Session ID überein, ist irgendwas faul und du solltest die Session ausloggen.

  • ist die SID eindeutig, bzw. nicht von aussen nachvollziehbar oder leicht knackbar?

Jemand könnte Versuchen selbst so eine Session ID zu generieren und hoffen dass er eine erwischt, die gerade aktiv ist. So ein jemand sollte aber lieber Lotto spielen, da sind seine Chancen auf Gewinn wesentlich höher. Viel einfacher könnte sich jemand eine aktive Session ID ersniffen und sich damit an deine Seite wenden und somit eine Session effektiv klauen (Session Hijacking). Dagegen helfen die oben beschriebenen Methoden ein wenig, wobei aber ein guter Hijacker locker auch den Cookie vorgaukeln und auch eine passende IP Adresse vortäuschen kann. Dagegen hilft nur noch eine SSL Verschlüsselung über die gesamte Sitzung hinweg, aber das brauchst du wirklich erst wenn es so richgtig um Geld geht.

Gruß,
Cruz