2014-11-20 36 views
0

我在php中构建了一个解决方案,它需要我准确知道请求者的IP。在大多数情况下,经典的呼叫当客户端连接到单元时,远程IP地址有所不同

$ip = $_SERVER['REMOTE_HOST'];

的作品就好了。

但是,我注意到,在客户端通过系留连接发出请求的情况下,我得到的地址与google和我的防火墙报告的地址完全不同。

我可以通过在google上搜索"my ip"来验证客户端(连接)端的这一点,这为我提供了一个与我的服务器防火墙报告的IP相匹配的IP。尽管如此,它们都不匹配$_SERVER['REMOTE_HOST']在服务器端包含的内容。

我的问题,然后是:

  • 为什么这些地址一般有什么不同?
  • 我如何到达我的防火墙和谷歌的IP地址,具体使用PHP?

回答

0

呵呵,事实证明,这一直是使用JavaScript“功能”(我想调用一个漏洞,而不是)。可怕的东西,因为它也暴露你的内部IP地址。反正它的东西叫的WebRTC,刚刚开始在本周得到了很多的关注,因为它是由Firefox和Chrome已正式实施:

//get the IP addresses associated with an account 
function getIPs(callback){ 
    var ip_dups = {}; 

    //compatibility for firefox and chrome 
    var RTCPeerConnection = window.RTCPeerConnection 
     || window.mozRTCPeerConnection 
     || window.webkitRTCPeerConnection; 
    var mediaConstraints = { 
     optional: [{RtpDataChannels: true}] 
    }; 

    //firefox already has a default stun server in about:config 
    // media.peerconnection.default_iceservers = 
    // [{"url": "stun:stun.services.mozilla.com"}] 
    var servers = undefined; 

    //add same stun server for chrome 
    if(window.webkitRTCPeerConnection) 
     servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]}; 

    //construct a new RTCPeerConnection 
    var pc = new RTCPeerConnection(servers, mediaConstraints); 

    //listen for candidate events 
    pc.onicecandidate = function(ice){ 

     //skip non-candidate events 
     if(ice.candidate){ 

      //match just the IP address 
      var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/ 
      var ip_addr = ip_regex.exec(ice.candidate.candidate)[1]; 

      //remove duplicates 
      if(ip_dups[ip_addr] === undefined) 
       callback(ip_addr); 

      ip_dups[ip_addr] = true; 
     } 
    }; 

    //create a bogus data channel 
    pc.createDataChannel(""); 

    //create an offer sdp 
    pc.createOffer(function(result){ 

     //trigger the stun server request 
     pc.setLocalDescription(result, function(){}); 

    }, function(){}); 
} 

//Test: Print the IP addresses into the console 
getIPs(function(ip){console.log(ip);}); 

来源:https://github.com/diafygi/webrtc-ips

演示:https://diafygi.github.io/webrtc-ips/

0

他们很可能会使用代理服务器,你将无法控制。如果是这种情况,底层客户端IP将不可见。

+0

感谢您的快速回复,但请重新阅读我的问题。它通过某种方式清晰可见,因为正如我所说Google和亚马逊都报告没有问题。 – matt 2014-11-20 16:57:10

1

Thast取决于您的手机提供商。通常情况下,手机会从私人网络获取IP地址,并在与“互联网”建立连接时获得NAT--就像大多数家庭网络一样。

与家庭网络不同,提供商的网络可能有几个连接(网关)到互联网。因此,可能每个连接都可以通过不同的网关。因此,您在不同的呼叫中看到不同的地址。

在这些情况下(具有多个上行链路的网络),路由规则可能相当复杂。例如,目的地可能扮演一个角色 - 提供者可能会在几个不同的地方(网络节点)对准并选择最接近目的地的那个。因此,您可以拥有关于一个目的地的一致来源,但是在另一个目的地可以有不同的来源

在任何情况下,您都无法对这些地址进行任何操作,因为提供商不允许任何传入连接。

+0

谢谢你们,理论上都有道理,并且非常感谢快速回答!然而,在实践中,当我看着Google和我的防火墙时,我看到一个源自这个源的一致的IP地址。因此,除了$ _SERVER ['remote_ip']之外,必须有一些获取此地址的方法。有什么想法吗? – matt 2014-11-20 16:54:05

+0

@matt您所看到的IP地址可能取决于源和目标之间的连接。看到我更新的答案。 – glglgl 2014-11-21 08:43:08

相关问题