2

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

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

LINK显示整个 $_SERVER 变量。

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

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

4

2 回答 2

1

我发现我写的这个小开关解决了大多数难以获得真实 IP 而不是代理的问题。它检查 theREMOTE_ADDR和 theHTTP_X_FORWARDED_FOR是否相同,如果它们相同,则打印REMOTE_ADDR. 如果它们不同,则假定它HTTP_X_FORWARDED_FOR是正确的,因为它REMOTE_ADDR通常返回代理。希望这可以帮助。请让我知道是否有更好的方法!kevin@tiger-tech.tk

  <?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;
   ?>
于 2014-11-23T05:18:13.680 回答
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 是否在您的代理列表中。

于 2013-07-12T07:30:32.450 回答