मैं क्लाइंट के कंप्यूटर से देखे गए DNS लुकअप (होस्टनाम से आईपी एड्रेस) का प्रदर्शन करने के लिए क्लाइंट-साइड जावास्क्रिप्ट का उपयोग करना चाहूंगा। क्या यह संभव है?
मैं क्लाइंट के कंप्यूटर से देखे गए DNS लुकअप (होस्टनाम से आईपी एड्रेस) का प्रदर्शन करने के लिए क्लाइंट-साइड जावास्क्रिप्ट का उपयोग करना चाहूंगा। क्या यह संभव है?
जवाबों:
जावास्क्रिप्ट मानक पुस्तकालय में मेजबानों या आईपी-पतों की कोई धारणा नहीं है। इसलिए आपको अपने लिए होस्टनाम देखने के लिए कुछ बाहरी सेवा का उपयोग करना होगा।
मैं एक cgi-bin की मेजबानी करने की सलाह देता हूं जो होस्टनाम के आईपी-एड्रेस को देखता है और जावास्क्रिप्ट के माध्यम से एक्सेस करता है।
संपादित करें : इस सवाल ने मुझे एक खुजली दी, इसलिए मैंने Google ऐप इंजन पर एक JSONP webservice डाल दी, जो ग्राहकों को आईपी पता देता है। उपयोग:
<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>
हाँ, कोई सर्वर प्रॉक्सी की आवश्यकता नहीं है।
शुद्ध जेएस नहीं कर सकते। यदि आपके पास उसी डोमेन के अंतर्गत एक सर्वर स्क्रिप्ट है जो इसे प्रिंट करता है तो आप इसे पढ़ने के लिए XMLHttpRequest भेज सकते हैं।
बहुत देर से, लेकिन मुझे लगता है कि कई लोग अभी भी "Google एयरलाइंस" के माध्यम से यहां उतरेंगे। एक मॉडेम दृष्टिकोण 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.";
}
मुझे पता है कि यह सवाल बहुत समय पहले पूछा गया था, लेकिन मुझे लगा कि मैं हाल ही में जवाब देना चाहूंगा।
आप HTTPS से अधिक DNS प्रश्नों को DNS रिसॉल्वर को भेज सकते हैं जो इसका समर्थन करते हैं। DOH के लिए मानक RFC 8484 में वर्णित है ।
यह एक ऐसी ही बात है जो अन्य सभी उत्तर सुझाते हैं, केवल यह कि DoH वास्तव में HTTPS पर DNS प्रोटोकॉल है। यह एक "प्रस्तावित" इंटरनेट मानक भी है और यह काफी लोकप्रिय हो रहा है। उदाहरण के लिए, कुछ प्रमुख ब्राउज़र या तो इसका समर्थन करते हैं या इसका समर्थन करने की योजना है (क्रोम, एज, फ़ायरफ़ॉक्स), और Microsoft इसे अपने ऑपरेटिंग सिस्टम में बनाने की प्रक्रिया में है।
DoH का एक उद्देश्य है:
क्रॉस ओरिजिनल रिसोर्स शेयरिंग (कोर) के अनुरूप एक सुरक्षित तरीके से मौजूदा ब्राउज़र एपीआई के माध्यम से डीएनएस जानकारी तक पहुँचने के लिए वेब एप्लिकेशन को अनुमति देता है।
विशेष रूप से dohjs नामक वेब एप्लिकेशन से DNS लुकअप करने के लिए एक खुला स्रोत उपकरण है । यह RFC 8484 में वर्णित HTTPS (DoH) वायरफॉर्म प्रश्नों पर DNS करता है । यह GET और POST दोनों तरीकों का समर्थन करता है।
पूर्ण प्रकटीकरण: मैं dohjs के लिए एक योगदानकर्ता हूं।
यदि आप DNS वायरफ़ॉर्मैट से परेशान नहीं होना चाहते हैं, तो Google और Cloudflare दोनों HTTPS पर DNS के लिए JSON API प्रदान करते हैं।
उदाहरण जावास्क्रिप्ट कोड Google के JSON DOH API के साथ example.com देखने के लिए:
var response = await fetch('https://dns.google/resolve?name=example.com');
var json = await response.json();
console.log(json);
यहाँ GET और POST दोनों के लिए RFC द्वारा दिए गए उदाहरण हैं (देखें https://tools.ietf.org/html/rfc8484#section-4.1.1 ):
उदाहरण प्राप्त करें:
पहला उदाहरण अनुरोध "www.example.com" प्राप्त करने के लिए GET का उपयोग करता है।
: विधि = GET
: योजना = https
: प्राधिकार = dnsserver.example.net
: path = / dns-query; dns = AAABAAABAAAAAAAAAA3d3dleGFtcGxlA2bvbQAAAQAB
स्वीकार = एप्लिकेशन / डीएनएस-संदेश
POST उदाहरण:
POST विधि का उपयोग करते हुए "www.example.com" के लिए समान DNS क्वेरी होगी:
: विधि = POST
: योजना = https
: प्राधिकार = dnsserver.example.net
: path = / dns-query
स्वीकार = आवेदन / dns-message
सामग्री-प्रकार = आवेदन / dns-message
सामग्री-लंबाई = 33<33 बाइट्स निम्न हेक्स एन्कोडिंग द्वारा प्रस्तुत> 00 00 01 00 00 01 00 00 00 00 00 77 77 77 07 65 65 6d 70 6c 70 03 63 6f 6d 00 00 01 00 01
आप कुछ सार्वजनिक DNS रिसॉल्वर की सूची पा सकते हैं जो एक जोड़े में HTTPS पर DNS का समर्थन करते हैं:
उपरोक्त संसाधनों में, मैं कहूंगा कि कर्ल की विकि पर सूची और DNSCrypt सूची शायद सबसे पूर्ण और सबसे अधिक बार अद्यतन की गई हैं। कर्ल के पेज में DoH (सर्वर, प्रॉक्सी, क्लाइंट लिबास आदि) के लिए ओपन सोर्स टूल्स की सूची भी शामिल है।
होस्ट किया गया JSONP संस्करण एक आकर्षण की तरह काम करता है, लेकिन ऐसा लगता है कि यह अपने संसाधनों पर रात के समय में सबसे अधिक दिनों (पूर्वी समय) में चला जाता है, इसलिए मुझे अपना संस्करण बनाना पड़ा।
इस तरह मैंने इसे PHP के साथ पूरा किया:
<?php
header('content-type: application/json; charset=utf-8');
$data = json_encode($_SERVER['REMOTE_ADDR']);
echo $_GET['callback'] . '(' . $data . ');';
?>
फिर जावास्क्रिप्ट पहले की तरह ही है, बस एक सरणी नहीं:
<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) सेवाएं जो इसे आसान बनाती हैं, वे हमेशा के लिए नहीं रहती हैं, लेकिन निम्नलिखित जावास्क्रिप्ट लेखन के समय मेरे लिए अच्छी तरह से काम करती हैं।
<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' बदलकर खोजने के लिए संशोधित किया जा सकता है। यह मेरे पृष्ठ पर कार्रवाई में देखा जा सकता है: http://meon.zero.eu.org/
एक तृतीय-पक्ष सेवा है जो ब्राउज़र से DNS लुकअप करने के लिए एक CORS-friendly REST API प्रदान करती है - https://exana.io/tools/dns/
जैसा कि कई लोगों ने कहा कि आपको एक बाहरी सेवा का उपयोग करने और इसे कॉल करने की आवश्यकता है। और वह केवल आपको सर्वर के नजरिए से DNS रिज़ॉल्यूशन मिलेगा।
यदि यह काफी अच्छा है और यदि आपको केवल DNS रिज़ॉल्यूशन की आवश्यकता है, तो आप निम्न डोकर कंटेनर का उपयोग कर सकते हैं:
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"
]
}
मेरी अनुशंसा है कि आप अपने सर्वर पर अपने जावास्क्रिप्ट को सर्व करने वाले सर्वर में एक विशेष अंतिम बिंदु पर कंटेनर को प्रॉक्सी से रिवर्स करने के लिए अपने वेब सर्वर को सेटअप करें और अपने मानक जावास्क्रिप्ट अजाक्स कार्यों का उपयोग करके इसे कॉल करें।
एक जावास्क्रिप्ट लाइब्रेरी है DNS-JS.com जो ऐसा करती है।
DNS.Query("dns-js.com",
DNS.QueryType.A,
function(data) {
console.log(data);
});
WebExtensions के लिए फ़ायरफ़ॉक्स में v60 के बाद से इसके लिए एक अंतर्निहित एपीआई है:
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve
browser
फ़ायरफ़ॉक्स 64 बीटा में मौजूद नहीं है तो मुझे आश्चर्य है कि अगर इसे हटा दिया गया था।
dns
अनुमति की आवश्यकता है और स्क्रिप्ट सामग्री स्क्रिप्ट के रूप में नहीं चलेगी (फिर से, browser.dns
वहां उजागर नहीं की जाएगी)
सुनिश्चित करें कि आप बिना किसी जोड़ के, बिना शुद्ध जावास्क्रिप्ट के, इस विधि का उपयोग करके कर सकते हैं, browser.dns.resolve("example.com");
लेकिन यह सिर्फ FIREFOX 60 के साथ संगत है आप MDN पर अधिक जानकारी देख सकते हैं https://developer.mozilla.org/en-US/ / मोज़िला / Add-ons / WebExtensions / एपीआई / डीएनएस / संकल्प
मुझे नहीं लगता कि यह सुरक्षा कारणों से अधिकांश ब्राउज़रों द्वारा शुद्ध जावास्क्रिप्ट संदर्भ में अनुमति देता है, जैसा कि सवाल पूछता है।
हो सकता है कि मैं इस बिंदु से चूक गया हो, लेकिन NAVY आदमी के जवाब में यहाँ बताया गया है कि कैसे ब्राउज़र आपको 'अनुरोधकर्ता' का IP पता बता सकता है (यद्यपि केवल उनका सेवा प्रदाता है)।
क्लाइंट द्वारा रेंडर किए जाने वाले पेज में एक स्क्रिप्ट टैग रखें (कॉल करने के लिए src इशारा करते हुए) एक और सर्वर है जो संतुलित नहीं है (मुझे पता है कि इसका मतलब है कि आपको दूसरे सर्वर तक पहुंच की आवश्यकता है लेकिन इन दिनों होस्टिंग सस्ता है और आप कर सकते हैं इसे आसानी से और सस्ते में सेट करें)।
यह उस प्रकार का कोड है जिसे क्लाइंट पेज में जोड़ने की आवश्यकता है:
दूसरे सर्वर "someServerIown" पर आपको ASP, ASPX या PHP पेज होना चाहिए;
----- इसमें सर्वर कोड शामिल है:
"<% Response.Write (" var clientipaddress = '"और Request.ServerVariables (" REMOTE_ADDR ") और"'; ")%>" (बाहर के dbl उद्धरणों के बिना :-))
---- और इस कोड को वापस स्क्रिप्ट टैग में लिखते हैं:
var clientipaddress = '178.32.21.45';
यह प्रभावी रूप से एक जावास्क्रिप्ट वैरिएबल बनाता है जिसे आप पेज पर जावास्क्रिप्ट के साथ एक्सेस कर सकते हैं।
उम्मीद है, आप इस संस्करण का उपयोग करते हैं और वापस भेजने के लिए तैयार प्रपत्र नियंत्रण के लिए मूल्य लिखते हैं।
जब उपयोगकर्ता पोस्ट करता है या अगले अनुरोध पर आपका जावास्क्रिप्ट और / या फॉर्म चर का मूल्य भेजता है जो "otherServerIown" ने आपके लिए भर दिया है, तो उस सर्वर पर वापस जिसे आप इसे पसंद करेंगे।
यह है कि मैं डंब लोड बैलेंसर के चारों ओर मिलता हूं, हमारे पास ग्राहक आईपी पते के मुखौटे हैं और यह लोड बैलेंसर के रूप में दिखाई देता है .... गूंगा ... गूंगा गूंगा!
मैंने सटीक समाधान नहीं दिया है क्योंकि सभी की स्थिति थोड़ी अलग है। अवधारणा ध्वनि है, हालांकि। इसके अलावा, ध्यान दें कि यदि आप 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;
});
यह क्रॉस डोमेन का काम करता है। यह एक स्थिति जाँच का उपयोग कर सकता है। उस पर काम कर रहे हैं।
यदि क्लाइंट ने जावा स्थापित किया है, तो आप कुछ ऐसा कर सकते हैं:
ipAddress = java.net.InetAddress.getLocalHost().getHostAddress();
इसके अलावा, आपको संभवतः सर्वर साइड स्क्रिप्ट का उपयोग करना होगा।