web-dev-qa-db-ja.com

クライアント側のJavaScriptを使用してDNSルックアップ(ホスト名からIPアドレスへ)を実行できますか?

クライアント側のJavascriptを使用して、クライアントのコンピューターから見たDNSルックアップ(ホスト名からIPアドレスへ)を実行したいと思います。それは可能ですか?

80
Noah Jacobson

Javascript標準ライブラリには、ホストやIPアドレスの概念はありません。そのため、ホスト名を検索するために外部サービスにアクセスする必要があります。

ホスト名のIPアドレスを検索し、JavaScript経由でアクセスするcgi-binをホストすることをお勧めします。

32
Hans Sjunnesson

編集:この質問により悩みが生じたため、クライアントのIPアドレスを返すJSONP WebサービスをGoogle App Engineに設定しました。使用法:

<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を送信してそれを読み取ることができます。

86
Zach

非常に遅いですが、私は多くの人々がまだ「Google Airlines」を通してここに着陸すると思います。最新のアプローチは、サーバーサポートを必要としない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.";
}   
27
earizon

ホストされた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をきれいにしてください!

14
tcole

これは古い質問ですが、私の解決策は他の人を助けるかもしれません。

これを簡単にする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/

2
Neville Hillyer

ブラウザーからDNSルックアップを実行するためのCORSフレンドリーREST API- https://exana.io/tools/dns/ を提供するサードパーティサービスがあります。

2
user670908

多くの人が言ったように、外部サービスを使用して呼び出す必要があります。そして、サーバーの観点からのみDNS解決を取得します。

それで十分で、DNS解決だけが必要な場合は、次のDockerコンテナーを使用できます。

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"
     ]
 }

私の推奨事項は、Javascriptを提供するサーバーの特定のエンドポイント上のコンテナーにリバースプロキシするようにWebサーバーをセットアップし、標準のJavascript Ajax関数を使用して呼び出すことです。

1
Havok

これを行うには、ブラウザーのサンドボックスを壊す必要があります。サーバーにルックアップを実行させ、XmlHttpを介してクライアント側からそれを要求するようにしてください。

0
Tomalak

dns browser.dns.resolve("example.com");のこのメソッドを使用すると、純粋なjavascriptだけを追加せずにそれを行うことができますが、FIREFOX 60と互換性があります。MDNの詳細を確認できます https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve

0
Yassine Farroud

Firefoxには、v60以降、WebExtensions用の組み込みAPIがあります。

https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve

0
Saturnus

Javascriptライブラリがあります DNS-JS.com これはまさにこれを行います。

DNS.Query("dns-js.com",
    DNS.QueryType.A,
    function(data) {
        console.log(data);
});
0
Fiach Reid