首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebRTC。服务器或其他对等服务器是否看到了我的内部IP地址?

WebRTC。服务器或其他对等服务器是否看到了我的内部IP地址?
EN

Stack Overflow用户
提问于 2019-04-13 21:48:11
回答 1查看 2.5K关注 0票数 1

是否可以在浏览器中使用WebRTC获取用户内部IP地址。在这里,浏览器泄漏webrtc我可以看到我的本地IP地址,但是这个地址是通过JS脚本在客户端提取的。下面是如何实现这一目标的最小JS示例

代码语言:javascript
复制
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;
    };
代码语言:javascript
复制
<div id="output">

</div>

正如我们在代码中所看到的,我们从onicecandidate事件中提取ip。

如果我们看一下WebRTC连接流,我们可以看到通过信号通道在对等点之间交换

那么,STUN/TURN服务器是否有可能获取内部IP地址的信息?(我怀疑这是可能的,但只是检查一下)

巧尽心思构建的对等客户端是否能够在连接阶段或当它与另一个对等方交换ICE候选点时获得另一个对等点的内部IP地址?

问题主要是关于安全问题。

EN

回答 1

Stack Overflow用户

发布于 2019-04-18 11:39:37

在某些假设下,您的流程看起来是正确和安全的:

  1. 浏览器支持涓流ICE机制(所有现代浏览器都支持)
  2. 在发送SDP之前,不要等待冰收集成为complete
  3. 您可以从createOffer/createAnswer方法而不是从RTCPeerConnection.localDescription发送SDP。

如果浏览器不支持ICE涓滴,代码会禁用它,或者等待冰收集完成。候选人还将添加到本地SDP,这可能仍然暴露您的内部IP。

下面是当前铬(V73)的工作片段:

代码语言:javascript
复制
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)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55670149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档