我正在用php构建一个解决方案,它要求我准确地知道请求者的ip。在大多数情况下,经典的调用
$ip = $_SERVER['REMOTE_HOST'];
效果很好。
但是,我已经注意到,在客户端通过绑定连接提出请求的情况下,我得到的地址与google和我的防火墙报告的地址完全不同。
我可以通过在谷歌上搜索“我的ip”来在客户端验证这一点,这给了我一个与我的服务器防火墙所报告的内容相匹配的IP。但是,这两种方法都不匹配$_SERVER['REMOTE_HOST']在服务器端包含的内容。
我的问题是:
发布于 2015-01-28 17:51:11
事实上,这一直是使用javascript“特性”(我会把它称为漏洞)来完成的。可怕的东西,因为它也暴露了你的内部IP地址。不管怎么说,这是一个叫做WebRTC的东西,在火狐和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);});发布于 2014-11-20 16:50:41
这取决于你的手机提供商。通常情况下,你的手机会从私人范围获得一个IP地址,并在连接“互联网”时获得NATed --就像大多数家庭网络一样。
不像家庭网络,供应商的网络可能有几个连接(网关)到互联网。所以你所做的每一个连接都可以通过一个不同的网关。因此,您可以在不同的电话中看到不同的地址。
在这些情况下(具有多个上行链路的网络),路由规则可能相当复杂。因此,例如,目标可能扮演一个角色-提供者可能在几个不同的地方(网络节点)窥视,并选择一个最近的目的地。因此,对于一个目的地,您可以有一致的源,但对于另一个目的地,可以有不同的源。
无论如何,您不能对这些地址做任何事情,因为提供程序不允许任何传入连接。
发布于 2014-11-20 16:43:27
他们很可能正在使用代理服务器,您将无法控制代理服务器。如果是这样的话,底层的客户端IP将不可见。
https://stackoverflow.com/questions/27044902
复制相似问题