web-dev-qa-db-fra.com

Puis-je effectuer une recherche DNS (nom d'hôte en adresse IP) à l'aide de Javascript côté client?

Je souhaite utiliser le langage Javascript côté client pour effectuer une recherche DNS (nom d'hôte en adresse IP), telle que vue depuis l'ordinateur du client. Est-ce possible?

80
Noah Jacobson

Il n'y a aucune notion d'hôtes ou d'adresses IP dans la bibliothèque standard javascript. Vous devrez donc accéder à un service externe pour rechercher les noms d’hôte pour vous.

Je recommande d’héberger un cgi-bin qui recherche l’adresse IP d’un nom d’hôte et l’accède via javascript.

32
Hans Sjunnesson

Edit: Cette question m'a démangé, j'ai donc mis en place un service Web JSONP sur Google App Engine qui renvoie l'adresse IP du client. Usage:

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

Oui, aucun serveur proxy requis.


Pure JS ne peut pas. Si vous avez un script serveur sous le même domaine qui l’imprime, vous pouvez envoyer un XMLHttpRequest pour le lire.

86
Zach

Très tard, mais je suppose que beaucoup de gens vont encore atterrir ici via "Google Airlines". Une approche moderne consiste à utiliser WebRTC sans nécessiter de support serveur.

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

Le code suivant est un copier/coller de 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

La version JSONP hébergée fonctionne à merveille, mais il semble que ses ressources soient surchargées de nuit presque tous les jours (heure normale de l'Est); j'ai donc dû créer ma propre version.

Voici comment je l'ai accompli avec PHP:

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

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

Alors le Javascript est exactement le même que précédemment, mais pas un tableau:

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

Aussi simple que cela!

Note latérale: Assurez-vous de nettoyer votre $ _GET si vous l'utilisez dans un environnement public!

14
tcole

Je suis conscient que cette question est ancienne, mais ma solution peut aider les autres.

Je trouve que les services JSON (P) qui facilitent cette tâche ne durent pas éternellement, mais le code JavaScript suivant me convient bien au moment de la rédaction.

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

Ce qui précède écrit l'adresse IP de mon serveur sur la page où il se trouve, mais le script peut être modifié pour rechercher une adresse IP quelconque en remplaçant "zero.eu.org" par un autre nom de domaine. Ceci peut être vu en action sur ma page à: http://meon.zero.eu.org/

2
Neville Hillyer

Il existe un service tiers qui fournit une API conviviale pour CORS REST pour effectuer des recherches DNS à partir du navigateur - https://exana.io/tools/dns/

2
user670908

Comme beaucoup de gens l'ont dit, vous devez utiliser un service externe et l'appeler. Et cela ne vous donnera la résolution DNS que du point de vue du serveur.

Si cela est suffisant et si vous avez juste besoin d'une résolution DNS, vous pouvez utiliser le conteneur Docker suivant:

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

Points finaux:

[GET] /ipv6/[domain]: Effectue une résolution DNS pour un domaine donné et renvoie les adresses IPv6 associées.

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

[GET] /ipv4/[domain]: Effectue une résolution DNS pour un domaine donné et renvoie les adresses IPv4 associées.

 {
     "addresses": [
         "139.180.232.162"
     ]
 }

Ma recommandation est que vous configuriez votre serveur Web pour inverser le proxy sur le conteneur sur un noeud final particulier de votre serveur servant votre code Javascript et que vous l'appeliez à l'aide de vos fonctions Javascript Ajax standard.

1
Havok

Faire cela nécessiterait de casser le sandbox du navigateur. Essayez de laisser votre serveur effectuer la recherche et demandez-le du côté client via XmlHttp.

0
Tomalak

bien sûr, vous pouvez le faire sans utiliser d’addition, juste du javascript pur, en utilisant cette méthode de dns browser.dns.resolve("example.com");, mais compatible uniquement avec FIREFOX 60, vous pouvez voir plus d’informations sur MDN https: // developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve

0
Yassine Farroud

Firefox possède une API intégrée pour cela depuis la v60, pour WebExtensions:

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

0
Saturnus

Il existe une bibliothèque javascript DNS-JS.com qui ne fait que cela.

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