您可以通过JavaScript获取用户的本地LAN IP地址吗?

2022-08-30 04:56:10

我知道对这个问题的最初反应是“不”和“它不能完成”和“你不应该需要它,你做错了什么”。我试图做的是获取用户的LAN IP地址,并将其显示在网页上。为什么?因为这就是我正在处理的页面的全部内容,尽可能多地显示有关您,访问者的信息:https://www.whatsmyip.org/more-info-about-you/

因此,我实际上并没有对IP做任何事情,除了向用户显示它以用于信息目的。我曾经使用一个小的Java小程序来做到这一点。它工作得很好。但是现在,浏览器让你多次点击同意和信任,运行即使是最次要的java小程序,我宁愿根本不运行一个。

所以有一段时间,我只是摆脱了这个功能,但如果可能的话,我希望它回来。作为一名计算机顾问,我实际上会不时地使用这种东西。访问此网站以查看网络正在运行的IP范围比进入“系统偏好设置”,“网络”,然后进入任何处于活动状态的接口要快得多。

所以我想知道,希望,如果有办法单独用javascript做到这一点?也许你可以访问一些新对象,类似于javascript可以询问浏览器在地球上的地理位置在哪里。客户端网络信息可能有类似的东西?如果没有,也许还有其他方法可以完全做到这一点?我能想到的唯一方法是Java小程序或flash对象。我宁愿不做这些。


答案 1

事实证明,HTML5最近的WebRTC扩展允许javascript查询本地客户端IP地址。可在此处获取概念证明:http://net.ipcalf.com

此功能显然是设计使然,而不是错误。但是,鉴于其有争议的性质,我会谨慎地依赖这种行为。尽管如此,我认为它完全和适当地解决了您的预期目的(向用户透露他们的浏览器泄漏的内容)。


答案 2

更新

这个解决方案将不再有效,因为浏览器正在修复webrtc泄漏:有关该漏洞的更多信息,请阅读另一个问题:RTCIceCandidate不再返回IP


除了 afourney 的答案之外,此代码还适用于支持 WebRTC(Chrome 和 Firefox)的浏览器。我听说有一种运动正在实现一种功能,使网站请求IP(例如在用户的地理位置或用户媒体的情况下),尽管它尚未在这些浏览器中实现。

以下是源代码的修改版本,减少了行数,不发出任何眩晕请求,因为您只需要本地IP而不是公共IP:

window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;//compatibility for Firefox and chrome
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};      
pc.createDataChannel('');//create a bogus data channel
pc.createOffer(pc.setLocalDescription.bind(pc), noop);// create offer and set local description
pc.onicecandidate = function(ice)
{
 if (ice && ice.candidate && ice.candidate.candidate)
 {
  var myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
  console.log('my IP: ', myIP);   
  pc.onicecandidate = noop;
 }
};

我们正在为远程对等方创建一个虚拟对等连接,以便与我们联系。我们通常相互交换冰候选者,阅读冰候选者我们可以告诉用户的ip。

您可以在 --> Demo 找到演示