WiMu: IP-Addresse als session_name()

Hallöle,

ich bin gerade dabei, ein kleines login-script zu schreiben. Nun hatte ich die Idee, man könne doch einfach die gehashte IP-Addresse als Session-Namen verwenden um sicherzugehen, dass das Sitzungs-cookie nur für einen einzigen Rechner gültig ist. Also ungefähr so:

  
$hash   = 'md5';  
$iphash = hash ( $hash,  $_SERVER['REMOTE_ADDR'] );  
session_name( $iphash );  
session_start();  
// usw.  

Funktionieren tut's bis jetzt prima; aber leider bin ich kein Sicherheitsexperte und wüsste gerne, ob das grober Unfug ist, was ich da treibe ...

Danke und Grüße,

WiMu

  1. Hi,

    ich bin gerade dabei, ein kleines login-script zu schreiben. Nun hatte ich die Idee, man könne doch einfach die gehashte IP-Addresse als Session-Namen verwenden um sicherzugehen, dass das Sitzungs-cookie nur für einen einzigen Rechner gültig ist.

    das ist dann ein Denkfehler. Dann würden sich bei dir alle Studenten und Mitarbeiter einer Uni, die über denselben Router nach draußen gehen, eine Session teilen. Oder Tausende von Angestellten eines mittelgroßen Unternehmens.

    Andererseits hätten die Kunden mancher Internet-Provider wie z.B. AOL bei dir keine Chance, überhaupt mal eine Session fortzuführen, denn bei ihnen wird fast jeder Request über einen anderen zufällig zugeteilten Proxy geleitet; die IP, mit der der Request bei dir aufschlägt, ändert sich permanent.

    Funktionieren tut's bis jetzt prima

    Ja, in einem kleinen Teil der denkbaren Fälle.

    aber leider bin ich kein Sicherheitsexperte und wüsste gerne, ob das grober Unfug ist, was ich da treibe ...

    Es ist grober Unfug, finde ich. Nicht mal unbedingt vom Standpunkt der Sicherheit (je nachdem, mit was für heiklen Daten du hantierst), sondern schon vom Standpunkt der Usability.

    Ciao,
     Martin

    --
    They say hard work never killed anyone, but I figure, why take the risk?
      (Ronald Reagan, US-Präsident 1981-1989)
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. 'nabend,

      das ist dann ein Denkfehler. Dann würden sich bei dir alle Studenten und Mitarbeiter einer Uni, die über denselben Router nach draußen gehen, eine Session teilen. Oder Tausende von Angestellten eines mittelgroßen Unternehmens.

      Es ist doch nur der Session-Name, nicht die Session selbst. Der Name ist doch normalerweise statisch (PHPSESSID).

      Andererseits hätten die Kunden mancher Internet-Provider wie z.B. AOL bei dir keine Chance, überhaupt mal eine Session fortzuführen, denn bei ihnen wird fast jeder Request über einen anderen zufällig zugeteilten Proxy geleitet; die IP, mit der der Request bei dir aufschlägt, ändert sich permanent.

      Ich kenne denjenigen welchen, der sich ein- und auloggen können soll; und der ist weder bei AOL, noch teilt er sich 'ne IP irgendwem

      Es ist grober Unfug, finde ich.

      Hm ... mag ja trotzdem sein, dass du Recht hast ... nochmal genau durch den Kopp gehen lassen

      Grüße,

      WiMu

      1. Hallo,

        das ist dann ein Denkfehler. Dann würden sich bei dir alle Studenten und Mitarbeiter einer Uni, die über denselben Router nach draußen gehen, eine Session teilen. Oder Tausende von Angestellten eines mittelgroßen Unternehmens.
        Es ist doch nur der Session-Name, nicht die Session selbst.

        wo liegt der praktische Unterschied? Der Session-Name identifiziert die Session eindeutig.

        Der Name ist doch normalerweise statisch (PHPSESSID).

        Nein. PHPSESSID ist nur eine benannte Konstante, die den zufällig zugeteilten Session-Namen repräsentiert.

        Ich kenne denjenigen welchen, der sich ein- und auloggen können soll; und der ist weder bei AOL, noch teilt er sich 'ne IP irgendwem

        Wenn es nur um eine Person geht, oder um einen eingeschränkten Personenkreis, dessen Verhalten oder Voraussetzungen du kennst (oder sogar vorschreiben kannst), hätte diese wichtige Information ins Startposting gehört.

        Ciao,
         Martin

        --
        Die letzten Worte der Challenger-Crew:
        Lasst doch mal die Frau ans Steuer!
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hello,

          wo liegt der praktische Unterschied? Der Session-Name identifiziert die Session eindeutig.

          Der Session-Name identifiziert eine Sessionschaar eindeutig.
          Kombination aus Session-Namen und Session-ID sollte dann eine Session daraus eineindeutig identifizieren.

          Aber genug Geschisse :-)

          Er könnte einen zweiten Cookie setzen für den Sessionnamen. So kann dann jeder Client einen eigenen Sessionnamen haben. Das bringt aber nur dann Vorteile, wenn er diese Cookies auch auf "Echtheit" überprüft, also feststellt, ob sie ggf. mit einer falschen zugeordneten Session-ID kommen.

          Dann könnte man als Konsequenz daraus z.B. den Account für 24 Stunden sperren.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
      2. Hello,

        Es ist doch nur der Session-Name, nicht die Session selbst. Der Name ist doch normalerweise statisch (PHPSESSID).

        Dann würde aber bei jedem IP-Wechsel eine neue Session begonnen werden und die Daten der alten wären für den Client erstmal nicht mehr zugänglich.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  2. Hi,

    ich bin gerade dabei, ein kleines login-script zu schreiben. Nun hatte ich die Idee, man könne doch einfach die gehashte IP-Addresse als Session-Namen verwenden um sicherzugehen, dass das Sitzungs-cookie nur für einen einzigen Rechner gültig ist.

    was hat die IP-Adresse bitte schön mit einem Rechner zu tun?

    Funktionieren tut's bis jetzt prima; aber leider bin ich kein Sicherheitsexperte und wüsste gerne, ob das grober Unfug ist, was ich da treibe ...

    Sehr grober Unfug. Es ermögllicht jedem, der zufällig die gleiche IP-Adresse hat, ohne Authentifizierung einzudringen; gleichzeitig wird jeder, dessen IP-Adresse wechselt, vom System ausgeschlossen. Genauso gut könntest Du den User-Agent-String als Kriterium wählen, gerne auch nach Kürzung auf den für serverseitige Betrachtungen relevanten Teil (also auf "", ohne die Anführungszeichen).

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. was hat die IP-Adresse bitte schön mit einem Rechner zu tun?

      IPv6!!!!11111elf genug Adressen für alle :p

      SCNR

      1. Hi,

        IPv6!!!!11111elf genug Adressen für alle :p

        es gibt auf der Welt auch genug Frauen für alle Männer. Trotzdem haben manche mehrere, andere gar keine, und einige Frauen bleiben, öhm, unbenutzt. Ich glaube, ich sollte einen anderen Vergleich wählen ...

        SCNR

        <Loriot> Ach. Ach was. </Loriot>

        Cheatah :-)

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hi!

          und einige Frauen bleiben, öhm, unbenutzt.

          *zupft an Cheatahs Aermel - psst, aber einige Maenner auch*

          --
          Ich bin dafuer verantwortlich was ich sage, nicht dafuer, was Du verstehst.
          1. Hi,

            und einige Frauen bleiben, öhm, unbenutzt.
            *zupft an Cheatahs Aermel - psst, aber einige Maenner auch*

            <entruest> das sind dann keine echten Männer!!!1!zwölf </entruest>

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Moin!

              und einige Frauen bleiben, öhm, unbenutzt.
              *zupft an Cheatahs Aermel - psst, aber einige Maenner auch*

              <entruest> das sind dann keine echten Männer!!!1!zwölf </entruest>

              Naja, ich schaetze, die benutzen sich fleissig selbst... Ein Geraet das also immer nur seine eigene IP aufruft, nennt man dan wohl...

              --
              Ich bin dafuer verantwortlich was ich sage, nicht dafuer, was Du verstehst.
              1. Hi,

                und einige Frauen bleiben, öhm, unbenutzt.
                *zupft an Cheatahs Aermel - psst, aber einige Maenner auch*
                <entruest> das sind dann keine echten Männer!!!1!zwölf </entruest>
                Naja, ich schaetze, die benutzen sich fleissig selbst... Ein Geraet das also immer nur seine eigene IP aufruft, nennt man dan wohl...

                localhost ;-)

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                O o ostern ...
                Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  3. Hallo nochmal,

    also wahrscheinlich ist das Ganze wirklich eine Schnapsidee ... aber ich glaube, ihr habt mich (trotzdem vielen Dank für die Antworten) gründlich missverstanden (meine Schuld, da wohl nicht präzise genug).

    Er könnte einen zweiten Cookie setzen für den Sessionnamen. So kann dann jeder Client einen eigenen Sessionnamen haben.

    Genau den zweiten cookie wollte ich mir eben ersparen, indem ich einfach den ersten nach der IP benenne.

    Sinn des Ganzen sollte ja sein, dass man sich nicht einfach so das cookie kopieren und so den Zugang erschleichen kann, da das cookie mit einer überschaubaren Anzahl an clients (diejenigen, die über entsprechende IP verfügen) verknüpft ist. Natürlich wird sowohl der Session-Name, als auch die Session selbst geprüft. Die Session wird erst dann gestartet, wenn sich der Benutzer mit seinem Usernamen und zugehörigem Passwort einloggt und die Überprüfung findet nur dann statt, wenn PHP das nach der IP benannte cookie findet.

    Das Login-Script sieht so aus (quick-and-dirty ... $_POSTs werden noch escaped; username und passwort kommen später verschlüsselt in 'ne Datenbank, etc.):

      
    $user = 'test';  
    $pass = 'test';  
      
    $hash   = 'md5';  
    $iphash = hash ( $hash,  $_SERVER['REMOTE_ADDR'] );  
      
    function confirm() {  
    	global $iphash, $user, $pass;  
    	if ( isset($_POST) && $_POST['user'] != '' && $_POST['pass'] != '' ) {  
    		if ( $_POST['user'] != $user || $_POST['pass'] != $pass ) {  
    			unset($_POST);  
    			confirm();  
    		} else {  
    			session_name( $iphash );  
    			session_start();  
    			$_SESSION['login'] = true;  
    			$html = <<< REDIRECT  
    <html>  
    		<head>  
    			<meta http-equiv="refresh" content="0; URL=index.php">  
    		</head>  
    </html>  
      
    REDIRECT;  
    		}  
    	} else {  
    		$html = <<< HTML  
    <form action="login.php" method="post">  
    	<input name="user" type="text" />  
    	<input name="pass" type="password" />  
    	<input type="submit" value=" OK " />  
    </form>  
      
    HTML;  
    	}  
    echo $html;  
    }  
      
    confirm();  
    
    

    Und die zugehörige index.php:

      
    $hash   = 'md5';  
    $iphash = hash ( $hash, $_SERVER['REMOTE_ADDR'] );  
      
    if ( isset( $_COOKIE[$iphash] ) ) {  
    	session_name( $iphash );  
    	session_start();  
    	if( $_SESSION['login'] ) {  
    		$html = 'Angemeldet<br /><a href="logout.php">logout</a>'; // Text wenn eingeloggt  
    	} else {  
    		$html = 'Irgendwas ist schief gelaufen'; // Text wenn session "seltsam"  
    	}  
    } else {  
    	$html = '<a href="login.php">login</a>'; // Text wenn nicht eingeloggt  
    }  
      
    echo $html;  
    
    

    Wohlgemerkt alles quick and dirty (ja, DOCTYPE fehlt ...). Wollte nur Testen, ob das mit dynamischen Session-Namen funktioniert. Und zumindest bei mir tut es das, sogar wenn ich mit meinem Rechner und dem meiner Freundin über einen gemeinsamen router mit gemeinsamer IP gleichzeitig unterwegs bin - zwei völlig getrennte Sessions mit unterschiedlicher id.

    Klar ist die Session weg, sobald sich meine IP ändert, aber zumindest bei mir tut sie das nur, wenn ich das will oder den browser schließe, und eine längere Sitzung ist ohnehin nicht erwünscht. Mit AOL habe ich keine Erfahrung.

    Grüße und nochmals Danke,

    WiMu

    P.S.: hoffentlich mache ich mich gerade nicht total lächerlich ... PHP ist mir noch relativ neu

    1. Hello,

      function confirm() {
      global $iphash, $user, $pass;
      if ( isset($_POST) && $_POST['user'] != '' && $_POST['pass'] != '' ) {
      if ( $_POST['user'] != $user || $_POST['pass'] != $pass ) {
      unset($_POST);
      confirm();

      wofür die Rekursion?

      Wohlgemerkt alles quick and dirty

      Ja, so sihet das aus. Einfach drauflos programmiert, ohne sich vorher ein Ablaufdiagramm und einen Dialogplan (zwischen Client und Server) zu machen.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. wofür die Rekursion?

        Da sollte eigentlich sowas rein wie 'bitte geben sie den korrekten Benutzernamen und Passwort ein'; war dann aber zu faul und stattdessen confirm(); als quasi-Platzhalter

        Wohlgemerkt alles quick and dirty

        Ja, so sihet das aus. Einfach drauflos programmiert, ohne sich vorher ein Ablaufdiagramm und einen Dialogplan (zwischen Client und Server) zu machen.

        Ja, hab' ich ja gesagt ... wollte nur Testen, ob das mit den dynamisch-nach-ip-benannten Sessions funktioniert. Hat keine fünf Minuten gedauert, das hinzurotzen, aber seinen Zweck (nämlich diesen Test) erfüllt's

        Grüße,

        WiMu