[php] IP achterhalen (ook achter proxies)

Pagina: 1
Acties:
  • 64 views sinds 30-01-2008

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 13-08 14:09
Ik heb heb IP log script je maar dat werkt dus alleen met
getenv('REMOTE_ADDR')
getenv('HTTP_X_FORWARDED_FOR')

Ik weet dat er nog een paar zijn , maar die kan ik niet vinden op GG en GoT.

Verder vraag ik me af of de eerste twee voldoende zijn en ik dus die extra getenv() 's wel echt nodig ben

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09-2025
Suepahfly schreef op 13 September 2003 @ 20:52:
Ik heb heb IP log script je maar dat werkt dus alleen met
getenv('REMOTE_ADDR')
getenv('HTTP_X_FORWARDED_FOR')

Ik weet dat er nog een paar zijn , maar die kan ik niet vinden op GG en GoT.

Verder vraag ik me af of de eerste twee voldoende zijn en ik dus die extra getenv() 's wel echt nodig ben
Waarom doe je niet gewoon print_r( $_SERVER ) :?

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 13-08 14:09
zmn schreef op 13 September 2003 @ 20:53:
Waarom doe je niet gewoon print_r( $_SERVER ) :?
Daar staat http_X_forwarded_for zelfs niet in

(ik hang niet achter een proxy als ik iets op vraag van localhost hé)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Eerlijk gezegd geloof ik niet dat er een gangbaar alternatief is voor HTTP_X_FORWARDED_FOR. Waarom denk je dat die wel bestaat?

In de praktijk kan een proxy natuurlijk wel elke willekeurige header instellen die 'ie wil. De vraag is meer welke varianten in de praktijk voorkomen. Heb je aanwijzingen dat er alternatieven bestaan? Zo ja, welke?

Denk er aan dat het altijd mogelijk is dat een proxy de HTTP requests forward zonder het IP-adres van daadwerkelijke client te vermelden. Verder is de kans aanwezig dat dan een lokaal (privé) IP-adres wordt weergegeven, wat op zichzelf niet globaal uniek is (maar misschien wel in combinatie met het IP-adres van de proxy).

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 13-08 14:09
Soultaker schreef op 13 September 2003 @ 21:30:
Eerlijk gezegd geloof ik niet dat er een gangbaar alternatief is voor HTTP_X_FORWARDED_FOR. Waarom denk je dat die wel bestaat?
Die heb ik ooit een keer gezien in een script (die kan ik alleen niet weer vinden)
In de praktijk kan een proxy natuurlijk wel elke willekeurige header instellen die 'ie wil. De vraag is meer welke varianten in de praktijk voorkomen. Heb je aanwijzingen dat er alternatieven bestaan? Zo ja, welke?
Dat is nou juist mijn vraag

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Niet welke alternatieven, welke aanwijzingen, bedoel ik. :) Gewoon "een ander script, ergens, ooit" is natuurlijk niet zo sterk, vooral omdat bepaalde programmeurs (laat ik niet direct "PHP-programmeurs" zeggen) de neiging hebben om allerlei moeilijke cases en variaties te verzinnen, die niet op enige standaard of praktijkervaring gebaseerd zijn.

Maar goed, misschien dat iemand hier toevallig een andere methode kent, maar voor zover ik weet zul je het met HTTP_X_FORWARDED_FOR moeten doen. Zonder meer informatie kan ik je ook niet verder helpen, denk ik.

Verwijderd

Oké ik snap je probleem, ik had het zelf ook altijd opgelost op deze manier en het werkt soms wel en soms niet.
Maar waarom zou je met ip's achter een router willen werken? De ip's die achter een router te vinden zijn zijn altijd network use ip's(192.168.x.x, 10.x.x.x, etc).

Stel je wil dit b.v. gaan gebruiken voor een poll dat je dat blockt op intern+extern ip, zodat je niet nog een keer vanaf de zelfde pc in het netwerk kan voten.
Dit lijkt me erg overdreven, moetten ze maar niet achter een router/proxy gaan werken.
Neem een voorbeeld aan kennisnet(internet voor scholen, tot 1 januarie), daar zit je achter een proxy.
Daar kan je niet voten als iemand anders vanuit kennisnet al gevote heeft.
Maarja dat is dan jammer vind ik, daar trek ik me nooit iets van aan bij het scripten.

Maar voor het geval dat je er iets aan hebt, hier een stukje van mijn GET system.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function func_GetIP() {
    global $HTTP_SERVER_VARS;
    
    $getip_ip_array = explode(".",$HTTP_SERVER_VARS["REMOTE_ADDR"]);
    $getip_ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
    
    if ((stristr($getip_ip,"192.168.")) || (stristr($getip_ip,"172.")) && 
(stristr($getip_ip,"16.")) || (stristr($getip_ip,"17.")) 
|| (stristr($getip_ip,"18.")) || (stristr($getip_ip,"19.")) 
|| (stristr($getip_ip,"20.")) || (stristr($getip_ip,"21.")) 
|| (stristr($getip_ip,"22.")) || (stristr($getip_ip,"23.")) 
|| (stristr($getip_ip,"24.")) || (stristr($getip_ip,"25.")) 
|| (stristr($getip_ip,"26.")) || (stristr($getip_ip,"27.")) 
|| (stristr($getip_ip,"28.")) || (stristr($getip_ip,"29.")) 
|| (stristr($getip_ip,"30.")) || (stristr($getip_ip,"31.")) 
|| (stristr($getip_ip,"127.0.0."))) {
        //Dit zijn IPRanges die NIET op internet bestaan, deze 
        //moet je NIET toelaten op je site
        $getip_client_ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
        $getip_client_type = "LANIP";
    } elseif ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"] != "") {
        //Server
        $getip_server_ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
        $getip_server_host = @gethostbyaddr($HTTP_SERVER_VARS["REMOTE_ADDR"]);
        
        //Client
        $getip_client_ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
        $getip_client_host = @gethostbyaddr($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]);     
        $getip_client_type = "WANIP";
    } else {
        //Client
        $getip_client_ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
        $getip_client_host = @gethostbyaddr($HTTP_SERVER_VARS["REMOTE_ADDR"]);
        $getip_client_type = "WANIP";
    }
    
    return array("client_ip"=>$getip_client_ip,"client_host"=>$getip_client_host,
"server_ip"=>$getip_server_ip,"server_host"=>$getip_server_host,
"client_type"=>$getip_client_type);
}


Het is niet geheel waterdicht, maar werkt al leuk. Soms heb ik een denkfout(host achter proxy? kan nooit, zit wel in mn script, erg stom)
Zo heb ik ook een BrowserGET en een LangGET(op basis van browserlang+host(home.nl b.v.).

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Sorry, KingOfDos, maar volgens mij beantwoord je de vraag van de topicstarter daar niet mee.

offtopic:
Waarom is adres 10.11.12.13 zonder proxy trouwens een LAN-IP en met een proxy opeens een WAN-IP?

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Verwijderd schreef op 14 September 2003 @ 00:16:
Oké ik snap je probleem, ik had het zelf ook altijd opgelost op deze manier en het werkt soms wel en soms niet.
Maar waarom zou je met ip's achter een router willen werken? De ip's die achter een router te vinden zijn zijn altijd network use ip's(192.168.x.x, 10.x.x.x, etc).

Stel je wil dit b.v. gaan gebruiken voor een poll dat je dat blockt op intern+extern ip, zodat je niet nog een keer vanaf de zelfde pc in het netwerk kan voten.
Dit lijkt me erg overdreven, moetten ze maar niet achter een router/proxy gaan werken.
Neem een voorbeeld aan kennisnet(internet voor scholen, tot 1 januarie), daar zit je achter een proxy.
Daar kan je niet voten als iemand anders vanuit kennisnet al gevote heeft.
Maarja dat is dan jammer vind ik, daar trek ik me nooit iets van aan bij het scripten.

Maar voor het geval dat je er iets aan hebt, hier een stukje van mijn GET system.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
    if ((stristr($getip_ip,"192.168.")) || (stristr($getip_ip,"172.")) && 
(stristr($getip_ip,"16.")) || (stristr($getip_ip,"17.")) 
|| (stristr($getip_ip,"18.")) || (stristr($getip_ip,"19.")) 
|| (stristr($getip_ip,"20.")) || (stristr($getip_ip,"21.")) 
|| (stristr($getip_ip,"22.")) || (stristr($getip_ip,"23.")) 
|| (stristr($getip_ip,"24.")) || (stristr($getip_ip,"25.")) 
|| (stristr($getip_ip,"26.")) || (stristr($getip_ip,"27.")) 
|| (stristr($getip_ip,"28.")) || (stristr($getip_ip,"29.")) 
|| (stristr($getip_ip,"30.")) || (stristr($getip_ip,"31.")) 
|| (stristr($getip_ip,"127.0.0."))) {
        //Dit zijn IPRanges die NIET op internet bestaan, deze 
        //moet je NIET toelaten op je site
Da's dus fout.
Deze checks wijzen een ip als 18.172.123.12 ook aan als private ip. en 18.0.0.0/8 is van MIT in de US. (Bovendien kunnen die checks veel efficienter, maar dat terzijde)

All my posts are provided as-is. They come with NO WARRANTY at all.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Er zijn veel minder ranges, zie RFC-1918:
The Internet Assigned Numbers Authority (IANA) has reserved the following three blocks of the IP address space for private internets:
• 10.0.0.0 - 10.255.255.255 (10/8 prefix)
• 172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
• 192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
Ik zou trouwens niet weten waarom je mensen met deze IP-addressen zou willen weren.

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Soultaker schreef op 14 september 2003 @ 03:53:
Er zijn veel minder ranges, zie RFC-1918:

[...]

Ik zou trouwens niet weten waarom je mensen met deze IP-addressen zou willen weren.
Ik dacht eerst ook dat ie bedoelde dat ip's beginnende met 16, 17, 18 (respectievelijk HP, Apple, MIT) als private zag, maar toen zag ik de '&&' achter de 172 check.

Er is er nog een, trouwens: 169.254.0.0/16. Maar die wil je op netwerken ook mijden omdat Microsoft en Apple ze beiden gebruiken voor autoconfig ip's.

Waarom je gebruikers met deze ip adressen zonder proxy zou willen weren is simpel: ze zijn niet echt. Tenzij je zelf in een LAN met het ding zit is het niet mogelijk dat je een van die adressen tegenkomt. (Overigens hoef je ze niet te weren, een pakketje met een private adres als afzender komt niet aan -- wordt geblocked in de eerste router die het tegenkomt)

All my posts are provided as-is. They come with NO WARRANTY at all.


  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

http://www.iana.org/assignments/ipv4-address-space - hier kan je je eventuele 'reserved' list op afstemmen - let dan wel op dat je dit dan ook update als die adressen ook af en toe vrijgegeven worden :)

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Who is John Galt?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 14 September 2003 @ 00:16:
Maar waarom zou je met ip's achter een router willen werken?
proxy != router
... lap code...
is het niet handiger om de eerste 2 getallen van het ip nummer af te halen, en dan met een simpele == kijken of het een 10, 172 of 196 betreft, en in geval van de 172 nog eens te kijken of het 2e getal tussen de 16 en de 31 (inclusief) ligt? :)

Lijkt me nogal wat efficienter dan tig stristr () aanroepen
Bovendien werkt jouw code niet goed, een adres als 172.1.17.23, wat een valide internet adres is, wordt ook als lokaal gezien

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

.oisyn schreef op 14 september 2003 @ 14:07:
[...]

is het niet handiger om de eerste 2 getallen van het ip nummer af te halen, en dan met een simpele == kijken of het een 10, 172 of 196 betreft, en in geval van de 172 nog eens te kijken of het 2e getal tussen de 16 en de 31 (inclusief) ligt? :)
Waarom strings vergelijken als het bedoeld is om bitwise te gaan? :) Bij de 172.16.0.0/12 range moeten gewoon de eerste 12 bits gelijk zijn aan de bits in 172.16.0.0.

Aanschouw:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?

// de ip adressen even in integer notatie, normaal zou je die op een andere manier
// verkrijgen, maar even voor het voorbeeld..
$ip = (172 << 24) + (18 << 16) + (123 << 8) + 23; // 172.18.123.23 == private
$privip = (172 << 24) + (16 << 16); // 172.16.0.0(/12)

// heen en weer shiften om de laatste 20 bits te elimineren. Kan vast ook anders,
// maar nogmaals.. het voorbeeld :P
if(($ip >> 20) << 20 == $privip){
  echo "private";
}
?>


Lijkt me nogal wat efficienter dan tig vergelijkingen ;)
Lijkt me nogal wat efficienter dan tig stristr () aanroepen
Bovendien werkt jouw code niet goed, een adres als 172.1.17.23, wat een valide internet adres is, wordt ook als lokaal gezien
Precies. Die arme MIT-student mag z'n site niet op ;)

All my posts are provided as-is. They come with NO WARRANTY at all.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

CyBeR schreef op 14 September 2003 @ 21:44:

Waarom strings vergelijken als het bedoeld is om bitwise te gaan?
ik had het over getallen, niet over strings. Bitwise dus ;)
Aanschouw
je hoeft mij niet te vertellen hoe je bitwise operatoren kunt doen hoor ;) maar de gemiddelde php programmeur weet dat niet :)

bovendien, vanwaar de shifts, als je er zo'n mooie & operator voor hebt? :Y)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
define (IP_10, 0x10000000); // 10.x.x.x
define (IP_10_MASK, 0xff000000);

define (IP_172, 0xac100000); // 172.16.x.x - 172.31.x.x
define (IP_172_MASK, 0xfff00000);

define (IP_192, 0xc0a80000); // 192.168.x.x
define (IP_192_MASK, 0xffff0000);

if (($ip & IP_10_MASK) == IP_10 || ($ip & IP_172_MASK) == IP_172 || ($ip & IP_192_MASK) == IP_192)
{
    // private
}


;)

[ Voor 6% gewijzigd door .oisyn op 15-09-2003 15:47 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

.oisyn schreef op 15 September 2003 @ 15:46:
[...]


ik had het over getallen, niet over strings. Bitwise dus ;)
My bad.
Maar blijft cumbersome imo ;)
je hoeft mij niet te vertellen hoe je bitwise operatoren kunt doen hoor ;) maar de gemiddelde php programmeur weet dat niet :)

bovendien, vanwaar de shifts, als je er zo'n mooie & operator voor hebt? :Y)

PHP:
1
<code>


;)
Zei ik al dat ik slechts een voorbeeld gaf? :P Ik heb dat snel gemaakt en me er niet verder in verdiept dan 'werkt het zoals ik het bedoel' ;)

All my posts are provided as-is. They come with NO WARRANTY at all.


Verwijderd

Thnx man
(me 1e bericht hier ;), maybe is datum al oud :P)
|:(

  • laurensl
  • Registratie: Juni 2000
  • Niet online
niet gewoon zo?

PHP:
1
2
3
4
if(getenv(HTTP_X_FORWARDED_FOR)){$ip = getenv(HTTP_X_FORWARDED_FOR);} 
elseif(getenv(HTTP_VIA)){$ip = getenv(HTTP_VIA);} 
elseif(getenv(REMOTE_ADDR)){$ip = getenv(REMOTE_ADDR);}
else{$ip = "unknown";}

[ Voor 3% gewijzigd door laurensl op 09-11-2003 13:49 ]


  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 13-08 14:09
@ Laurensl, Beetje onnodige kick.

Omdat een ander er misschien wat aan heeft hier de functie die ik gebruik

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function getIP() 
{
    if(!empty($_SERVER['HTTP_CLIENT_IP']))
    {
        $ip = $_SERVER['HTTP_CLIENT_IP']);
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
        $ips = explode (",", $_SERVER['HTTP_X_FORWARDED_FOR']);
        for ($i = 0; $i < count($ips); $i++) 
        {
            $ips = trim($ips[$i];
            if (!eregi ("^(10|172\.16|192\.168)\.", $ips[$i]))
            {
                    $ip = $ips[$i];
                    break;
            }
        }
    }
    elseif (!empty($_SERVER['HTTP_VIA'])) 
    {
        $ips = explode (",", $_SERVER['HTTP_VIA']);
        for ($i = 0; $i < count($ips); $i++) 
        {
            $ips = trim($ips[$i];
            if (!eregi ("^(10|172\.16|192\.168)\.", $ips[$i])) 
            {
                    $ip = $ips[$i];
                    break;
            }
        }
    }
    elseif(!empty($_SERVER['REMOTE_ADDR']))
    {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    else
    {
        $ip = "0.0.0.0"; 
    }
    return $ip;
}

  • laurensl
  • Registratie: Juni 2000
  • Niet online
offtopic:
@Suepahfly: ik moest ip achterhalen met php; was aan 't zoeken met de search, en dacht, nou, als iemand anders ooit dit topic nog opent (via search) op zoek naar een antwoord; misschien dat ie dan iets aan mijn bijdrage heeft ;)

thanx voor jouw script iig, ziet er beter uit dan de mijne

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Beetje onnodig kicken niet?

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.