クライアント側のJavascriptを使用して、クライアントのコンピューターから見たDNSルックアップ(ホスト名からIPアドレスへ)を実行したいと思います。それは可能ですか?
Javascript標準ライブラリには、ホストやIPアドレスの概念はありません。そのため、ホスト名を検索するために外部サービスにアクセスする必要があります。
ホスト名のIPアドレスを検索し、JavaScript経由でアクセスするcgi-binをホストすることをお勧めします。
編集:この質問により悩みが生じたため、クライアントのIPアドレスを返すJSONP WebサービスをGoogle App Engineに設定しました。使用法:
<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.";
}
ホストされた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が配置されているページに書き込みますが、「zero.eu.org」を別のドメイン名に変更することにより、スクリプトを変更して任意のIPを見つけることができます。これは私のページの実際の動作で見ることができます: http://meon.zero.eu.org/
ブラウザーからDNSルックアップを実行するためのCORSフレンドリーREST API- 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を提供するサーバーの特定のエンドポイント上のコンテナーにリバースプロキシするようにWebサーバーをセットアップし、標準のJavascript Ajax関数を使用して呼び出すことです。
これを行うには、ブラウザーのサンドボックスを壊す必要があります。サーバーにルックアップを実行させ、XmlHttpを介してクライアント側からそれを要求するようにしてください。
dns browser.dns.resolve("example.com");
のこのメソッドを使用すると、純粋なjavascriptだけを追加せずにそれを行うことができますが、FIREFOX 60と互換性があります。MDNの詳細を確認できます https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve
Firefoxには、v60以降、WebExtensions用の組み込みAPIがあります。
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve
Javascriptライブラリがあります DNS-JS.com これはまさにこれを行います。
DNS.Query("dns-js.com",
DNS.QueryType.A,
function(data) {
console.log(data);
});