是否可以通过在浏览器中使用WebRTC获取用户内部IP地址。 在browserleaks 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的连接流程,我们可以看到ICE候选对象之间通过信号Channel进行交换
那么STUN / TURN服务器能否获得内部IP地址信息? (我怀疑这是可能的,但是只是检查一下)
经特殊设计的对等客户端能否在连接阶段或与其他对等交换ICE候选者时获取另一个对等的内部IP地址?
问题主要是关于安全问题
答案 0 :(得分:0)
在某些假设下,您的流程看起来正确且安全:
complete
结冰createOffer
/ createAnswer
方法而不是RTCPeerConnection.localDescription
发送SDP。如果浏览器不支持ICE细流,则该代码将被禁用,或者您等待冰收集完成。候选者也将添加到本地SDP,该SDP可能仍会公开您的内部IP。
这是当前Chrome(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)
}
}