PHP |从客户端用户获取私有IP地址?

时间:2013-02-23 19:12:27

标签: php http curl ip

我知道问题,但没有在stackoverflow上找到真正的答案。这不是X_FORWARDED_FORSERVER_NAMESERVER_REMOTE_ADDR,我希望获取连接到我的服务器的远程客户端的本地IP地址,以检测本地远程网络上的用户是否已连接。

解释一下:

ISP  <---->  ROUTER <----> LOCAL NETWORK <----> LOCAL PC

我想知道什么?

  1. 已连接的远程客户端$_SERVER["REMOTE_ADDR"]的公共IP地址,好的,但是!...
  2. 公共网络上连接客户端的本地IP地址(192.168.x.x,10.x.x.x,172.x.x.x)
  3. 如何解决这个问题?我已经回答了,所以如果想知道本地IP地址,我想每个人都应该知道这个:

    您应该使用CURLcurl_getinfo()功能。然后,点URL地址任何你想要的人(你的主服务器IP或其他),例如:

    <?php
        $ch = curl_init();
    
        $opt = curl_setopt($ch, CURLOPT_URL, "YOUR_SOME_URL_ADDRESS"); 
    
        curl_exec($ch);
    
        $response = curl_getinfo($ch);
    
        $result = array('client_public_address' => $response["primary_ip"],
                        'client_local_address' => $response["local_ip"]
                );
    
        var_dump($result);
    
        curl_close($ch);
    
    ?>
    

    专注于回复您的公开地址的$response["primary_ip"]和回复本地地址的$response["local_ip"]。现在这是一个例子:

    ISP  <---->  ROUTER <----> LOCAL NETWORK <----> LOCAL PC
     /\                                              /\
     ||                                              ||
     \/                                              \/
    $response["primary_ip"]                  <----> $response["local_ip"]
    213.x.x.x  (for example)                        192.168.1.3 (for example)
    

    结果:

    array (size=2)
      'client_public_address' => string '213.xxx.xxx.xxx' (length=14)
      'client_local_address'  => string '192.168.1.3' (length=11)
    

    这不会提供真正的本地IP地址!

    谢谢。

4 个答案:

答案 0 :(得分:1)

这永远不会起作用 首先,您需要客户端上的HTTP服务器使其响应CURL 即使它会 - 但不保证返回任何“本地IP”。 接下来,将其客户端恢复的HTTP服务器看起来很可疑,很可能会被禁止。

无论如何,我在远程IP上尝试了你的代码:

array(2) {
  ["client_public_address"]=>
  string(7) "8.8.8.8"
  ["client_local_address"]=>
  string(0) ""
}

它什么都没有返回

当我尝试使用本地路由器时,它可以正常工作

array(2) {
  ["client_public_address"]=>
  string(13) "XXX"
  ["client_local_address"]=>
  string(12) "192.168.1.37"
}

它仅适用于自己的本地路由器,但它无法从远程系统获取任何本地地址。
坦率地说,它只显示分配给您PC的本地IP地址。

答案 1 :(得分:1)

默认情况下,本地IP地址不会暴露给应用程序层。您需要可以从网络数据包中提取此信息的较低级别工具。

答案 2 :(得分:0)

您可以使用HTML5功能(CORS和WebSocket)来确定范围(xxx.xxx.xxx.xxx/24),请参阅此实例:

JS-RECON

它的工作原理如何? 您可以扫描IP地址范围(192.168.1.0/24,192.168.0.1/24等)并查找用户使用的范围,但是,查找确切的IP地址仍然很困难。

结果: 不行。 IP为192.168.1.200,返回192.168.1.2;网站无效,工具无法正常工作。

答案 3 :(得分:-3)

    function getRealIpAddr(){ 
        //check ip from share internet 
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) { 
            $ip=$_SERVER['HTTP_CLIENT_IP'];
        } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
         //to check ip is pass from proxy 
            $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
        } else { 
            $ip=$_SERVER['REMOTE_ADDR']; 
        }

       return $ip; 
    }