OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

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


分享到
分类 编程技巧   关键字 JavaScript   发布 ourjs  1437728258715
注意 转载须保留原文链接,译文链接,作者译者等信息。  
如果你要黑别人,至少做的干净点!

纽约时报使用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重做一次,持续三秒钟。这个轮询是完全没有必要的。

原文地址: 点此
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 我是怎么从顾虑到热爱ReactJS的(与AngularJS经典MVC数据绑定的对比)
  2. JavaScript中的哈希表(Hash Maps的最佳实践)
  3. JSON序列化(stringify)对象时排除某些属性的两种方法
  4. WowJS:在滚动页面时添加动画效果的简单实现
  5. Node.js中的通用基础设计模式
  6. LightGL轻量级的WebGL 3D渲染库
  7. JSGraphs目前最全的JavaScrtip开源图表库集合
  8. 闪客时代开始被HTML5慢慢终结:Facebook首席安全官号召设定正式消灭Flash的期限
  9. [PPT]JavaScript初级教程
  10. 在Debian/Ubuntu上面安装升级nginx到最新版
  11. AirJD-简单好用的免费建站工具

 相关阅读 - 编程技巧
  1. 在Debian/Ubuntu上面安装升级nginx到最新版
  2. 编写高性能HTML网页应用
  3. 在Debian(Respberry PI)上安装FTP服务器
  4. 使用Google Analytics跟踪捕获JavaScript,AngularJS,jQuery的在线错误和异常
  5. Node.JS开发者常犯的10个错误(一)
  6. CSS3实现的响应式字体:自适应视图窗口大小的新单位
  7. 更快地定位DOM(HTML)元素的方法(Rails)
  8. Go语言实例教程基础语法:数组操作篇(二)
  9. 一些你不知道的JavaScript Console调试命令
  10. Go语言实例教程基础语法篇(一)

 关键字 - JavaScript
  1. JavaScript中的继承,构造函数以及new关键字的作用
  2. 纽约时报使用Html5 WebRTC记录访问者IP地址
  3. 正则中test、exec、match的简单区别,以及括号的用法
  4. NativeScript的工作原理:用JavaScript调用原生API实现跨平台
  5. 2015年的JavaScript:Angular之类的框架将被库取代
  6. 少年,不要滥用箭头函数啊:JS中lambda表达式的优缺点和使用场景
  7. JavaScript中NaN的秘密
  8. 如何用CSS将select/option文本居中或居右对齐
  9. 什么是Ajax? 详解原生js ajax
  10. 用原生HTML5控件实现输入框自动提示(下拉列表补全)功能

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号