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

j'aimerais utiliser Javascript côté client pour effectuer une recherche DNS (du nom d'hôte à l'adresse IP) à partir de l'ordinateur du client. Est-ce possible?

74
demandé sur Simon East 2008-09-19 19:06:16

12 réponses

il n'y a aucune notion d'hôte ou d'adresse ip dans la bibliothèque standard javascript. Ainsi, vous aurez accès à certains services externes pour rechercher des noms d'hôtes pour vous.

, je vous conseille d'hébergement cgi-bin qui recherche l'adresse ip d'un nom d'hôte et l'accès que via javascript.

30
répondu Hans Sjunnesson 2008-09-19 15:13:49

Edit : cette question m'a donné une démangeaison, donc j'ai mis en place un service web JSONP sur Google App Engine qui renvoie l'adresse ip des clients. 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>

Yay, pas de serveur de procurations nécessaires.


pur js can't. Si vous avez un script de serveur sous le même domaine qui l'imprime, vous pouvez envoyer une XMLHttpRequest pour le lire.

90
répondu Zach 2008-09-21 16:23:31

très tard, mais je suppose que beaucoup de gens atterriront encore ici par le biais de "Google Airlines". Une approche modérée consiste à utiliser WebRTC qui ne nécessite pas de support serveur.

https://hacking.entreprises/local-ip-découverte-avec-html5-webrtc-sécurité et confidentialité-risque/

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.";
}   
22
répondu earizon 2014-09-21 17:58:54

la version JSONP hébergée fonctionne comme un charme, mais il semble qu'il passe en revue ses ressources pendant la nuit la plupart des jours (Heure de l'est), donc j'ai dû créer ma propre version.

C'est comme ça que je l'ai fait 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 qu'avant, juste 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>

C'est aussi Simple que ça!

note latérale: assurez-vous de nettoyer votre $ _GET si vous utilisez ceci dans n'importe quel environnement public!

13
répondu tcole 2016-07-24 14:05:52

je suis conscient c'est une vieille question, mais ma solution peut aider les autres.

je trouve que les services JSON(P) qui rendent cela facile ne durent pas éternellement, mais le JavaScript suivant fonctionne bien pour moi 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ù elle se trouve mais le script peut être modifié pour trouver n'importe quelle adresse IP en changeant 'zero.eu.org" à un autre nom de domaine. Ceci peut être vu en action sur ma page: http://meon.zero.eu.org /

2
répondu Neville Hillyer 2015-04-22 13:47:47

il y a un service tiers qui fournit une API REST pour effectuer des recherches DNS à partir du navigateur - https://exana.io/tools/dns/

2
répondu user670908 2017-07-06 20:15:24

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

si c'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 de terminaison:

[GET] /ipv6/[domain] : Effectuer une résolution DNS pour un domaine donné et retourner L'IPv6 associé adresse.

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

[GET] /ipv4/[domain] : Effectuer une résolution DNS pour un domaine donné et retourner L'IPv4 associé adresse.

 {
     "addresses": [
         "139.180.232.162"
     ]
 }

ma recommandation est que vous configuriez votre serveur web pour inverser le mandataire vers le conteneur sur un endpoint particulier de votre serveur desservant votre Javascript et l'appeler en utilisant vos fonctions standard Ajax Javascript.

1
répondu Havok 2018-01-24 21:11:40

pour ce faire, il faudrait casser le bac à sable du navigateur. Essayez de laisser votre serveur faire la recherche et de demander que du côté du client via XmlHttp.

0
répondu Tomalak 2008-09-19 15:14:02

Je ne pense pas que cela soit autorisé par la plupart des navigateurs pour des raisons de sécurité, dans un pur contexte JavaScript comme la question se pose.

-1
répondu Nick Craver 2008-09-19 15:19:19

ma version est comme ceci:

php sur mon serveur:

<?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 sur la page:

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

}).done( function( json ) {

    self.ip = json;

});

il fonctionne cross domain. Il pourrait utiliser un contrôle d'état. Travailler sur cela.

-2
répondu Joeri 2015-11-11 18:20:56

peut-être que j'ai manqué le point, mais en réponse à NAVY guy voici comment le navigateur peut vous dire L'adresse IP du "demandeur" (bien que peut-être seulement leur fournisseur de services).

placer une étiquette de script dans la page à rendre par le client qui appelle (a src pointant vers) un autre serveur qui n'est pas chargé équilibré (je me rends compte que cela signifie que vous avez besoin d'accéder à un 2ème serveur mais l'hébergement est bon marché ces jours-ci et vous pouvez configurer cela facilement et à moindre coût).

C'est le type de code qui doit être ajouté à la page client:

sur l'autre serveur "someServerIown" vous devez avoir la page ASP, ASPX ou PHP qui;

- - - - - contient le code du serveur comme ceci:

" <% Réponse.Ecrire ("var clientipaddress = '" & Request.ServerVariables ("REMOTE_ADDR")&"";") %>" (sans les guillemets DBL extérieurs :-))

---- et écrit cette retour au script tag:

   var clientipaddress = '178.32.21.45';

cela crée effectivement une variable Javascript à laquelle vous pouvez accéder avec Javascript sur la page pas moins.

avec un peu de chance, vous accédez à ce var et écrivez la valeur à un contrôle de forme prêt pour le renvoi.

lorsque l'utilisateur poste ou obtient sur la demande suivante Votre Javascript et / ou formulaire envoie la valeur de la variable que le "otherServerIown" a rempli pour vous, retour au serveur vous voudrais sur.

C'est comme ça que je contourne l'équilibreur de charge muet que nous avons qui masque l'adresse IP du client et la fait apparaître comme celle de L'équilibreur de charge .... muet. .. dumb dumb dumb!

Je n'ai pas donné la solution exacte parce que la situation de chacun est un peu différente. Le concept est toutefois valable. En outre, notez que si vous faites cela sur une page HTTPS, votre "alterserveriown" doit également délivrer ce formulaire sécurisé, sinon le Client est alerté. à contenu mixte. Et si vous avez des https, assurez-vous que tous vos certs sont valides, sinon le client reçoit aussi un avertissement.

Espère que cela aide quelqu'un! Désolé, il a fallu un an pour répondre/contribuer. :- )

-2
répondu Bill S 2018-06-06 13:38:29

si le client a Java installé, vous pouvez faire quelque chose comme ceci:

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

sinon, vous devrez probablement utiliser un script côté serveur.

-9
répondu Alex Fort 2014-12-23 16:04:52