Могу ли я выполнять поиск DNS (имя хоста по IP-адресу) с помощью клиентского Javascript?

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

Ответ 1

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

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

Ответ 2

Изменить. Этот вопрос дал мне зуд, поэтому я включил веб-сервис 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>

Yay, не требуется прокси серверов.


Pure JS не может. Если у вас есть сервер script в том же домене, который его распечатывает, вы можете отправить XMLHttpRequest для его чтения.

Ответ 3

Очень поздно, но я думаю, что многие люди все равно приземлятся здесь через "Авиалинии Google". Модемный подход заключается в использовании 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.";
}   

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

Конечные точки:

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

Ответ 8

Для этого потребуется разбить песочницу браузера. Попробуйте, чтобы ваш сервер выполнял поиск и запрашивал его со стороны клиента через XmlHttp.

Ответ 9

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

Ответ 10

Есть библиотека javascript DNS-JS.com, которая делает именно это.

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

Ответ 11

Я знаю, что этот вопрос задавался очень давно, но я решил предложить более свежий ответ.

DNS через HTTPS (DOH)

Вы можете отправлять DNS-запросы по HTTPS DNS-распознавателям, которые его поддерживают. Стандарт для DOH описан в RFC 8484.

API-интерфейсы DNS поверх HTTPS JSON

Если вы не хотите беспокоиться о проводном формате DNS, Google и Cloudflare предлагают API-интерфейсы JSON для DNS через HTTPS.

Пример кода Javascript для поиска example.com с API Google JSON DOH:

var response = await fetch('https://dns.google/resolve?name=example.com');
var json = await response.json();
console.log(json);

Примеры из RFC для DOH GET и POST с помощью wireformat

Вот примеры, которые RFC дает как для GET, так и для POST (см. https://tools.ietf.org/html/rfc8484#section-4.1.1):

ПОЛУЧИТЕ пример:

Первый пример запроса использует GET для запроса "www.example.com".

:method = GET
:scheme = https
:authority = dnsserver.example.net
:path =/dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
accept = application/dns-message

Пример POST:

Тот же DNS-запрос для "www.example.com" с использованием метода POST    быть:

:method = POST
:scheme = https
:authority = dnsserver.example.net
:path =/dns-query
accept = application/dns-message
content-type = application/dns-message
content-length = 33

<33 bytes represented by the following hex encoding> 00 00 01 00 00 01 00 00 00 00 00 00 03 77 77 77 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00 01

Другие места для отправки запросов DOH

Вы можете найти список некоторых общедоступных преобразователей DNS, которые поддерживают DNS через HTTPS, в нескольких местах:

Из вышеперечисленных ресурсов я бы сказал, что список в Curl wiki, вероятно, является наиболее полным и наиболее часто обновляемым.

Ответ 12

Я не думаю, что это разрешено большинством браузеров по соображениям безопасности, в чистом контексте JavaScript, когда возникает вопрос.

Ответ 14

Может быть, я упустил момент, но в ответ парню NAVY вот как браузер может сказать вам IP-адрес "запрашивающей стороны" (хотя, может быть, только их поставщик услуг).

Поместите тег скрипта на страницу, которая будет отображаться клиентом, который вызывает (указывает src) другой сервер, который не сбалансирован по нагрузке (я понимаю, что это означает, что вам нужен доступ ко второму серверу, но хостинг в наши дни дешев, и вы можете настроить это легко и дешево).

Этот код необходимо добавить на страницу клиента:

На другом сервере "someServerIown" у вас должна быть страница ASP, ASPX или PHP, которая

----- содержит такой код сервера:

"& Л;%  Response.Write("var clientipaddress = '" & Request.ServerVariables("REMOTE_ADDR") & "';")  %>" (без внешних кавычек dbl :-))

---- и записывает этот код обратно в тег скрипта:

   var clientipaddress = '178.32.21.45';

Это эффективно создает переменную Javascript, к которой вы можете получить доступ с помощью Javascript на странице не менее.

Надеемся, что вы получите доступ к этой переменной и запишите значение в элемент управления формы, готовый для отправки обратно.

Когда пользователь публикует или получает следующий запрос, ваш Javascript и/или форма отправляет значение переменной, которую вам заполнил "otherServerIown", обратно на сервер, на котором вы хотели бы его видеть.

Вот так я обхожу бездействующий балансировщик нагрузки, который маскирует IP-адрес клиента и делает его похожим на адрес балансировщика нагрузки.... тупой... тупой тупой тупой!

Я не дал точное решение, потому что все ситуации немного разные. Концепция звучит, однако. Кроме того, обратите внимание, что если вы делаете это на странице HTTPS, ваш "otherServerIOwn" также должен доставлять в этой защищенной форме, в противном случае Клиент будет предупрежден о смешанном контенте. И если у вас есть https, убедитесь, что ВСЕ ваши сертификаты действительны, в противном случае клиент также получит предупреждение.

Надеюсь, это поможет кому-то! Извините, потребовался год, чтобы ответить/внести свой вклад. :-)

Ответ 15

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

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;

});

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

Ответ 16

Если у клиента установлена ​​Java, вы можете сделать что-то вроде этого:

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

Кроме того, вам, вероятно, придется использовать серверную часть script.