纽约时报使用Html5 WebRTC记录访问者IP地址


发布者 ourjs  发布时间 1437728258715
关键字 编程技巧  JavaScript 
如果你要黑别人,至少做的干净点!

纽约时报使用WebRTC收集你的本地IP地址... Tsahi在自己的博客从非技术角度描述了这个问题。让我们看一下技术细节......

事实证明,使用的Javascript实现的代码很笨重,效率低下。

首先要做的是检测 chrome://webrtc-internals 然后nytimes.com使用了 RTCPeerConnection API。我们可以看到他创建了一个peerconnection连接(端到端),并且RtpDataChannels参数设置为true,并且将stun:ph.tagsrvcs.com作为STUN服务器。

而且,我们看到,有个数据通道被创建(daa channel),接着调用createOffer和setLocalDescription。这是两个很常见收集IP地址的方法。

你可以通过Chrome的开发工具搜索到这个文件,RTCPeerConnection在下面的JavaScript文件中创建: http://s.tagsrvcs.com/2/4.10.0/loaded.js


它是被压缩过的,这是这段收集IP地址的代码


Mt = function() {
    function e() {
        this.addrsFound = {
            "0.0.0.0": 1
        }
    }
    return e.prototype.grepSDP = function(e, t) {
        var n = this;
        if (e) {
            var o = [];
            e.split("\r\n").forEach(function(e) {
                if (0 == e.indexOf("a=candidate") || 0 == e.indexOf("candidate:")) {
                    var t = e.split(" "),
                        i = t[4],
                        r = t[7];
                    ("host" === r || "srflx" === r) && (n.addrsFound[i] || (o.push(i), n.addrsFound[i] = 1))
                } else if (0 == e.indexOf("c=")) {
                    var t = e.split(" "),
                        i = t[2];
                    n.addrsFound[i] || (o.push(i), n.addrsFound[i] = 1)
                }
            }), o.length > 0 && t.queue(new y("webRTC", o))
        }
    }, e.prototype.run = function(e) {
        var t = this;
        if (c.wrip) {
            var n = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
            if (n) {
                var o = {
                        optional: [{
                            RtpDataChannels: !0
                        }]
                    },
                    i = []; - 1 == w.baseDomain.indexOf("update.") && i.push({
                    url: "stun:ph." + w.baseDomain
                });
                var r = new n({
                    iceServers: i
                }, o);
                r.onicecandidate = function(n) {
                    n.candidate && t.grepSDP(n.candidate.candidate, e)
                }, r.createDataChannel(""), r.createOffer(function(e) {
                    r.setLocalDescription(e, function() {}, function() {})
                }, function() {});
                var a = 0,
                    s = setInterval(function() {
                        null != r.localDescription && t.grepSDP(r.localDescription.sdp, e), ++a > 15 && (clearInterval(s), r.close())
                    }, 200)
            }
        }
    }, e
}(),


该代码在onicecandidate上绑定了回调并通过它得到candidate。然后,数据信道被创建,并通过createOffer和setLocalDescription启动收集过程。
此外,在下面的代码片段中


var a = 0,
s = setInterval(function() {
    null != r.localDescription && t.grepSDP(r.localDescription.sdp, e), ++a > 15 && (clearInterval(s), r.close())
}, 200)


该localDescription每200ms重做一次,持续三秒钟。这个轮询是完全没有必要的。





回复 (3)
  • #
  • #1 null 1502718019638

    -_-

  • #2 古尘机 1527229293992

    kfdgdfgs**加粗文本**

  • #3 古尘机 1527229354635

    sdf

    dfsdf

微信扫码 立即评论