unsigned long int erzwingen!
Peter Mairhofer
- php
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
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
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
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
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
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
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
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
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