我可以使用客户端JavaScript执行DNS查找(主机名到IP地址)吗?

我想使用客户端JavaScript来执行DNS查找(主机名到IP地址)从客户端的计算机上看到。 那可能吗?

在JavaScript标准库中没有主机或ip地址的概念。 所以你必须访问一些外部服务来为你查找主机名。

我建议托管一个cgi-bin,查看主机名的ip地址,并通过javascript访问。

编辑 :这个问题给了我一个痒,所以我把一个JSONP Web服务在Google App Engine上返回客户端的IP地址。 用法:

<script type="application/javascript"> function getip(json){ alert(json.ip); // alerts the ip address } </script> <script type="application/javascript" src="http://jsonip.appspot.com/?callback=getip"> </script> 

是的,没有服务器代理需要。


纯JS不能。 如果你在同一个域下有一个服务器脚本,你可以发送一个XMLHttpRequest来读取它。

很晚,但我想很多人还是会通过“Google Airlines”登陆。 Moderm方法是使用不需要服务器支持的WebRTC。

https://hacking.ventures/local-ip-discovery-with-html5-webrtc-security-and-privacy-risk/

下一个代码是从http://net.ipcalf.com/复制和粘贴;

 // NOTE: window.RTCPeerConnection is "not a constructor" in FF22/23 var RTCPeerConnection = /*window.RTCPeerConnection ||*/ window.webkitRTCPeerConnection || window.mozRTCPeerConnection; if (RTCPeerConnection) (function () { var rtc = new RTCPeerConnection({iceServers:[]}); if (window.mozRTCPeerConnection) { // FF needs a channel/stream to proceed rtc.createDataChannel('', {reliable:false}); }; rtc.onicecandidate = function (evt) { if (evt.candidate) grepSDP(evt.candidate.candidate); }; rtc.createOffer(function (offerDesc) { grepSDP(offerDesc.sdp); rtc.setLocalDescription(offerDesc); }, function (e) { console.warn("offer failed", e); }); var addrs = Object.create(null); addrs["0.0.0.0"] = false; function updateDisplay(newAddr) { if (newAddr in addrs) return; else addrs[newAddr] = true; var displayAddrs = Object.keys(addrs).filter(function (k) { return addrs[k]; }); document.getElementById('list').textContent = displayAddrs.join(" or perhaps ") || "n/a"; } function grepSDP(sdp) { var hosts = []; sdp.split('\r\n').forEach(function (line) { // cf http://tools.ietf.org/html/rfc4566#page-39 if (~line.indexOf("a=candidate")) { // http://tools.ietf.org/html/rfc4566#section-5.13 var parts = line.split(' '), // http://tools.ietf.org/html/rfc5245#section-15.1 addr = parts[4], type = parts[7]; if (type === 'host') updateDisplay(addr); } else if (~line.indexOf("c=")) { // http://tools.ietf.org/html/rfc4566#section-5.7 var parts = line.split(' '), addr = parts[2]; updateDisplay(addr); } }); } })(); else { document.getElementById('list').innerHTML = "<code>ifconfig | grep inet | grep -v inet6 | cut -d\" \" -f2 | tail -n1</code>"; document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull."; } 

托管的JSONP版本就像一个魅力,但似乎它在晚上大部分时间(东部时间)的资源,所以我不得不创建我自己的版本。

这是我用PHP完成的:

 <?php header('content-type: application/json; charset=utf-8'); $data = json_encode($_SERVER['REMOTE_ADDR']); echo $_GET['callback'] . '(' . $data . ');'; ?> 

然后,Javascript是完全一样的,只是不是一个数组:

 <script type="application/javascript"> function getip(ip){ alert('IP Address: ' + ip); } </script> <script type="application/javascript" src="http://www.anotherdomain.com/file.php?callback=getip"> </script> 

就那么简单!

附注:如果您在任何面向公众的环境中使用,请务必清洁$ _GET!

我知道这是一个古老的问题,但我的解决方案可能会帮助其他人。

我发现使这个容易的JSON(P)服务不会永远持续下去,但在撰写本文时,下面的JavaScript对我很好。

 <script type="text/javascript">function z (x){ document.getElementById('y').innerHTML=x.query }</script> <script type='text/javascript' src='http://ip-api.com/json/zero.eu.org?callback=z'></script> 

上面写我的服务器的IP在它所在的页面上,但脚本可以修改,以找到任何IP通过改变'zero.eu.org'到另一个域名。 这可以在我的页面上看到: http : //meon.zero.eu.org/

这样做需要打破浏览器沙箱。 试着让你的服务器执行查找,并通过XmlHttp从客户端请求。

有一个第三方服务提供了一个CORS友好的REST API来从浏览器执行DNS查询 – https://exana.io/tools/dns/

我不认为这是大多数浏览器出于安全原因而允许的,在纯粹的JavaScript语境中,正如问题所要求的那样。

也许我错过了这一点,但在这里回答NAVY的人是浏览器如何告诉你“请求者的”IP地址(尽管也许只有他们的服务提供商)。

在页面放置一个脚本标记,由客户端调用(有src指向)不是负载平衡的另一台服务器(我意识到这意味着你需要访问第二台服务器,但现在主机是便宜的,你可以设置这很容易和便宜)。

这是需要添加到客户端页面的那种代码:

在另一台服务器“someServerIown”你需要有ASP,ASPX或PHP页面;

—–包含这样的服务器代码:

“<%Response.Write(”var clientipaddress ='“&Request.ServerVariables(”REMOTE_ADDR“)&”';“)%>”(不含外部dbl引号:-))

—-并将此代码写回脚本标记:

  var clientipaddress = '178.32.21.45'; 

这有效地创建了一个Javascript变量,您可以通过页面上的Javascript访问。

希望你访问这个变种,并将值写入一个表单控件,准备发回。

当用户发布或获取下一个请求时,您的Javascript和/或表单会将“otherServerIown”为您填充的变量的值发送回您想要的服务器。

这是我如何解决愚蠢的负载平衡器,我们已经掩盖了客户端IP地址,并使其显示为负载平衡器…愚蠢的…愚蠢愚蠢愚蠢!

我没有给出确切的解决方案,因为每个人的情况都有些不同。 但是,这个概念是合理的。 另外请注意,如果您在HTTPS页面上执行此操作,则您的“otherServerIOwn”还必须以该安全形式进行传递,否则,客户端将收到混合内容的警报。 如果你确实有https,那么确保你所有的证书都是有效的,否则客户端也会收到警告。

希望它可以帮助别人! 对不起,花了一年的时间来回答/提供。 🙂

我的版本是这样的:

在我的服务器上的php:

 <?php header('content-type: application/json; charset=utf-8'); $data = json_encode($_SERVER['REMOTE_ADDR']); $callback = filter_input(INPUT_GET, 'callback', FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH|FILTER_FLAG_ENCODE_LOW); echo $callback . '(' . $data . ');'; ?> 

jQuery在页面上:

 var self = this; $.ajax({ url: this.url + "getip.php", data: null, type: 'GET', crossDomain: true, dataType: 'jsonp' }).done( function( json ) { self.ip = json; }); 

它跨域运作。 它可以使用状态检查。 在那工作。

如果客户端安装了Java,则可以这样做:

 ipAddress = java.net.InetAddress.getLocalHost().getHostAddress(); 

除此之外,你可能不得不使用服务器端脚本。