WebRTC 获取 IP 不一致
WebRTC get IP inconsistencies
我的朋友最近完成了一个我听说了一段时间的项目,我想测试一下。可以找到源代码here。我首先尝试将代码包含在我脑海中的 <script>
标记中,但他说 jsdelivr 尚未更新他们的数据库。
但是,他告诉我/dist
文件夹是代码,所以我复制production.min.js
并粘贴到JSFiddle中进行测试。
现在,我得到的结果非常不一致。例如,在 fiddle 中它没有 return 任何东西,但是当我查看控制台时,我看到了这个图像:
公开我的 3 个 IP,我的本地 IPv6,临时 IPv6 和我的 IPv4,只是复制的,它完成了一项令人难以置信的工作。然而,它在一个集合中,而且,我得到一个错误: No IP addresses found
当 Private 或 Public 的 returned 数组时,它(在查看源代码时)似乎被抛出空。
现在,我再次联系了我的朋友,他向我展示了位于 here 的工作 fiddle。但是,当我在这里测试时,它不起作用:
function getPrivateIPs(timer) {
return new Promise((resolve, reject)=>{
var ipArray = [];
var emptyConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
var pc = new emptyConnection();
var emptyFunc = function(){};
var ipList = {};
var simpleIPRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g;
function start(){
pc.createDataChannel("");
pc.onicecandidate = handleCandidates;
createConnection();
startTimer();
};
function push(ip) {
if (!ipList[ip]) ipArray.push(ip);
ipList[ip] = true;
};
function createConnection(){
pc.createOffer(function(data) {
data.sdp.split('\n').forEach(function(line) {
if (line.indexOf('candidate') === -1) return;
line.match(simpleIPRegex).forEach(push);
});
pc.setLocalDescription(data);
}, emptyFunc);
};
function handleCandidates(ice) {
if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(simpleIPRegex)) return;
ice.candidate.candidate.match(simpleIPRegex).forEach(push);
};
function startTimer(){
setTimeout(()=>{
if(ipArray && ipArray.length){
resolve(ipArray);
stop();
} else{
reject('No IPs found.');
stop();
};
}, timer || 500);
}
function stop(){
if (pc) {
try {
pc.close();
} finally {
pc.onicecandidate = () => {};
pc = null;
};
};
};
return start();
})
}
getPrivateIPs(200).then(console.log)
此外,将代码片段粘贴到各个网站的开发者控制台似乎会产生不同的结果。例如,空白 Google 选项卡 100% 的时间对我来说 returned 我的 IP,而 Whosebug return 和其他网站一样 Github 也是错误。
是什么导致了这些不一致?似乎有些站点混淆了 IP,而其他站点则没有(我得到的 IP 像 a15b7927-5ef6-4f58-9748-1e40aec155b4.local
、mDNS IP)。这很常见吗?谢谢!
这与@SeanDuBois 在评论中所说的有关。 WebRTC 数据通道现在使用 mDNS IP 而不是您的私有 IP,正如 Phillip Hanke 所说 here,您可以对这些 IP 进行去混淆处理,但永远无法在浏览器中进行。
我的朋友最近完成了一个我听说了一段时间的项目,我想测试一下。可以找到源代码here。我首先尝试将代码包含在我脑海中的 <script>
标记中,但他说 jsdelivr 尚未更新他们的数据库。
但是,他告诉我/dist
文件夹是代码,所以我复制production.min.js
并粘贴到JSFiddle中进行测试。
现在,我得到的结果非常不一致。例如,在 fiddle 中它没有 return 任何东西,但是当我查看控制台时,我看到了这个图像:
公开我的 3 个 IP,我的本地 IPv6,临时 IPv6 和我的 IPv4,只是复制的,它完成了一项令人难以置信的工作。然而,它在一个集合中,而且,我得到一个错误: No IP addresses found
当 Private 或 Public 的 returned 数组时,它(在查看源代码时)似乎被抛出空。
现在,我再次联系了我的朋友,他向我展示了位于 here 的工作 fiddle。但是,当我在这里测试时,它不起作用:
function getPrivateIPs(timer) {
return new Promise((resolve, reject)=>{
var ipArray = [];
var emptyConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
var pc = new emptyConnection();
var emptyFunc = function(){};
var ipList = {};
var simpleIPRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g;
function start(){
pc.createDataChannel("");
pc.onicecandidate = handleCandidates;
createConnection();
startTimer();
};
function push(ip) {
if (!ipList[ip]) ipArray.push(ip);
ipList[ip] = true;
};
function createConnection(){
pc.createOffer(function(data) {
data.sdp.split('\n').forEach(function(line) {
if (line.indexOf('candidate') === -1) return;
line.match(simpleIPRegex).forEach(push);
});
pc.setLocalDescription(data);
}, emptyFunc);
};
function handleCandidates(ice) {
if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(simpleIPRegex)) return;
ice.candidate.candidate.match(simpleIPRegex).forEach(push);
};
function startTimer(){
setTimeout(()=>{
if(ipArray && ipArray.length){
resolve(ipArray);
stop();
} else{
reject('No IPs found.');
stop();
};
}, timer || 500);
}
function stop(){
if (pc) {
try {
pc.close();
} finally {
pc.onicecandidate = () => {};
pc = null;
};
};
};
return start();
})
}
getPrivateIPs(200).then(console.log)
此外,将代码片段粘贴到各个网站的开发者控制台似乎会产生不同的结果。例如,空白 Google 选项卡 100% 的时间对我来说 returned 我的 IP,而 Whosebug return 和其他网站一样 Github 也是错误。
是什么导致了这些不一致?似乎有些站点混淆了 IP,而其他站点则没有(我得到的 IP 像 a15b7927-5ef6-4f58-9748-1e40aec155b4.local
、mDNS IP)。这很常见吗?谢谢!
这与@SeanDuBois 在评论中所说的有关。 WebRTC 数据通道现在使用 mDNS IP 而不是您的私有 IP,正如 Phillip Hanke 所说 here,您可以对这些 IP 进行去混淆处理,但永远无法在浏览器中进行。