刚刚注意到仅在 Chrome 上,RTCIceCandidate 不再返回 IP,而是一个混淆的地址。
RTCIceCandidate
address: "a5b3ef18-2e66-4e24-91d2-893b93bbc1c1.local"
candidate: "candidate:169888242 1 udp 2113937151 a5b3ef18-2e66-4e24-91d2-893b93bbc1c1.local 47871 typ host generation 0 ufrag 7dHv network-cost 999"
component: "rtp"
foundation: "169888242"
port: 47871
priority: 2113937151
protocol: "udp"
relatedAddress: null
relatedPort: null
sdpMLineIndex: 0
sdpMid: "0"
tcpType: ""
type: "host"
usernameFragment: "7dHv"
Run Code Online (Sandbox Code Playgroud)
注意 RTCIceCanadate 的第一个属性是“address”,“ip”不再是这个对象的一部分。
以下代码确定浏览器的本地 IP 地址。仍然适用于 MOZ。
function discover()
{
try{
//Get Local IP
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
if (pc)
pc.close();
pc = new RTCPeerConnection({iceServers:[]});
pc.onicecandidate = onIceCandidate;
pc.createDataChannel("");
pc.createOffer(pc.setLocalDescription.bind(pc), noop);
} catch (e)
{ console.log(e.message);}
}
function noop()
{
}
function onIceCandidate(ice)
{
console.log(ice.candidate);
if(!ice || !ice.candidate || !ice.candidate.candidate) return;
var my_ip = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
this.onicecandidate = noop;
ip = my_ip.split(".")[0]+'.'+my_ip.split(".")[1]+'.'+my_ip.split(".")[2];
}
Run Code Online (Sandbox Code Playgroud)
WebRTC 现在正式是一个支离破碎的标准了吗?MOZ 仍然将 "ip" 列为RTCIceCandidate的成员,而没有提及 Chrome 返回的 "address" 成员。
有没有办法将 mDNS 地址反混淆为 ip 地址,而不会强迫用户搞乱他们不理解的浏览器设置?
Chrome 没有损坏,WebRTC 标准正在发展,以防止网站通过转移 WebRTC API 来收集本地地址。如果您使用此 hack 来获取本地地址,则可能需要找到另一种方法。
以下是Chromium和Firefox的相应问题,以及WebRTC mDNS 候选者的当前IETF 草案。
我注意到这种情况正在发生,只返回一个 mDNS 地址(有关混淆的更多信息,请阅读这篇完整解释所发生情况的精彩文章)。
然而,我确实找到了一个新的存储库,它似乎可以“修复”这个问题(可以工作,但不暴露私有 IP,仅暴露公共 IP)。可以在此处找到它,并且可以在此处找到示例。
| 归档时间: |
|
| 查看次数: |
8690 次 |
| 最近记录: |