在浏览器中使用WebRTC获取用户IP地址

news2025/1/10 2:03:58

图像来源:visuals on Unsplash

本文翻译自 Discover WebRTC: Obtain User IP Addresses in the Browser,作者:Zack, 略有删改。

如果需要在程序中获取当前用户的IP,通常手段都是需要使用服务器。但现在借助WebRTC的强大功能,我们可以直接在浏览器客户端获取用户IP。

什么是WebRTC

WebRTC是一个开源项目,通过简单的API为Web浏览器和移动的应用程序提供实时通信功能。WebRTC支持浏览器之间的音频、视频和数据流,允许开发人员构建视频聊天、文件传输和屏幕共享等应用程序,而无需依赖第三方插件或扩展。

WebRTC的关键组件

WebRTC由几个关键组件组成,这些组件共同提供实时通信:

  • getUserMedia:允许访问用户的网络摄像头和麦克风。
  • RTCPeerConnection:管理建立和维护对等点之间连接的整个过程。
  • RTCDataChannel:支持对等点之间的双向数据传输,允许低延迟通信。

WebRTC协议

  • WebRTC依赖于几种协议来建立和维护对等体之间的连接:
  • ICE(Interactive Connectivity Establishment):通过NAT(Network Address Translators)和防火墙连接对等体的框架,ICE使用STUN和TURN服务器来发现和中继网络信息。
  • STUN(Session Traffic Utilities for NAT):一种允许客户端发现其公有IP地址和所处NAT类型的协议。
  • TURN(使用NAT周围的中继进行传输):为由于NAT限制或防火墙而无法建立直接连接的对等体提供中继服务器的协议。

使用WebRTC获取用户IP地址

需要注意的是,使用WebRTC获取用户IP地址可能会引发隐私问题。在收集任何信息(包括IP地址)之前,必须通知您的用户并征得他们的同意。

要使用WebRTC获取用户的IP地址,您可以利用ICE流程,该流程在对等点之间交换网络信息。在ICE过程中,浏览器收集本地IP地址并生成包含此信息的ICE候选。

创建RTCPeerConnection

开始获取用户IP地址的过程,请使用ICE服务器创建一个RTCPeerConnection

const iceServers = [
  {
    urls: "stun:stun.l.google.com:19302",
  },
];

const peerConnection = new RTCPeerConnection({ iceServers });

这个连接对象表示两个对等体之间的连接,负责管理数据交换。

stun:stun.l.google.com:19302”是由Google提供的公共STUN服务器,它是一个高度可靠的免费公共STUN服务器。如果需要,您可以选择使用自己的STUN服务器。

创建数据通道

对于某些浏览器(如Chrome),创建数据通道是触发ICE进程所必需的。您可以使用createDataChannel方法创建数据通道:

peerConnection.createDataChannel("");

处理 ICE 候选项

监听onicecandidate事件以在生成ICE候选时收集IP地址:

peerConnection.onicecandidate = (event) => {
  console.log("RTC Peer Connection Ice Event:", event);
};

触发ICE

调用createOffersetLocalDescription方法触发ICE进程:

peerConnection
  .createOffer()
  .then((offer) => peerConnection.setLocalDescription(offer))
  .catch((error) => console.error("Error creating offer:", error));

提取IP地址

一旦我们收集了ICE候选项,我们就可以从中提取用户的IP地址。每个ICE候选包含关于潜在网络路径的信息,包括IP地址和端口。

所以在onicecandidate中,我们可以创建一个正则表达式来提取IP地址,代码如下:

const ipv4Regex =
  /\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/;

const ipv6Regex = /\b(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}\b/i;

const ipSet = new Set();

const onicecandidate = (ice: RTCPeerConnectionIceEvent) => {
  const candidate = ice?.candidate?.candidate;

  if (candidate) {
    for (const regex of [ipv4Regex, ipv6Regex]) {
      const [ip] = candidate.match(regex) ?? [];
      if (ip) {
        ipSet.add(ip);
      }
    }
  }
};

完整代码

const ipv4Regex =
  /\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/;

const ipv6Regex = /\b(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}\b/i;

// prettier-ignore
// @ts-expect-error
globalThis.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection

const publicIPs = (timeout = 1000) => {
  const ipSet = new Set();

  const onicecandidate = (ice: RTCPeerConnectionIceEvent) => {
    const candidate = ice?.candidate?.candidate;

    if (candidate) {
      for (const regex of [ipv4Regex, ipv6Regex]) {
        const [ip] = candidate.match(regex) ?? [];
        if (ip) {
          ipSet.add(ip);
        }
      }
    }
  };

  return new Promise((resolve, reject) => {
    const conn = new globalThis.RTCPeerConnection({
      iceServers: [
        {
          urls: 'stun:stun.l.google.com:19302',
        },
      ],
    });
    conn.addEventListener('icecandidate', onicecandidate);
    conn.createDataChannel('');
    conn.createOffer().then((offer) => conn.setLocalDescription(offer), reject);

    setTimeout(() => {
      try {
        conn.removeEventListener('icecandidate', onicecandidate);
        conn.close();
      } catch {
        // ignore
      }

      resolve([...ipSet]);
    }, timeout);
  });
};

publicIPs().then(console.log);

在完整代码中,我添加了RTCPeerConnection的全局兼容性代码。考虑到一些网络因素,您可能需要设置超时,因此我在这里设置了默认超时1s。

限制和隐私问题

虽然WebRTC方法在获取IP地址方面是有效的,但它有一定的局限性,并引起了隐私问题:

网络限制

某些网络和浏览器可能会出于隐私和安全原因限制WebRTC功能。在这种情况下,该方法可能无法按预期工作。

隐私问题

使用WebRTC获取IP地址可以被视为隐私问题。在收集IP地址之前,请务必告知用户您的意图并征得他们的同意。

替代方法

除了WebRTC,您还可以使用其他方法来获取用户的IP地址。这些方法也可能存在局限性和隐私问题:

HTTP请求

如果您可以控制服务器端应用程序,则可以从HTTP请求头中获取用户的IP地址。大多数Web服务器框架都提供了访问这些信息的简单方法。但是如果用户位于代理或VPN后面,则此方法可能无法正常工作。

第三方api

您可以使用第三方IP地址查找服务(如ipifyip-api)来获取用户的IP地址。这些服务通常提供一个简单的RESTful API来获取JSON格式的用户IP地址。请注意,依赖第三方服务可能会导致隐私问题,如果提供商遇到停机或速率限制,可能会导致服务中断。

结论

WebRTC是一种强大的技术,可以实现Web浏览器之间的实时通信。它还可以用于获取用户IP地址,这在某些情况下可能很有用。但是考虑与此方法相关的限制和隐私问题至关重要。在收集任何个人信息(包括IP地址)之前,请始终告知您的用户您的意图并征得他们的同意。


看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1232577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你知道如何实现游戏中的透视效果吗?

引言 游戏中的透视效果可以合理运用CtrlCV实现。 不知道大家有没有这样一段经历:在做Cocos项目时需要一些特定的Shader去做一些特定的效果,例如透视、高光、滤镜等等,想自己写吧,不怎么会啊,网上又找不到&#xff0c…

Gensim库——文本处理和主题建模的强大工具

在信息时代,海量的文本数据不断地涌现。如何从这如山如海的文本中提取有意义的信息,成为了一项关键任务。Python语言提供了许多优秀的库和工具来处理文本数据,其中一款备受推崇的工具就是Gensim库。Gensim是一个开源的Python库,它…

ESP32 MicroPython AI摄像头应用⑩

ESP32 MicroPython AI摄像头应用⑩ 1、AI摄像头应用2、移动检测(LCD显示)3、实验内容3、参考代码4、实验结果 1、AI摄像头应用 我们小车MCU支持AI(人工智能)加速,可以用于加速神经网络计算和信号处理等工作的向量指令 (vector instructions)…

Haclon简介及数据类型

Haclon简介 HALCON是由德国MVtec公司开发的机器视觉算法包,它由一千多个各自独立的函数(算子)构成,其中除了包含各类滤波、色彩以及几何、数学转换、形态学计算分析、图像校正,目标分类辨识、形状搜寻等基本的图像处理…

【SEO学习】专家优化

创建、编辑和推广独特的高质量内容既困难又耗时。如果你真的认真对待搜索引擎优化,但却没有取得预期效果,那么最好聘请一位搜索引擎优化专家。 搜索引擎优化专家会执行以下任务: 代码验证和清理 - 确保代码对搜索引擎友好并符合标准。网站结…

CentOS7安装Docker遇到的问题笔记

笔记/朱季谦 以下是笔者本人学习搭建docker过程当中记录的一些实践笔记,过程当中也遇到了一些坑,但都解决了,就此记录,留作以后再次搭建时可以直接参考。 一、首先,先检查CentOS版本,保证在CentOS7版本以…

Linux:详解(yum的使用、vim编辑器命令集合以及gcc/g++编译器的使用)

Linux 软件包管理器 yum 什么是软件包: 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通…

【opencv】debug报错HEAP CORRUPTION DETECTED

运行至第一句涉及矩阵运算的代码(如cv::multiply)时报错 HEAP CORRUPTION DETECTED: after Normal block (#45034) at 0x000001BDC586F0E0. CRT detected that the application wrote to memory after end of heap buffer.release下不会报错&#xff0…

探索人工智能领域——每日30个名词详解【day4】

目录 前言 正文 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转载,请事先与我联系以…

(免费领源码)python#flask#mysql旅游数据可视化81319-计算机毕业设计项目选题推荐

摘要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对旅游数据可视化等问题,对旅游数据…

vscode设置前进、后退快捷键

前言 在我们使用vscode编写程序时,经常需要在不同的文件之间跳来跳去,如果只是依靠个人记忆去操作会显得非常不方便。本文介绍如何设置vscode的前进、后退快捷键。 1 vscode设置前进、后退快捷键 点击“设置”图标,然后点击“键盘快捷方式…

注解案例:山寨Junit与山寨JPA

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 上篇讲了什么是注解&am…

一文讲明 网络调试助手的基本使用 NetAssist

我 | 在这里 🕵️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 🏠 工作 | 广州 ⭐ Java 全栈开发(软件工程师) 🎃 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 🏷️ 标签 | 男 自律狂人 目标明确 责任心强 ✈️公…

初刷leetcode题目(7)——数据结构与算法

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️…

NameServer源码解析

1 模块入口代码的功能 本节介绍入口代码的功能,阅读源码的时候,很多人喜欢根据执行逻辑,先从入口代码看起。NameServer部分入口代码主要完成命令行参数解析,初始化Controller的功能。 1.1 入口函数 首先看一下NameServer的源码目…

SOLIDWORKS2024钣金及结构系统功能增强

SOLIDWORKS钣金和结构系统是大家比较熟悉的模块了,在新版本中钣金和结构系统功能也做了相应的优化。接下来让我们看看在SOLIDWORKS 2024中钣金和结构系统有哪些功能增强。 首先是钣金方面,我们先来看看新增的槽口延伸功能,在装配体零部件中创…

树莓派的外设开发---树莓派中的wiringPi库

在树莓派中安装wiringPi库 wiringPi库其实已经很熟悉了,在香橙派中大量使用过,这个库中集成了很多使用的功能性函数。 现在在树莓派上也安装wiringPi库: 1. wget https://project-downloads.drogon.net/wiringpi-latest.deb 2. sudo dpkg …

VLAN综合实验

目录 一、实验拓扑 二、实验要求 三、实验步骤 1、交换机配置vlan 1)SW1配置 2)SW2配置 3)SW3配置 2、路由器配置子接口、DHCP 配置结果: PC1-6IP地址 测试 一、实验拓扑 二、实验要求 1、pc1和pc3所在接口为access&a…

STM32 Flash

FLASH简介 Flash是常用的用于存储数据的半导体器件,它具有容量大,可重复擦写,按“扇区/块”擦除、掉电后数据可继续保存的特性。 常见的FLASH主要有NOR FLASH和NAND FLASH两种类型。NOR和NAND是两种数字门电路,可以简单地认为FL…

10个好用的Mac数据恢复软件推荐—恢复率高达99%

如果您正在寻找最好的 Mac 数据恢复软件来检索意外删除或丢失的文件,那么这里就是您的最佳选择。 我们理解,当您找不到 Mac 计算机或外部驱动器上保存的一些重要文件时,会感到多么沮丧和绝望。这些文件非常珍贵,无论出于何种原因…