当前位置:  开发笔记 > 编程语言 > 正文

我可以使用客户端Javascript执行DNS查找(主机名到IP地址)吗?

如何解决《我可以使用客户端Javascript执行DNS查找(主机名到IP地址)吗?》经验,为你挑选了4个好方法。

我想使用客户端Javascript来执行从客户端计算机上看到的DNS查找(主机名到IP地址).那可能吗?



1> Zach..:

编辑:这个问题给了我一个痒,所以我在谷歌应用引擎上建立了一个返回客户端IP地址的JSONP网络服务.用法:




是的,不需要服务器代理.


纯JS不能.如果您在同一个域下有一个服务器脚本打印出来,您可以发送XMLHttpRequest来读取它.


对不起,但不得不downvote,因为我不认为它实际上回答了原来的问题.他们只想要一个标准的DNS查找,而不是用户的公共IP.
你可以将源发布到你的网络服务吗?运行一个实例会很好.

2> Hans Sjunnes..:

javascript标准库中没有主机或ip地址的概念.因此,您必须访问一些外部服务才能为您查找主机名.

我建议托管一个cgi-bin,它查找主机名的ip-address并通过javascript访问它.


cgi-bin目录?那是老派.我喜欢!
在撰写本文时(2008年),情况确实如此.6年后情况并非如此:在同一页面中查看我对WebRTC的评论.(不幸的是,Google在搜索IP地址问题的解决方案时仍指向此线程,这可能会使人们走错方向).

3> earizon..:

很晚,但我想很多人仍会通过"谷歌航空公司"降落在这里.现代方法是使用不需要服务器支持的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 = "ifconfig | grep inet | grep -v inet6 | cut -d\" \" -f2 | tail -n1";
    document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull.";
}   


这确实是WebRTC之前不存在的新功能 - 发现您自己的IP地址.但@noahjacobson问了一个不同的问题 - 来自javascript的主机名对IP进行DNS查询.
非常,非常有趣,它是一个错误或设计缺陷,无论如何在某些时候它会被纠正,所以对长期项目没有好处

4> tcole..:

托管的JSONP版本就像一个魅力,但它似乎在大多数日子(东部时间)的夜间都会覆盖它的资源,所以我不得不创建自己的版本.

这就是我用PHP完成它的方式:


那么Javascript和以前完全一样,只是不是一个数组:




就那么简单!

附注:如果您在任何面向公众的环境中使用它,请务必清理$ _GET!


对不起,但不得不downvote,因为我不认为它实际上回答了原来的问题.他们只想要一个标准的DNS查找,而不是用户的公共IP.
@SimonEast嘿.你修改了一个7岁问题的问题.做你需要的任何事情来满足自己;-)
我只是编辑原始问题以使其更清楚,因为我最近研究了同样的问题,但由于某种原因,这里的大多数答案实际上并不是原始海报所要求的,而应该在另一个问题下发布.
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有