无法从 RTCPeerConnection 获取 IP V4 地址 - chrome

2024-01-14

我需要从 Web 应用程序获取客户端本地 IP 地址。

为此,我使用标准 RTCPeerConnection 实现来获取。但是返回的ice候选并不携带IP V4地址,而是一个看起来像guid的地址:asdf-xxxx-saass-xxxx.local

但令人惊讶的是这个镀铬扩展 https://chrome.google.com/webstore/detail/show-my-ip-addresses-exte/opljiobgnagdjikipnagigiacllolpaj能够在同一台机器和浏览器上获取相同的内容。

注意:我在网络应用程序中使用的代码与扩展程序的代码相同

这是相同的 html 代码:

<html>

<head>

    <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.1.js"></script>

    <script type="text/javascript">

        function logit(msg) {
            var dt = new Date(); var time = dt.getHours() + ":" + dt.getMinutes() + ":"
                + dt.getSeconds();
            console.log(time + " " + msg);
        };

        function getChromeVersion() {
            try {
                var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
                return raw ? parseInt(raw[2], 10) : false;
            } catch (e) {
                return null;
            }
        }

        function getChromeManifest() {
            return chrome.runtime && typeof chrome.runtime === "function" ? chrome.runtime.getManifest() : {}
        }

        function getUserIP(callback) {

            logit(" getting user local ip ")

            getLocalIPs(function (ips) {

                logit(" got user local ip : " + ips)

                if (ips && ips.length) return callback(ips[0]);

                logit(" getting user local ip with stun ")

                getLocalIPs(function (ips) {

                    logit(" got user local ip with stun : " + ips)

                    if (ips && ips.length) return callback(ips[0])

                    logit(" cannot get user local ip, returning null ")

                    callback(null)
                }, true, 2000)
            })
        }

        function getLocalIPs(callback, withStun, timeout) {

            var ips = [];

            var RTCPeerConnection = window.RTCPeerConnection ||
                window.webkitRTCPeerConnection || window.mozRTCPeerConnection;

            var pc = new RTCPeerConnection({
                // Don't specify any stun/turn servers, otherwise you will
                // also find your public IP addresses.
                // iceServers: [],
                iceServers: withStun ? [{ urls: "stun:stun.services.mozilla.com" }] : []
            });

            var closeAndCallback = function () {

                clearTimeout(waitTimeout)

                try {
                    if (pc && pc.close) {
                        pc.close();
                    }
                } catch (e) { console.log("exception while closing pc, err: %s", err) }

                callback(ips);
            }

            var waitTimeout = timeout ? setTimeout(closeAndCallback, timeout) : null;

            // Add a media line, this is needed to activate candidate gathering.
            pc.createDataChannel('');

            // onicecandidate is triggered whenever a candidate has been found.
            pc.onicecandidate = function (e) {

                console.log(e)

                if (!e.candidate) { // Candidate gathering completed.
                    pc.close();
                    closeAndCallback();
                    return;
                }
                var ip = /^candidate:.+ (\S+) \d+ typ/.exec(e.candidate.candidate)[1];
                if (ips.indexOf(ip) == -1) // avoid duplicate entries (tcp/udp)
                    ips.push(ip);
            };
            pc.createOffer(function (sdp) {
                pc.setLocalDescription(sdp);
            }, function onerror() { });
        };

        function callThirdParty(server, name) {
            var api = server;
            logit("Connecting " + server + " ...");
            $.ajax({
                type: "GET",
                url: api,
                success: function (data) {
                    if (data && data['ip']) {
                        logit("Public IP: " + data['ip']);
                    }
                }, error:
                    function (request, status, error) {
                        logit('Response: ' + request.responseText);
                        logit(' Error: ' + error);
                        logit(' Status: ' + status);
                    },
                complete: function (data) {
                    logit(' API Finished: ' + name + " Server!");
                }
            });
        }

        document.addEventListener('DOMContentLoaded', function () {
            getUserIP(function (ip) { //

                ipaddress = ip;
                $('#ip2').html(ipaddress);
                var manifest = getChromeManifest();
                logit(manifest.name);
                logit("Version: " + manifest.version);
                logit("Chrome Version: " + getChromeVersion());
                callThirdParty("https://api.ipify.org?format=json", "ipify.org");
            }, 100);
        }, false);
    </script>
</head>

<p>Public IPs</p>
<div id="ip"></div>

<p>Local IP</p>
<div id="ip2"></div>

<p>Logs</p>
<div id="log"></div>
<div id="log1"></div>
<div id="log2"></div>

</html>

TL;DR

看起来本地地址正在/将使用 mDNS 进行匿名化,并且该标志的默认设置将逐渐设置为Enabled适用于所有 Chrome 用户。

对于本地开发请查看此处(设置为Disable): chrome://flags/#enable-webrtc-hide-local-ips-with-mdns

除非有人找到一些聪明的技巧,否则您可能无法为您的网络应用程序的用户恢复更改。


该 guid 实际上是 mDNS 地址。快速搜索 Chromium 中最新的 WebRTC bug揭示了一些有趣的条目,并且 StackOverflow 上也有一些关于匿名化的问题not工作(就像这样:Google Chrome M74 对 WebRTC 的 mDNS 支持 https://stackoverflow.com/questions/55163923/mdns-support-for-webrtc-at-google-chrome-m74).

现在我在少数装有 Windows 10 的计算机上看到了 Chrome 75 的效果 - 一些以前能够完美检测本地 IP 的网站(http://net.ipcalf.com http://net.ipcalf.com, https://ipleak.net https://ipleak.net, https://browserleaks.com/webrtc https://browserleaks.com/webrtc) 现在不显示它或显示 mDNS url。

作为旁注:启用 mDNS 标志后,您链接的扩展程序无法检测到我的确切本地 IP。相反,它几乎没有显示来自 /24 地址组的候选者。即使如此,扩展也可以以某种方式获得特权,因此它不会受到 mDNS 匿名化的太大影响。


编辑(2020 年 3 月):看起来 Firefox 也可以匿名本地 IP。

截至 2020 年 3 月,有两种设置about:config page:

  • media.peerconnection.ice.obfuscate_host_addresses- 设置为 true 时,会将本地 IP 更改为 {uuid}.local
  • media.peerconnection.ice.obfuscate_host_addresses.whitelist- 带有 URL 的字符串,即使启用了混淆,也能够检索真实 IP

我检查了 Firefox 73 和 Developer Edition 74(没有任何可以更改设置的扩展),首先有obfuscate_host_addresses设置为 false,而开发版已启用它。


编辑(2020 年 10 月):从 Chrome 86 开始,mDNS 设置已启用,并且无法再通过 chrome://flags 禁用(没有可用的选项)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法从 RTCPeerConnection 获取 IP V4 地址 - chrome 的相关文章

  • 为什么 Chrome 审核建议我最小化 Cookie 大小?

    如何最小化请求的 cookie 大小 Chrome 似乎 警告我 我的 cookie 大小为 41B 这根本不是很多 但是它警告我有什么原因吗 这是一个 PHPSESSID cookie 我真的不知道如何最小化它 有任何想法吗 我的请求响应
  • 对于某些文件,通过 NPAPI 浏览器的 Office 授权插件在 Chrome 中打开 webdav 文件失败

    好吧 这是一个棘手的问题 因为它涉及很多变量 一个 webdav 服务器 我使用了 webdav net 服务器 http www webdavsystem com server http www webdavsystem com serv
  • 为什么 Chrome 给 body 元素添加边距? [复制]

    这个问题在这里已经有答案了 我有简单的 html 文档 是进入身体的一种元素 当我在 div 元素中设置 margin top 时 Chrome 会向 body 添加相同的边距 边距仅在开发者工具中可见 我的代码 div Test div
  • SSE(EventSource):为什么不超过6个连接?

    我想看看在我的机器超载之前我可以设置多少个并发 SSE 又名 EventSource 连接 但使用 Firefox Firefox 18 或 Firefox 20 进行测试时 它在 6 个连接处停止 附加连接没有给出错误 但不发送任何数据
  • Chrome 扩展程序可有效阻止域名

    我正在制作一个非常简单的 Chrome 扩展来阻止对某些域的请求 厌倦了许多网站上缓慢的页面加载 等待 Facebook 垃圾 我的问题是关于如何有效加载用户指定的域列表 这Chrome 文档 https developer chrome
  • 阻止原始框架“null”访问跨原始框架 - chrome

    我是 Javascript 新手 正在通过一本重点介绍其在 IE 7 和 Firefox 2 中应用的教科书来学习基础知识 但是 我正在使用 Chrome 并且在运行书中给出的程序时出现以下错误 阻止了原点 null 的框架访问跨源框架 谁
  • Chrome 中的 net::ERR_INSECURE_RESPONSE

    从 API 获取一些数据时 我在 Chrome 控制台中收到错误 net ERR INSECURE RESPONSE 此错误通常是由于未签名的证书造成的 但是 这不是问题 因为我有有效且签名的证书 该错误根本不会经常发生 如果我重新启动 C
  • Firefox CSS 旋转与 Chrome 旋转不同

    我想制作一个 3D 矩形 平行六面体 用户可以用箭头移动它 它在 Chrome 中工作得很好 但在 Firefox 中 一些转换 实际上很多 与 Chrome 不同 看着this https jsfiddle net 7273yur9 2
  • 谷歌浏览器不显示一个网站的alert()弹出窗口

    我正在开发一个 javascript 循环 该循环会随着循环的进行而提醒每个键值 为了加快速度 我选中了 阻止此页面创建其他对话框 框 通常这只会抑制一个例程的弹出窗口 但它们还没有回来 在 Google Chrome 中 alert 消息
  • ASP.NET - Google Chrome 缓存 DropDownList 选择

    我的购物车页面上的 Google Chrome 和 Safari 似乎遇到了缓存问题 购物车中有 2 个下拉列表 当您在更改下拉列表中的值后点击结帐按钮时 它会将列表中选择的内容提交到数据库 解释意外的行为有点困难 所以我会尝试一步一步地写
  • Keycloak:使用新的 Chrome SameSite/Secure cookie 强制执行时,令牌请求中缺少会话 cookie

    最近 我使用 Keycloak 的应用程序在身份验证后停止处理 400 令牌请求 到目前为止 我发现在令牌请求中 Keycloak cookie AUTH SESSION ID KEYCLOAK IDENTITY KEYCLOAK SESS
  • Chrome 开发工具无法显示响应,即使返回的内容具有标题 Content-Type:text/html;字符集=UTF-8

    为什么我的 Chrome 开发者工具显示 无法显示响应数据 当返回的内容是text html类型时响应 在开发者工具中查看返回的响应的替代方法是什么 我认为只有当您选中 保留日志 并且您在导航离开后尝试查看先前请求的响应数据时 才会发生这种
  • Chrome 内存/垃圾收集问题

    我在使用 Chrome 时遇到内存 垃圾收集问题 我正在开发一个照片上传网站 该网站允许我的客户使用 HTML5 和文件 API 拖放照片进行上传 因此这在 IE 中不起作用 它仅适用于 Chrome 和 FF 我还没有在 Safari O
  • Selenium 不会在新选项卡中打开新 URL(Python 和 Chrome)

    我想使用 Selenium WebDriver 和 Python 在不同的选项卡中打开相当多的 URL 我不确定出了什么问题 driver webdriver Chrome driver get url1 time sleep 5 driv
  • Service Worker 对 CSS 的响应时间较慢

    我们在 sw toolbox 之上编写了 Service Worker 一旦静态资源被缓存 Service Worker 就会花费更长的时间 特别是下载 css 资源 30 100 毫秒 而对于 js 资源 时间几乎为 0 CSS 加载时间
  • Chrome 扩展程序可以相互通信吗?

    我正在编写一个Chrome扩展程序 并且想要实现一个接口或api 以便我将来制作的其他扩展程序可以使用它 最终的效果可能如下 分机 B 呼叫extensionA someMethod someParameters 并向分机A发送一些数据 分
  • 使用 # 时锚点 标签在 Chrome 中不起作用

    这是我在页面上使用的代码 li a href explore Sound Sound a li 在所有页面上出现的菜单中 a a 在我想要链接的页面上 我尝试过使用 id 将内容添加到标签中 但仅在 Chrome 中 浏览器不会向下滚动到该
  • 在 Chrome 中隐藏 HTML 时间输入字段上的图标

    在 Chrome 中 当您type time 属性到输入框 您会在输入旁边看到一个小图标时钟图标 有没有办法去掉这个小时钟图标 基于这个问题的答案 将日期输入三角形更改为日历图标 https stackoverflow com questi
  • 最新版 Firefox for Android 36.0 不支持应用深度链接

    我有一个 android 应用程序 在其中定义了意图过滤器来处理对我的网站的任何 http 请求 以在我构建的应用程序中打开 在 Chrome 上 我收到在应用程序中打开的提示 但在 Firefox 上却没有 这在 Firefox 上还没有
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程

随机推荐