V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lankunblue
V2EX  ›  程序员

前端可以拿到一个请求的 ip 地址吗?

  •  
  •   lankunblue · 2022-05-18 11:13:50 +08:00 · 4372 次点击
    这是一个创建于 918 天前的主题,其中的信息可能已经有所发展或是发生改变。

    浏览器只暴露了 http 层给用户,ip 是 tcp 层的东西,不太清楚有没有 hack 可以拿到一个请求的服务器 ip 地址,不管是通过插件、普通的网页 js 甚至 wasm

    30 条回复    2022-05-19 10:23:05 +08:00
    nulIptr
        1
    nulIptr  
       2022-05-18 11:18:05 +08:00
    前端不知道后端知道啊。。。调个后端接口不就好了。不然那种查询本机 ip 页面咋来的
    liyanggyang
        2
    liyanggyang  
       2022-05-18 11:18:10 +08:00
    你想说的是 前端本地 ip 地址?

    想要通过 http 接口去拿服务器的 ip ,这没法哦。但是貌似我们可以通过网络请求的过程来看, 目标服务器肯定最后是一个 ip ,那么比如 http 里面写的域名,dns 解析成 ip 嘛。
    westoy
        3
    westoy  
       2022-05-18 11:20:11 +08:00
    直接调用后端返回 IP 反馈啊, 问题这个结果对于客户端是可以篡改的, 你要拿来做严肃的判断或者业务上下文肯定是不行的
    tianyou666shen
        4
    tianyou666shen  
       2022-05-18 11:22:13 +08:00
    你想说 js 能不能解析 ip 报文 header 取出其中的 32 位目的 IP 地址 这意思嘛
    lankunblue
        5
    lankunblue  
    OP
       2022-05-18 11:27:21 +08:00
    不是本机 ip 哦,是服务端 ip 。比如 你发出了一个请求 ,地址是 a.xyz.com/api/foo/bar, 怎么拿到这个请求的的响应的服务器 ip
    lankunblue
        6
    lankunblue  
    OP
       2022-05-18 11:27:56 +08:00
    @tianyou666shen 是的,是目的 ip ,不是源 ip 。
    lankunblue
        7
    lankunblue  
    OP
       2022-05-18 11:28:43 +08:00
    @nulIptr 不是本机 ip ,是目的 ip 哦
    tianyou666shen
        9
    tianyou666shen  
       2022-05-18 11:38:37 +08:00
    需要一个抓包的工具 再配合 js 中的解析库取出 ip 报文 在 IP 协议 header 中找到对应位置的数据
    查了下这个包是 js 用来抓取网络报文的
    https://github.com/node-pcap/node_pcap
    lysS
        10
    lysS  
       2022-05-18 11:47:51 +08:00
    浏览器里面似乎不能 dns ,nodejs 之类的可以和系统交换的就可以
    julyclyde
        11
    julyclyde  
       2022-05-18 11:48:14 +08:00
    按说不能。脚本运行的时候,请求已经完成了
    villivateur
        12
    villivateur  
       2022-05-18 11:56:16 +08:00 via Android
    你可以做一个专门查 dns 记录的后端,然后发个类似 https://dnsquery.com/?domain=example.com
    DOLLOR
        13
    DOLLOR  
       2022-05-18 12:13:16 +08:00 via Android
    前端很少有这种需求,我怀疑又是一个 x-y 问题
    Kinnice
        14
    Kinnice  
       2022-05-18 12:17:35 +08:00
    @villivateur 我来给个真的 http://119.29.29.29/d?dn=a.xyz.com
    liangkang1436
        15
    liangkang1436  
       2022-05-18 12:42:54 +08:00 via Android
    碰到反向代理怎么办?
    ch2
        16
    ch2  
       2022-05-18 12:47:37 +08:00
    那个 ip 是在你发送请求之前浏览器就查好的,浏览器没有暴露相关的 api 给 js 查询 dns 对应的 ip
    cslive
        17
    cslive  
       2022-05-18 14:28:19 +08:00
    js 查询 dns 不就行了
    bybyte
        18
    bybyte  
       2022-05-18 16:04:48 +08:00
    搭个域名查询的后端服务就行了
    rekulas
        19
    rekulas  
       2022-05-18 16:15:50 +08:00
    伪需求 大概率 xy 问题
    lankunblue
        20
    lankunblue  
    OP
       2022-05-18 16:48:37 +08:00
    @crs0910
    @Kinnice
    @cslive
    @bybyte 我是想知道用户通过浏览器那一次请求的的服务器 ip 是什么,对于一个请求来说只有一个 ip ,这和用户所处的位置有关和用户使用的 dns 服务有关。通过服务端的 dns 查询是实现不了我的目的,正如 stackoverflow 那个回答里说的那样
    Newb1e
        21
    Newb1e  
       2022-05-18 17:04:54 +08:00
    f12 network
    lankunblue
        22
    lankunblue  
    OP
       2022-05-18 17:10:36 +08:00
    @Newb1e 对对对,其实就是 f12 network 里请求面板的那个 remote address, 但是我想知道可不可以通过代码拿到这个
    thinkershare
        23
    thinkershare  
       2022-05-18 17:11:15 +08:00
    @lankunblue 没有, 不用折腾了, 不使用网络工具或者自己封装浏览器就不要指望了. IP 这个层次的信息在传输层, HTTP 这种应用层不要指望了, MDN 上的关于网络有关的 API 就没有这种层面的公开 API. 同意 @rekulas 的观点, 这是个伪需求, 对于 WEB 层面的应用.
    thinkershare
        24
    thinkershare  
       2022-05-18 17:13:29 +08:00
    https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve, 你需要的是这个, 但是这个 API 已经被删除了
    thinkershare
        25
    thinkershare  
       2022-05-18 17:14:42 +08:00
    如果可以, 这将被视为一个安全漏洞, 很快被浏览器厂商修复!
    lankunblue
        26
    lankunblue  
    OP
       2022-05-18 17:16:57 +08:00
    @thinkershare 嗯嗯,另外我其实还有一个问题,按照网络协议来说,http 层是 ip 层的上层协议,为啥确不能访问到底层协议的协议头呢?
    rekulas
        27
    rekulas  
       2022-05-18 17:21:23 +08:00
    @lankunblue 做过编程的都知道,计算机体系里都是越底层接触的越多,越上层越少
    Hyseen
        28
    Hyseen  
       2022-05-19 01:26:22 +08:00 via iPhone
    @lankunblue 你的这个问题就是错的,应用层当然是可以获取到底层协议的内容的,否则 nginx 的 $remote_addr 是怎么获取的?你在浏览器中没办法拿到只是浏览器提供的 API 对用户屏蔽了底层协议而已,你自己实现一个浏览器的话提供一个获取请求的 TCP 连接的对端 IP 的 API 是完全可行的
    nothingistrue
        29
    nothingistrue  
       2022-05-19 09:48:45 +08:00
    你这个需求,源需求是当前服务器( A 域名),想通过访问它的某个页面的浏览器,去获取 浏览器到 B 域名 之间的通讯信息。这特么就是网络攻击,不是无法实现,而是不能实现。
    lankunblue
        30
    lankunblue  
    OP
       2022-05-19 10:23:05 +08:00
    @Hyseen 确实如此,学习了,感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1005 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:14 · PVG 04:14 · LAX 12:14 · JFK 15:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.