PHP Session: Sicherheitsfrage



  • hallo leute

    ich wollte fragen ob mich folgende lösung bei punkto sicherheit mit session/login unterstützt?

    <?php  
    	session_start();  
    	if(!isset($_SESSION["session_id"]) || $_SESSION["session_ip"] != GetIPAddress())  
    	{  
    		header("Location: login_needed.php");  
    	}  
    ?>
    

    diesen code habe ich bei jeder datei als include stehen, die nicht ohne korrekes login sichtbar sein bzw. nutzbar sein sollte. meine zwei fragen sind nun wie folgt:

    a) ist es ein sicherer check, das der benutzer wirklich legal eingeloggt sein muss, bevor er einen memberbereich einsehen/nutzen kann?

    b) die überprüfung im beispiel von der session ID, das überhaupt eine existiert und das die IP adresse des derzeit aufrufenden mit der ip adresse des session erzeugers übereinstimmt, ist das eine gute lösung und eine lösung die so überhaupt funktioniert und sinn macht?

    besten dank 🕶



  • über eine ip können viele kommen.

    es fehlt übrigens ein exit nach header.



  • wie meinst du das? ip adressen sind doch einmalig zugewiesen? und warum das exit? hab noch nicht so viel ahnung von php, komme eher aus der C++ welt 😉



  • ohne exit würde ein eventuell später im code existierender header geparst.

    keine ahnung, was du sichern willst, und wie genau, aber im allgemeinen können viele menschen (rechner.. ) über ein ip ins netz, zum bleistift könnten an meinem mini lan hier alleine 6 leute rein, wenn ich das wlan anmache, dann der ganze häuserblock (so ich nicht absichere 😉 ) und so weiter..



  • ps:

    aber ich sichere ein login auch durch ip, dann durch browserkennung, durch eine eindeutige sessionid und zeitnahme ab.
    vergiss das exit nicht.



  • hi
    kannst du uns mal dafür ein bsp. geben?

    Bei mir lief das nämlich immer sehr simple ab und ich vertrau dem ding net so ganz bzw. wenn ich ehrlich bin hab ich davon mal überhaupt keine Ahnung.
    Ich hab ne Sessionvarialbe eingelogt angelegt und im loginscript gesetzt mit

    $_SESSION[eingelogt] = true;
    

    die abfrage sah dann so aus

    if($_SESSION[eingelogt]){}
    


  • Der gezeigte Code ist unsicher. Alles, was du erkennst, ist, ob derjenige eingeloggt ist. Ob das aber autorisiert ist, ist eine ganz andere Frage!

    Obiges Codeschnipsel ist ohne Probleme über diverse Sicherheitslücken zu umgehen. Session Hijacking, Cookie-Entführung über XSS etc. Willst du wirklich sicher sein, musst du nicht bei jeder Seite die geschützt werden soll erneut prüfen, ob der Benutzer eingeloggt ist, sondern du musst das Login auch neu authentifizieren! Sonst wird die Session entführt oder nachgebildet und deine Sicherheit ist hinüber.

    EDIT:
    @eiskalt: Du weißt schon, dass deine Arrayindizes in Hochkommata oder Anführungszeichen gehören?



  • Reyx schrieb:

    ... das Login auch neu authentifizieren!

    und das bedeutet...?



  • ich würd das so interpretieren:
    Beim Login überprüfst du Browser IP etc. etc. und speicherst das irgendwo.
    und bei jedem mal wenn der Benutzer was auf der Seite macht prüfst du ob sich da was geändert hat und wenn ja wirfst du ihn raus.

    Lieg ich da richtig?



  • Vermutlich schon, ja.

    Man sollte halt nicht nur prüfen, ob der Benutzer authentifiziert ist (eine Session-ID kann man erraten), sondern auch Anhand von bestimmten Werten prüfen, ob sich da etwas geändert hat.

    Ein Beispiel wäre z.B. eine Zufallsequenz: Bei jeder Abfrage wird der nächste Wert der Sequenz generiert und gut verschlüsselt beim Anwender sowie im Server gespeichert. Bei der nächsten Anfrage wird dann der Wert des Anwenders wieder ausgelesen, entschlüsselt und mit dem gespeicherten verglichen. Ist der Wert gleich, wird der Zugriff authorisiert und der nächste Wert der Sequenz generiert. Ansonsten: Zugriff verweigern.

    Dies ist aber natürlich nur eine Möglichkeit von vielen 😉



  • Dabei sollte man stets die erwartete Besucherzahl bzw. Nutzerzahl berücksichtigen, denn umfangreiche Aktionen, die die Sicherheit gewährleisten sollen, brauchen auch ihre Zeit.



  • hi alle nochmals. eine erweiterte frage kurz zum thema. wie sicher ist folgender code eigentlich:

    if(!isset($_SESSION["session_id"]) || $_SESSION["session_ip"] != GetIPAddress())  
    	{  
    		header("Location: login.php");
    		exit;  
    	}
    

    wenn dieser am anfang der seite steht, die man nur dann benutzen darf wenn man eingeloggt ist. also ist es immer 100% sicher das der obige code einen verweis auf login.php macht wenn die daten session_id oder session_ip nicht stimmen? oder gibt es da tricks/hacks die ich noch nicht kenne um selbst sowas zu umgehen, also speziell jetzt nur diesen prozess? unabhängig davon das man den code zur login ¨berprüfung noch erweitern sollte.



  • Benutzt du ausschließlich die IP des Benutzers, um zu überprüfen, ob er eingeloggt ist? Das wird mit der Zeit krachen, wenn du Benutzer hast, die über Proxies surfen - Ob willentlich oder gezwungen, wie z.B. bei AOL. Du solltest - wenn überhaupt - nur das IP-Subnetz prüfen (also nicht w.x.y.z sondern nur w.x.y).

    Ansonsten sollte der Code so relativ dicht sein - Aber wie gesagt, es kommt auf das "Drum herum" an. Wie validierst du die Daten des Users, wenn er sich einlogg? Wie sicherst du dein Cookie/deine Sessiondaten? Und und und. Eine einzelne Abfrage an sich ist schnell gemacht, aber ein System ist maximal so sicher, wie die schwächste Abfrage, die es in ihm gibt 😉


Anmelden zum Antworten