我一直在使用以下代码来检测运行某些专有软件的客户端的LAN IP地址(请不要使用“您不应该这样做”,我没有编写代码)。
function ip_local()
{
var ip = false;
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection || false;
if (window.RTCPeerConnection)
{
ip = [];
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
pc.createDataChannel('');
pc.createOffer(pc.setLocalDescription.bind(pc), noop);
pc.onicecandidate = function(event)
{
if (event && event.candidate && event.candidate.candidate)
{
var s = event.candidate.candidate.split('\n');
ip.push(s[0].split(' ')[4]);
}
}
}
return ip;
}
ip_local();
这是另一个StackOverflow帖子的内容,直到今天下午,该代码已经可以正常工作一年半了。
我的本地IP似乎被检测为153b3a68-e3fb-4451-9717-d9b3bc2b5c60.local,而不是通常的192.168.0.11。
编辑: 如果有人在乎,这个问题是无法绕过的,必须通过服务器端语言来解决,就我而言,我最终将PHP用作解决该问题的临时“创可贴”。
这对我的应用程序来说是个问题,因为它会检测主机上是否正在运行本地服务器。如果无法检测到LAN IP地址,它将无法执行。
答案 0 :(得分:1)
这是新安全标准的一部分,目的是防止私有IP地址泄漏。
另请参阅:https://tools.ietf.org/html/draft-ietf-rtcweb-mdns-ice-candidates-02
摘要:
如[IPHandling]中所述,通过以下方式公开客户端专用IP地址: 默认值可最大程度地提高成功创建直接交易的可能性 两个客户端之间的对等连接,但会创建一个 用户指纹的重要表面。 [IPHandling]识别 这个问题,但也承认目前没有解决方案 问题;选择使用模式3来解决 隐私问题通常会因连接失败或连接不佳而受到影响 在WebRTC应用程序中。在不受管理的情况下,这尤其是一个问题 网络,通常是家庭或小型办公室,可能会发生NAT环回 不支持。
本文档通过以下方式提出了针对此问题的整体解决方案 为每个本地私有IP地址注册临时mDNS名称, 然后将这些名称而不是IP地址提供给 Web应用程序收集ICE候选者时。 WebRTC 实现将这些名称解析为IP地址并执行ICE 照常进行处理,但实际的IP地址没有暴露给 Web应用程序。