2013-07-12 290 views
2

我读了很多文章,建议使用http_x_forwarded_for来获取代理服务器和客户端的真实IP地址,但他们似乎都没有工作。如何获取客户端的本地IP地址和代理服务器

我被分配了一个本地IP地址,我使用代理服务器连接到互联网。但是当我显示整个$ _SERVER变量时,我没有使用我的真实机器IP和代理服务器的单一跟踪。

这个LINK显示整个$ _SERVER变量。

我想这是不可能在PHP中。我如何做到这一点?我知道它的可能性,因为一旦我看到一些网页显示我在Mozilla中使用的真实IP地址和代理服务器。但不知道它使用的是哪种语言。

我该如何完成?我准备好使用CGI或JavaScript。我在互联网上找不到任何工作示例。帮帮我?

回答

1

这是完全取决于它是否会发送http_x_forwarded_for标头的代理。有些会,有些则不会。无论您打印$_SERVER变量时使用的代理是否未发送标题。

即使所有代理都发送了头文件,您仍然会遇到问题,因为任何人都可以欺骗http_x_forwarded_for标头,因此如果您的脚本将其视为真实IP,那么有人可能会欺骗它以规避您的IP检查。

如果使用$_SERVER['REMOTE_ADDR']并忘记依靠http_x_forwarded_for,您可以做的最好。代理服务器的用户是否可以使用新IP访问您的网站,但这比所有用户在http_x_forwarded_for中欺骗IP的能力要好。

作为一种援助,您可以维护一个已知代理列表,但这也不会最终为您提供真实的客户端IP,它只能告诉您IP是否在您的代理列表中。

+0

我明白,但如果有什么方法可以在客户机上运行javascript以从浏览器获取IP和代理?如果它是可能的当然! –

+0

不幸的是,你可以包含一个外部脚本,但是它与你的PHP是否依赖实际的IP或'x_forwarded_for'有相同的问题。另请参阅我关于保留代理列表的编辑。 – MrCode

+0

感谢您清除我的疑惑。 –

1

我发现我写的小开关解决了大多数人无法获得真正的ip而不是代理的问题。它检查REMOTE_ADDRHTTP_X_FORWARDED_FOR是否相同,如果是,则打印REMOTE_ADDR。如果它们不同,则认为HTTP_X_FORWARDED_FOR是正确的,因为REMOTE_ADDR通常返回代理。希望这可以帮助。请让我知道如果有更好的方法! [email protected]

<?php 
    $ip = $_SERVER['REMOTE_ADDR']; 
    $ip2 = $_SERVER['HTTP_X_FORWARDED_FOR']; 

    switch($ip): 
    case $ip2: 
     $ipa = $_SERVER['REMOTE_ADDR']; 
     $city= file_get_contents ("http://ipinfo.io/".$_SERVER['REMOTE_ADDR']."/city"); 
     $region= file_get_contents ("http://ipinfo.io/".$_SERVER['REMOTE_ADDR']."/region"); 
     $geo= file_get_contents ("http://ipinfo.io/".$_SERVER['REMOTE_ADDR']."/geo"); 
     break; 
    default: 
     $ipa = $_SERVER['HTTP_X_FORWARDED_FOR']; 
     $city= file_get_contents ("http://ipinfo.io/".$_SERVER['HTTP_X_FORWARDED_FOR']."/city"); 
     $region= file_get_contents ("http://ipinfo.io/".$_SERVER['HTTP_X_FORWARDED_FOR']."/region"); 
     $geo= file_get_contents ("http://ipinfo.io/".$_SERVER['HTTP_X_FORWARDED_FOR']."/geo"); 
     break; 
    endswitch; 
    ?> 
相关问题