2008-09-19 80 views
67

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

+0

对这个问题的许多答案似乎建议做解析服务器端。取决于可能不够用的用例。例如,如果您正在查找的服务正在使用GSLB,则可能会根据用户所在的位置返回不同的IP;因此服务器端代码收到的响应很可能与浏览器收到的响应不同。话虽如此,我还没有为那些关心这种差异的人提供另一种解决方案。 – 2012-07-12 08:02:47

回答

26

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

我建议举办一个cgi-bin目录,其是通过JavaScript查找一个主机名和访问的IP地址。

+19

cgi-bin?那是个老派。我喜欢! – 2008-09-20 01:02:26

+7

撰写本文时(2008年)这是真实的。这在6年之后是不正确的:在同一页面查看我对WebRTC的评论。 (不幸的是,当搜索IP地址问题的解决方案时,Google仍指向此主题,并且可能会将人们置于错误的方向)。 – earizon 2014-09-30 16:47:05

+1

@earizon - 你的答案是针对不同的问题 - 如何发现你自己的私人IP地址。 – 2015-01-18 01:38:40

-1

我不认为这是大多数浏览器出于安全原因不允许的,在纯JavaScript方面的问题问。

+3

这不是一个答案。这应该是一个评论! – trejder 2015-06-17 06:48:35

-8

如果客户端已经安装了Java,你可以做这样的事情:

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

其他,你可能会使用一个服务器端脚本。

+8

为什么有人提出这个问题? java!= javascript,这不是一个答案。 – fr34kyn01535 2015-06-06 14:47:49

+0

爆震。谁在那? (...长时间停顿)Java Applet – 2017-02-06 03:45:44

0

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

90

编辑:这个问题给了我一个痒,所以我在Google App Engine上放置了一个JSONP web服务,它返回客户端的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来读取它。

+4

您可以将源代码发布到您的Web服务吗?运行一个实例会很好。 – Will 2012-03-05 21:28:26

+10

对不起,但不得不downvote,因为我不认为它实际上回答了原来的问题。他们只需要标准的DNS查询,而不是用户的公共IP。 – 2015-11-11 07:46:50

15

托管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!

-2

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

在页面中放置一个脚本标记,由客户端调用(具有src指向)未负载均衡的另一个服务器呈现(我意识到这意味着您需要访问第二台服务器,但这些天托管很便宜你可以轻松而廉价地设置它)。

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

在其他的服务器“someServerIown”你需要有ASP,ASPX或者PHP页面;

-----包含服务器这样的代码:

“<% 回复于(” VAR端ClientIPAddress =“” & Request.ServerVariables( “REMOTE_ADDR”)& “';”) % >” (不含外侧引号DBL :-))

----并写这段代码回到脚本标签:

var clientipaddress = '178.32.21.45'; 

这有效创建一个Javascript变量,您可以在页面上使用Javascript访问,而不会更少。

希望你能够访问这个var并将值写入一个表单控件以准备发回。

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

这就是我如何绕过哑巴负载平衡器,我们有屏蔽客户端IP地址,并使其显示为负载平衡器......愚蠢的愚蠢愚蠢愚蠢!

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

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

-2

我的版本是这样的:

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; 

}); 

它的工作原理跨域。 它可以使用状态检查。正在努力。

21

很晚了,但我想很多人仍然会通过“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) { // c.f. 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."; 
} 
3

副本&贴我知道这是一个老问题,但我的解决方案可以帮助他人。

我发现使这种简单的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,它位于页面上,但该脚本可以被修改,以发现通过改变“zero.eu.org”到另一个域名的任何IP。 这可以在行动,在可以看到我的网页上:http://meon.zero.eu.org/

1

正如许多人说你需要使用外部服务并调用它。这只会让你从服务器的角度来看DNS解析。

如果这是够好,如果你只需要DNS解析,你可以使用下面的码头工人容器:

https://github.com/kuralabs/docker-webaiodns

终点:

[GET] /ipv6/[domain]: 给定域中执行DNS解析并返回相关的IPv6地址 。

{ 
    "addresses": [ 
     "2a01:91ff::f03c:7e01:51bd:fe1f" 
    ] 
} 

[GET] /ipv4/[domain]: 执行给定域中的DNS解析,并返回关联的IPv4地址 。

{ 
    "addresses": [ 
     "139.180.232.162" 
    ] 
} 

我的建议是,你设置你的Web服务器反向代理到容器上的特定端点在服务器服务你的Javascript和使用标准的JavaScript Ajax函数调用它。

相关问题