前端可以拿到一个请求的 ip 地址吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
lankunblue
V2EX    程序员

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

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

    浏览器只暴露了 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
    AV1
        13
    AV1  
       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     Solana     5870 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 01:52 PVG 09:52 LAX 18:52 JFK 21:52
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86