Я хотел бы использовать Javascript на стороне клиента для выполнения поиска DNS (имя хоста по IP-адресу), как видно с клиентского компьютера. Это возможно?
Я хотел бы использовать Javascript на стороне клиента для выполнения поиска DNS (имя хоста по IP-адресу), как видно с клиентского компьютера. Это возможно?
Ответы:
В стандартной библиотеке 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 на DNS-преобразователи, которые его поддерживают. Стандарт для DOH описан в RFC 8484 .
Это похоже на то, что предлагают все другие ответы, только DoH на самом деле является протоколом DNS через HTTPS. Это также «предлагаемый» Интернет-стандарт, и он становится довольно популярным. Например, некоторые основные браузеры либо поддерживают его, либо планируют поддерживать его (Chrome, Edge, Firefox), а Microsoft в настоящее время встраивает его в свою операционную систему.
Одна из целей DoH:
позволяя веб-приложениям получать доступ к информации DNS через существующие API-интерфейсы браузера безопасным способом в соответствии с Cross Origin Resource Sharing (CORS)
Существует инструмент с открытым исходным кодом, созданный специально для поиска DNS из веб-приложений, который называется dohjs . Он выполняет запросы формата DNS через HTTPS (DoH), как описано в RFC 8484 . Он поддерживает методы GET и POST.
Полное раскрытие информации: я - участник dohjs.
Если вы не хотите возиться с форматом проводов 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 для GET и POST (см. Https://tools.ietf.org/html/rfc8484#section-4.1.1 ):
ПОЛУЧИТЬ пример:
В первом примере запроса GET используется для запроса «www.example.com».
: method = GET
: scheme = https
: author = dnsserver.example.net
: path = / dns-query? dns = AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
accept = application / dns-message
Пример POST:
Тот же DNS-запрос для "www.example.com" с использованием метода POST будет:
: method = POST
: scheme = https
: author = dnsserver.example.net
: path = / dns-query
accept = application / dns-message
content-type = application / dns-message
content-length = 33<33 байта, представленных следующей шестнадцатеричной кодировкой> 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
Вы можете найти список некоторых общедоступных 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);
});
В 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, вы можете сделать что-то вроде этого:
ipAddress = java.net.InetAddress.getLocalHost().getHostAddress();
Помимо этого, вам, вероятно, придется использовать сценарий на стороне сервера.