我想使用客户端Javascript来执行从客户端计算机上看到的DNS查找(主机名到IP地址).那可能吗?
Zac*_*ach 85
编辑:这个问题给了我一个痒,所以我在谷歌应用引擎上建立了一个返回客户端IP地址的JSONP网络服务.用法:
<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>
Run Code Online (Sandbox Code Playgroud)
是的,不需要服务器代理.
纯JS不能.如果您在同一个域下有一个服务器脚本打印出来,您可以发送XMLHttpRequest来读取它.
Han*_*son 33
javascript标准库中没有主机或ip地址的概念.因此,您必须访问一些外部服务才能为您查找主机名.
我建议托管一个cgi-bin,它查找主机名的ip-address并通过javascript访问它.
kim*_*mbo 33
我知道这个问题很久以前就有人问过了,但我想我会提供一个更新的答案。
您可以通过 HTTPS 向支持它的 DNS 解析器发送 DNS 查询。DOH 的标准在RFC 8484 中进行了描述。
这与所有其他答案的建议类似,只是 DoH 实际上是基于 HTTPS 的 DNS 协议。它也是一个“提议的”互联网标准,并且变得非常流行。例如,一些主要浏览器要么支持它,要么计划支持它(Chrome、Edge、Firefox),而微软正在将其构建到他们的操作系统中。
DoH 的目的之一是:
允许 Web 应用程序以与跨源资源共享 (CORS) 一致的安全方式通过现有浏览器 API 访问 DNS 信息
有一个开源工具专门用于从名为dohjs 的Web 应用程序进行 DNS 查找。它通过 HTTPS (DoH) 线格式查询进行DNS,如RFC 8484 中所述。它同时支持 GET 和 POST 方法。
完全披露:我是 dohjs 的贡献者。
在这里可以找到另一个具有类似功能的 JavaScript 库 - https://github.com/sc0Vu/doh-js-client。我个人没有使用过这个,但我认为它也适用于客户端。
如果您不想打扰 DNS 线格式,Google 和 Cloudflare 都通过 HTTPS 为 DNS 提供 JSON API。
使用 Google 的 JSON DOH API 查找 example.com 的示例 Javascript 代码:
var response = await fetch('https://dns.google/resolve?name=example.com');
var json = await response.json();
console.log(json);
Run Code Online (Sandbox Code Playgroud)
以下是 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 示例:
使用 POST 方法对“www.example.com”进行相同的 DNS 查询是:
:method = POST
:scheme = https
:authority = 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 00 0d 00
您可以在以下几个地方找到一些支持 DNS over HTTPS 的公共 DNS 解析器列表:
在上述资源中,我想说 Curl 的 wiki 上的列表和 DNSCrypt 列表可能是最完整和更新最频繁的。Curl 的页面还包括 DoH 的开源工具列表(服务器、代理、客户端库等)。
ear*_*zon 27
很晚,但我想很多人仍会通过"谷歌航空公司"降落在这里.现代方法是使用不需要服务器支持的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.";
}
Run Code Online (Sandbox Code Playgroud)
tco*_*ole 14
托管的JSONP版本就像一个魅力,但它似乎在大多数日子(东部时间)的夜间都会覆盖它的资源,所以我不得不创建自己的版本.
这就是我用PHP完成它的方式:
<?php
header('content-type: application/json; charset=utf-8');
$data = json_encode($_SERVER['REMOTE_ADDR']);
echo $_GET['callback'] . '(' . $data . ');';
?>
Run Code Online (Sandbox Code Playgroud)
那么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>
Run Code Online (Sandbox Code Playgroud)
就那么简单!
附注:如果您在任何面向公众的环境中使用它,请务必清理$ _GET!
归档时间: |
|
查看次数: |
131958 次 |
最近记录: |