2014-11-20 93 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

相關問題