Я хотел бы использовать Javascript на стороне клиента для выполнения поиска DNS (имя хоста по IP-адресу), как видно с клиентского компьютера. Это возможно?
javascript
dns
Ной Джейкобсон
источник
источник
Ответы:
В стандартной библиотеке javascript нет понятия хостов или IP-адресов. Таким образом, вам придется получить доступ к какой-либо внешней службе, чтобы найти для вас имена хостов.
Я рекомендую разместить cgi-bin, который ищет IP-адрес имени хоста и получает доступ к нему через javascript.
источник
Изменить : этот вопрос вызвал у меня зуд, поэтому я разместил веб-сервис 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 для его чтения.
источник
Очень поздно, но я полагаю, что многие люди все же будут приземляться здесь через "Google Airlines". Современный подход заключается в использовании 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."; }
источник
Я знаю, что этот вопрос задавали очень давно, но я решил, что предлагаю более свежий ответ.
DNS через HTTPS (DoH)
Вы можете отправлять DNS-запросы через HTTPS на DNS-преобразователи, которые его поддерживают. Стандарт для DOH описан в RFC 8484 .
Это похоже на то, что предлагают все другие ответы, только DoH на самом деле является протоколом DNS через HTTPS. Это также «предлагаемый» Интернет-стандарт, и он становится довольно популярным. Например, некоторые основные браузеры либо поддерживают его, либо планируют поддерживать его (Chrome, Edge, Firefox), а Microsoft в настоящее время встраивает его в свою операционную систему.
Одна из целей DoH:
Существует инструмент с открытым исходным кодом, созданный специально для поиска DNS из веб-приложений, который называется dohjs . Он выполняет запросы формата DNS через HTTPS (DoH), как описано в RFC 8484 . Он поддерживает методы GET и POST.
Полное раскрытие информации: я - участник dohjs.
DNS через HTTPS JSON API
Если вы не хотите возиться с форматом проводов DNS, и Google, и Cloudflare предлагают JSON API для DNS через HTTPS.
Пример кода Javascript для поиска example.com с помощью Google JSON DOH API:
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 ):
ПОЛУЧИТЬ пример:
Пример POST:
Другие места для отправки запросов DOH
Вы можете найти список некоторых общедоступных DNS-преобразователей, поддерживающих DNS через HTTPS, в нескольких местах:
Из вышеперечисленных ресурсов я бы сказал, что список вики Curl и список DNSCrypt, вероятно, являются наиболее полными и наиболее часто обновляемыми. Страница Curl также включает список инструментов с открытым исходным кодом для DoH (серверы, прокси, клиентские библиотеки и т. Д.).
источник
Размещенная версия 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, если вы используете его в любой общедоступной среде!
источник
Я понимаю, что это старый вопрос, но мое решение может помочь другим.
Я считаю, что сервисы 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/
источник
Существует сторонняя служба, которая предоставляет CORS-дружественный REST API для выполнения поиска DNS из браузера - https://exana.io/tools/dns/
источник
Как говорили многие, вам нужно воспользоваться внешней службой и позвонить ей. И это даст вам разрешение 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.
источник
Для этого существует библиотека javascript DNS-JS.com .
DNS.Query("dns-js.com", DNS.QueryType.A, function(data) { console.log(data); });
источник
Для этого потребуется сломать песочницу браузера. Попробуйте разрешить вашему серверу выполнять поиск и запрашивать его со стороны клиента через XmlHttp.
источник
В Firefox с версии 60 для этого есть встроенный API для WebExtensions:
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve
источник
browser
его нет в бета-версии Firefox 64, поэтому мне интересно, было ли это удалено.dns
разрешение, и сценарий не должен запускаться как сценарий содержимого (опять же,browser.dns
он не будет там отображаться)конечно, вы можете сделать это без использования каких-либо дополнений, только чистый javascript, используя этот метод DNS,
browser.dns.resolve("example.com");
но он совместим только с FIREFOX 60, вы можете увидеть больше информации на MDN https://developer.mozilla.org/en-US/docs / Mozilla / Надстройки / WebExtensions / API / dns / resolveисточник
Я не думаю, что это разрешено большинством браузеров по соображениям безопасности в контексте чистого JavaScript, как задается вопрос.
источник
Возможно, я упустил суть, но в ответ парню из NAVY вот как браузер может сообщить вам IP-адрес «запрашивающего» (хотя, возможно, только его поставщика услуг).
Поместите тег script на страницу, которая будет отображаться клиентом, который вызывает (имеет 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, убедитесь, что ВСЕ ваши сертификаты действительны, иначе клиент также получит предупреждение.
Надеюсь, это кому-то поможет! Извините, на то, чтобы ответить / внести свой вклад, потребовался год. :-)
источник
Моя версия такая:
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; });
Работает кросс-домен. Он может использовать проверку статуса. Работаем над этим.
источник
Если у клиента установлена Java, вы можете сделать что-то вроде этого:
Помимо этого, вам, вероятно, придется использовать сценарий на стороне сервера.
источник