it-swarm.com.de

Kann ich eine DNS-Suche (Hostname zu IP-Adresse) mit clientseitigem Javascript durchführen?

Ich möchte clientseitiges Javascript verwenden, um eine DNS-Suche (Hostname zu IP-Adresse) vom Computer des Clients aus durchzuführen. Ist das möglich?

80
Noah Jacobson

Es gibt keine Vorstellung von Hosts oder IP-Adressen in der JavaScript-Standardbibliothek. Sie müssen also auf einen externen Dienst zugreifen, um nach Hostnamen für Sie zu suchen.

Ich empfehle ein cgi-bin zu hosten, das die IP-Adresse eines Hostnamens nachschlägt und über Javascript darauf zugreift.

32
Hans Sjunnesson

Bearbeiten: Diese Frage juckte mich, deshalb habe ich in Google App Engine einen JSONP-Webservice eingerichtet, der die IP-Adresse des Clients zurückgibt. Verwendung:

<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>

Ja, es werden keine Server-Proxys benötigt.


Pure JS kann nicht. Wenn Sie ein Serverskript in derselben Domäne haben, in der es ausgedruckt wird, können Sie eine XMLHttpRequest senden, um es zu lesen.

86
Zach

Sehr spät, aber ich denke, viele Leute werden immer noch über "Google Airlines" hier landen. Ein modermer Ansatz ist die Verwendung von WebRTC, für das keine Serverunterstützung erforderlich ist.

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

Der nächste Code ist ein Copy & Paste von 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

Die gehostete JSONP-Version funktioniert wie ein Zauber, aber es scheint, als würde sie an den meisten Tagen (Eastern Time) nachts ihre Ressourcen überstrapazieren, sodass ich meine eigene Version erstellen musste.

So habe ich es mit PHP gemacht:

<?php
header('content-type: application/json; charset=utf-8');

$data = json_encode($_SERVER['REMOTE_ADDR']);
echo $_GET['callback'] . '(' . $data . ');';
?>

Dann ist das Javascript genau das gleiche wie zuvor, nur kein Array:

<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>

So einfach ist das!

Randnotiz: Reinigen Sie Ihr $ _GET unbedingt, wenn Sie dies in einer öffentlich zugänglichen Umgebung verwenden!

14
tcole

Mir ist bewusst, dass dies eine alte Frage ist, aber meine Lösung kann anderen helfen.

Ich finde, dass die JSON (P) -Dienste, die dies vereinfachen, nicht ewig dauern, aber das folgende JavaScript funktioniert zum Zeitpunkt des Schreibens für mich gut.

<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>

Das obige schreibt die IP meines Servers auf die Seite, auf der er sich befindet, aber das Skript kann geändert werden, um eine IP zu finden, indem 'zero.eu.org' in einen anderen Domainnamen geändert wird. Dies ist in Aktion auf meiner Seite zu sehen unter: http://meon.zero.eu.org/

2
Neville Hillyer

Es gibt einen Drittanbieter-Dienst, der eine CORS-freundliche REST API zur Durchführung von DNS-Suchen über den Browser bereitstellt - https://exana.io/tools/dns/

2
user670908

Wie viele Leute sagten, müssen Sie einen externen Dienst nutzen und ihn anrufen. Dadurch erhalten Sie nur die DNS-Auflösung aus der Serverperspektive.

Wenn das gut genug ist und Sie nur eine DNS-Auflösung benötigen, können Sie den folgenden Docker-Container verwenden:

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

Endpunkte:

[GET] /ipv6/[domain]: Führen Sie eine DNS-Auflösung für eine bestimmte Domain durch und geben Sie die zugehörigen IPv6-Adressen zurück.

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

[GET] /ipv4/[domain]: Führen Sie eine DNS-Auflösung für eine bestimmte Domain durch und geben Sie die zugehörigen IPv4-Adressen zurück.

 {
     "addresses": [
         "139.180.232.162"
     ]
 }

Ich empfehle Ihnen, Ihren Webserver so einzurichten, dass er den Proxy für den Container auf einem bestimmten Endpunkt in Ihrem Server umkehrt, auf dem Javascript ausgeführt wird, und ihn mit Ihren standardmäßigen Javascript-Ajax-Funktionen aufzurufen.

1
Havok

Dazu müsste die Sandbox des Browsers beschädigt werden. Versuchen Sie, Ihren Server die Suche durchführen zu lassen und dies vom Client über XmlHttp anzufordern.

0
Tomalak

sicher können Sie das tun, ohne einen Zusatz zu verwenden, nur reines Javascript, indem Sie diese Methode von dns browser.dns.resolve("example.com"); verwenden, aber sie ist nur mit FIREFOX 60 kompatibel. Sie können weitere Informationen zu MDN sehen https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve

0
Yassine Farroud

Firefox hat seit v60 eine integrierte API für WebExtensions:

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

0
Saturnus

Es gibt eine Javascript-Bibliothek DNS-JS.com , die genau dies tut.

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