Peter Mairhofer: unsigned long int erzwingen!

Hallo,

Ich muss für eine Webapplikation ein IP Access Control einbauen (Ranges von - bis).

Namen wandle ich zuerst mit gethostbyname() um, danach in Integers mit ip2long().

Jetzt mache ich den Vergleich:

if($ADRESSE >= $von && $ADRESSE <= $bis)
{
  echo "Adresse passt!"
}

Das funktioniert ja wunderbar, aber trotzdem gibt mit ip2long immer signed-Werte zurück. z.B. konvertiert er 255.255.255.255 gleich zu -1 statt zu 4294967295. Dann funktioniert mein System natürlich nicht mehr immer.
z.B. gibt die letzte Regel die Policy an, und diese hat als von "0.0.0.0" und als bis "255.255.255.255".

Typen kann ich offensichtlich mit Casts umwandeln aber nicht *UNSIGNED* erzwingen.

Kann mir da wer helfen? Wie mach ich das?

Vielen Dank,

Peter

  1. z.B. gibt die letzte Regel die Policy an, und diese hat als von "0.0.0.0" und als bis "255.255.255.255".

    Hi Peter,

    eine Lösung für unsigned Integer habe ich nicht, aber zwei Tipps.
    Wie wäre es , wenn du Bereiche durch Maskierung definieren würdest?

    Bsp. von 123.123.123.0 bis 123.123.123.255

    $range  = ip2long(  $ip = '123.123.123.222');
    $range &= ip2long($mask = '255.255.255.0');
    if ($range == ip2long('123.123.123.0'))
    {
    }

    Zweiter Tipp: Verzichte auf den Bereich von 0.0.0.0 bis 255.255.255.255, denn dieser ist immer True ;)

    Grüße von Tobias

    p.s. Verzeihe Syntaxfehler, ich habe gerade kein PHP

    1. Hallo,

      eine Lösung für unsigned Integer habe ich nicht, aber zwei Tipps.
      Wie wäre es , wenn du Bereiche durch Maskierung definieren würdest?

      Danke fuer deinen Tipp, aber ich muss explizit eine IP Adressenrange definieren können, also auch 192.168.10.54 bis 192.168.10.162. Da hilft mir leider die Maskierung nicht weiter :-(

      Zweiter Tipp: Verzichte auf den Bereich von 0.0.0.0 bis 255.255.255.255, denn dieser ist immer True ;)

      Ja klar ist dieser immer true! Das SOLL er ja auch sein! Hast du schon mal mit ipchains/iptables gearbeitet? Das oben soll eben die "Chain-Policy" darstellen. Also wenn der ganze Berg an Regln durch ist, fängt eben 0.0.0.0 bis 255.255.255.255 alles auf (oder lässt es eben durch, je nachdem wie das Flag gesetzt ist)

      Peter

  2. Hallo Peter,

    Das funktioniert ja wunderbar, aber trotzdem gibt mit
    ip2long immer signed-Werte zurück. z.B. konvertiert er
    255.255.255.255 gleich zu -1 statt zu 4294967295.

    255.255.255.255 ist keine gueltige IP-Adresse. Wenn du einen
    Client mit dieser IP triffst, kannst du ihn gleich abweisen.
    Trotzdem ist der Rueckgabewert von -1 richtig. man inet_addr
    (siehe unten) sagt dazu:

    The  inet_addr()  function  converts  the Internet host
     address cp from numbers-and-dots notation into binary data
     in network byte  order.   If the input is invalid,
     INADDR_NONE (usually -1) is returned.  This is an obsolete
     interface to inet_aton, described  immediately  above;  it
     is obsolete because -1 is a valid address (255.255.255.255),
     and inet_aton provides a cleaner way to indicate error
     return.

    Dann funktioniert mein System natürlich nicht mehr immer.

    Doch, es funktioniert wunderbar.

    z.B. gibt die letzte Regel die Policy an, und diese hat
    als von "0.0.0.0" und als bis "255.255.255.255".

    0.0.0.0 ist genau so wenig eine gueltige IP-Adresse wie
    255.255.255.255.

    Typen kann ich offensichtlich mit Casts umwandeln aber
    nicht *UNSIGNED* erzwingen.

    Ich habe mal im Source nachgeschaut. Nein, das kannst du
    nicht erzwingen. Diese Funktion ist ein Wrapper um ntohl().
    Diese ntohl()-Funktion gibt uint32 zurueck, also
    unsinged long. Die PHP-Funktion ip2long aber wandelt das
    intern um nach long:

    RETURN_LONG(ntohl(inet_addr(Z_STRVAL_PP(str))));

    Tatsaechlich sollte die inet_addr() Funktion gar nicht mehr
    verwendet werden, sie ist als obsolet gekennzeichnet. Mal
    sehen, wie das in PHP 4.3.3 aussieht, moment... da sieht es
    genau so aus. Hm. Mal einen Patch einreichen.

    Gruesse,
     CK

    --
    http://cforum.teamone.de/
    http://wishlist.tetekum.de/
    If God had meant for us to be in the Army, we would have been born with green, baggy skin.
    1. Hallo Peter,

      ich habe nochmal nachgeforscht. Das unsigned-Problem laesst
      sich umgehen wie folgt:

      $ulong = sprintf(
        "%u",
        base_convert(
          ip2long("255.255.0.255" ) ^ 0xFFFFFFFF, 10, 2
        )
      );

      Gruesse,
       CK

      --
      http://cforum.teamone.de/
      http://wishlist.tetekum.de/
      If God had meant for us to be in the Army, we would have been born with green, baggy skin.
      1. Hallo,

        $ulong = sprintf(
          "%u",
          base_convert(
            ip2long("255.255.0.255" ) ^ 0xFFFFFFFF, 10, 2
          )
        );

        Danke für deinen Tipp. Aber das funktioniert bei mir nicht wirklich. Es kommt immer 2147483647 raus!

        Bleibt wohl nur, meine eigene Funktion zu schreiben?? Was meinst du?

        Peter

        1. Hallo Peter,

          Bleibt wohl nur, meine eigene Funktion zu schreiben?? Was
          meinst du?

          Es sieht so aus. PHP behandelt long-Datentypen nunmal grunsaetzlich als signed.

          Gruesse,
           CK

          --
          http://cforum.teamone.de/
          http://wishlist.tetekum.de/
          If God had meant for us to be in the Army, we would have been born with green, baggy skin.
    2. Sup!

      255.255.255.255 ist keine gueltige IP-Adresse.

      (...)

      it is obsolete because -1 is a valid address (255.255.255.255),
      and inet_aton provides a cleaner way to indicate error
      return.

      Was jetzt? Valid oder nicht?

      255.255.255.255 müsste doch die Netzweite Broadcast-Adresse sein, oder?

      Gruesse,

      Bio

      --
      Elite ist mein zweiter Vorname
      1. Hallo Bio,

        it is obsolete because -1 is a valid address (255.255.255.255),
        and inet_aton provides a cleaner way to indicate error
        return.

        Was jetzt? Valid oder nicht?

        Als Host-Adresse: nicht valid. Als Adresse generell: valid.

        255.255.255.255 müsste doch die Netzweite
        Broadcast-Adresse sein, oder?

        Ja.

        Gruesse,
         CK

        --
        http://cforum.teamone.de/
        http://wishlist.tetekum.de/
        If God had meant for us to be in the Army, we would have been born with green, baggy skin.