是否可以在浏览器中使用WebRTC获取用户内部IP地址。在这里,浏览器泄漏webrtc我可以看到我的本地IP地址,但是这个地址是通过JS脚本在客户端提取的。下面是如何实现这一目标的最小JS示例
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description
pc.onicecandidate = function(ice){ //listen for candidate events
if(!ice || !ice.candidate || !ice.candidate.candidate) return;
var myIP = /([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];
document.querySelector('#output').innerHTML=myIP
//console.log('my IP: ', myIP);
pc.onicecandidate = noop;
};<div id="output">
</div>
正如我们在代码中所看到的,我们从onicecandidate事件中提取ip。
如果我们看一下WebRTC连接流,我们可以看到通过信号通道在对等点之间交换

那么,STUN/TURN服务器是否有可能获取内部IP地址的信息?(我怀疑这是可能的,但只是检查一下)
巧尽心思构建的对等客户端是否能够在连接阶段或当它与另一个对等方交换ICE候选点时获得另一个对等点的内部IP地址?
问题主要是关于安全问题。
发布于 2019-04-18 11:39:37
在某些假设下,您的流程看起来是正确和安全的:
complete。createOffer/createAnswer方法而不是从RTCPeerConnection.localDescription发送SDP。如果浏览器不支持ICE涓滴,代码会禁用它,或者等待冰收集完成。候选人还将添加到本地SDP,这可能仍然暴露您的内部IP。
下面是当前铬(V73)的工作片段:
const canvas = document.createElement('canvas');
const track = canvas.captureStream(1).getTracks()[0];
const pc = new RTCPeerConnection();
pc.addTrack(track);
pc.createOffer().then(offer => pc.setLocalDescription(offer))
pc.onicecandidate = () => {};
pc.onicegatheringstatechange = () => {
if(pc.iceGatheringState === 'complete') {
const sdp = pc.localDescription.sdp;
const sdpRows = sdp.split('\n')
const candidates = sdpRows.filter(row => row.indexOf('a=candidate') === 0);
console.log(candidates)
}
}https://stackoverflow.com/questions/55670149
复制相似问题