Могу ли я выполнить поиск DNS (имя хоста по IP-адресу), используя клиентский Javascript? - PullRequest
77 голосов
/ 19 сентября 2008

Я хотел бы использовать Javascript на стороне клиента для выполнения поиска DNS (имя хоста по IP-адресу), как видно с компьютера клиента. Это возможно?

Ответы [ 14 ]

86 голосов
/ 19 сентября 2008

Редактировать : этот вопрос вызвал у меня зуд, поэтому я установил веб-сервис JSONP в Google App Engine, который возвращает IP-адрес клиента. Использование:

<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 для его чтения.

31 голосов
/ 19 сентября 2008

В стандартной библиотеке javascript нет понятия хостов или ip-адресов. Таким образом, вам придется получить доступ к какой-либо внешней службе для поиска имен хостов.

Я рекомендую разместить cgi-bin, которая ищет ip-адрес имени хоста и обращается к нему через javascript.

25 голосов
/ 21 сентября 2014

Очень поздно, но я думаю, что многие люди все еще будут приземляться здесь через "Авиакомпании Google". Подход Moderm заключается в использовании 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.";
}   
14 голосов
/ 19 августа 2011

Размещенная версия 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, если вы используете его в любой общедоступной среде!

2 голосов
/ 06 июля 2017

Существует сторонняя служба, предоставляющая CORS-дружественный REST API для выполнения поиска DNS из браузера - https://exana.io/tools/dns/

2 голосов
/ 22 апреля 2015

Я знаю, что это старый вопрос, но мое решение может помочь другим.

Я считаю, что службы 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-адрес моего сервера на странице, где он находится, но скрипт можно изменить, чтобы найти любой IP-адрес, изменив «zero.eu.org» на другое доменное имя. Это можно увидеть в действии на моей странице по адресу: http://meon.zero.eu.org/

1 голос
/ 17 января 2018

Как многие люди сказали, что вам нужно использовать внешний сервис и позвонить ему. И это только даст вам разрешение DNS с точки зрения сервера.

Если этого достаточно, и вам нужно только разрешение DNS, вы можете использовать следующий Docker-контейнер:

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

Endpoints:

[GET] /ipv6/[domain]: Выполните разрешение DNS для данного домена и верните связанный IPv6 адреса.

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

[GET] /ipv4/[domain]: Выполните разрешение DNS для данного домена и верните связанный IPv4 адреса.

 {
     "addresses": [
         "139.180.232.162"
     ]
 }

Я рекомендую вам настроить веб-сервер так, чтобы он перенаправлял прокси-сервер к контейнеру на определенной конечной точке вашего сервера, обслуживающего ваш Javascript, и вызывал его, используя стандартные функции Javascript Ajax.

0 голосов
/ 02 апреля 2019

уверен, что вы можете сделать это без использования каких-либо дополнений, просто чистый JavaScript, используя этот метод DNS browser.dns.resolve("example.com"); но он совместим только с FIREFOX 60, вы можете увидеть больше информации по MDN https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve

0 голосов
/ 05 ноября 2018

Firefox имеет встроенный API для этого начиная с v60, для WebExtensions:

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

0 голосов
/ 29 мая 2014

Моя версия такова:

php на моем сервере:

<?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 на странице:

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

}).done( function( json ) {

    self.ip = json;

});

Работает кросс-домен. Это может использовать проверку статуса. Работаю над этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...