¿Puedo realizar una búsqueda de DNS (nombre de host a dirección IP) usando Javascript del lado del cliente?

StackOverflow https://stackoverflow.com/questions/102605

  •  01-07-2019
  •  | 
  •  

Pregunta

Me gustaría utilizar Javascript del lado del cliente para realizar una búsqueda de DNS (nombre de host a dirección IP) como se ve desde la computadora del cliente.¿Es eso posible?

¿Fue útil?

Solución

No existe noción de hosts o direcciones IP en la biblioteca estándar de JavaScript.Por lo tanto, tendrá que acceder a algún servicio externo para buscar nombres de host por usted.

Recomiendo alojar un cgi-bin que busca la dirección IP de un nombre de host y accede a él a través de javascript.

Otros consejos

Editar:Esta pregunta me provocó picazón, así que instalé un servicio web JSONP en Google App Engine que devuelve la dirección IP del cliente.Uso:

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

Sí, no se necesitan servidores proxy.


JS puro no puede.Si tiene un script de servidor en el mismo dominio que lo imprime, puede enviar un XMLHttpRequest para leerlo.

Muy tarde, pero supongo que mucha gente todavía aterrizará aquí a través de "Google Airlines".Un enfoque moderno es utilizar WebRTC que no requiere soporte de servidor.

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

El siguiente código es copiar y pegar desde 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.";
}   

La versión JSONP alojada funciona de maravilla, pero parece que consume sus recursos durante la noche la mayoría de los días (hora del este), así que tuve que crear mi propia versión.

Así lo logré con PHP:

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

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

Entonces el Javascript es exactamente igual que antes, solo que no es una matriz:

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

¡Simple como eso!

Nota al margen:¡Asegúrate de limpiar tu $_GET si estás usando esto en cualquier entorno público!

Soy consciente de que esta es una vieja pregunta, pero mi solución puede ayudar a otros.

Creo que los servicios JSON(P) que facilitan esto no duran para siempre, pero el siguiente JavaScript me funciona bien al momento de escribir este artículo.

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

Lo anterior escribe la IP de mi servidor en la página en la que se encuentra, pero el script se puede modificar para encontrar cualquier IP cambiando 'zero.eu.org' a otro nombre de dominio.Esto se puede ver en acción en mi página en: http://meon.zero.eu.org/

Existe un servicio de terceros que proporciona una API REST compatible con CORS para realizar búsquedas de DNS desde el navegador. https://exana.io/tools/dns/

Como mucha gente dijo, es necesario utilizar un servicio externo y llamarlo.Y eso sólo te dará la resolución DNS desde la perspectiva del servidor.

Si eso es lo suficientemente bueno y solo necesita resolución DNS, puede usar el siguiente contenedor Docker:

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

Puntos finales:

[GET] /ipv6/[domain]:Realice una resolución DNS para el dominio dado y devuelva las direcciones IPv6 asociadas.

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

[GET] /ipv4/[domain]:Realice una resolución DNS para el dominio dado y devuelva las direcciones IPv4 asociadas.

 {
     "addresses": [
         "139.180.232.162"
     ]
 }

Mi recomendación es que configure su servidor web para que invierta el proxy al contenedor en un punto final particular en su servidor que sirve su Javascript y lo llame usando sus funciones estándar de Javascript Ajax.

Hacer esto requeriría romper la zona de pruebas del navegador.Intente dejar que su servidor realice la búsqueda y solicítela desde el lado del cliente a través de XmlHttp.

Seguro que puedes hacerlo sin usar ninguna adición, solo javascript puro, usando este método de dns browser.dns.resolve("example.com");pero es compatible solo con FIREFOX 60 puedes ver más información en MDN https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve

No creo que la mayoría de los navegadores permitan esto por razones de seguridad, en un contexto de JavaScript puro, como indica la pregunta.

Firefox tiene una API incorporada para esto desde la versión 60, para WebExtensions:

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

Tal vez no entendí el punto, pero en respuesta al chico de NAVY, así es como el navegador puede indicarle la dirección IP del 'solicitante' (aunque tal vez solo su proveedor de servicios).

Coloque una etiqueta de secuencia de comandos en la página que será procesada por el cliente que llama (tiene src apuntando a) otro servidor que no está cargado equilibradamente (me doy cuenta de que esto significa que necesita acceso a un segundo servidor, pero el alojamiento es barato hoy en día y puede configurar esto de manera fácil y económica).

Este es el tipo de código que se debe agregar a la página del cliente:

En el otro servidor "someServerIown" necesitas tener la página ASP, ASPX o PHP que;

----- contiene código de servidor como este:

"< % Response.Write (" var clientIpAddress = '"& request.ServerVariAnbles (" remota_addr ") y"'; ") %>" (sin las cotizaciones de DBL externos :-))

---- y escribe este código nuevamente en la etiqueta script:

   var clientipaddress = '178.32.21.45';

Esto crea efectivamente una variable de Javascript a la que puede acceder nada menos que con Javascript en la página.

Con suerte, accederá a esta var y escribirá el valor en un control de formulario listo para enviar.

Cuando el usuario publica o recibe la siguiente solicitud, su Javascript y/o formulario envía el valor de la variable que "otherServerIown" ha completado para usted, de vuelta al servidor en el que desea hacerlo.

Así es como evito el tonto balanceador de carga que tenemos que enmascara la dirección IP del cliente y la hace aparecer como la del balanceador de carga...mudo ...¡tonto, tonto, tonto!

No he dado la solución exacta porque la situación de cada uno es un poco diferente.Sin embargo, el concepto es sólido.Además, tenga en cuenta que si está haciendo esto en una página HTTPS, su "otherServerIOwn" también debe entregarse en esa forma segura, de lo contrario, se alertará al Cliente sobre contenido mixto.Y si tiene https, asegúrese de que TODOS sus certificados sean válidos; de lo contrario, el cliente también recibirá una advertencia.

¡Espero que ayude a alguien!Lo siento, me tomó un año responder/contribuir.:-)

Mi versión es así:

php en mi servidor:

<?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 en la página:

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

}).done( function( json ) {

    self.ip = json;

});

Funciona entre dominios.Le vendría bien una verificación de estado.Trabajando en ello.

Si el cliente tiene Java instalado, podrías hacer algo como esto:

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

Aparte de eso, probablemente tendrás que utilizar un script del lado del servidor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top