ฉันต้องการใช้ Javascript ฝั่งไคลเอ็นต์เพื่อทำการค้นหา DNS (ชื่อโฮสต์ไปยังที่อยู่ IP) ตามที่เห็นจากคอมพิวเตอร์ของไคลเอนต์ เป็นไปได้หรือไม่
ฉันต้องการใช้ Javascript ฝั่งไคลเอ็นต์เพื่อทำการค้นหา DNS (ชื่อโฮสต์ไปยังที่อยู่ IP) ตามที่เห็นจากคอมพิวเตอร์ของไคลเอนต์ เป็นไปได้หรือไม่
คำตอบ:
ไม่มีความคิดเกี่ยวกับโฮสต์หรือที่อยู่ IP ในไลบรารีมาตรฐานจาวาสคริปต์ ดังนั้นคุณจะต้องเข้าถึงบริการภายนอกเพื่อค้นหาชื่อโฮสต์ให้คุณ
ฉันขอแนะนำให้โฮสต์ cgi-bin ซึ่งค้นหาที่อยู่ IP ของชื่อโฮสต์และเข้าถึงผ่านจาวาสคริปต์
แก้ไข : คำถามนี้ทำให้ฉันรู้สึกคันดังนั้นฉันจึงติดตั้งบริการเว็บเซิร์ฟเวอร์ 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) wireformat คำสั่งตามที่อธิบายในRFC 8484 รองรับทั้ง GET และ POST วิธีการ
การเปิดเผยข้อมูลทั้งหมด: ฉันเป็นผู้สนับสนุน dohjs
หากคุณไม่ต้องการกังวลกับรูปแบบสาย DNS ทั้ง Google และ Cloudflare เสนอ JSON API สำหรับ DNS ผ่าน HTTPS
ตัวอย่างโค้ด Javascript เพื่อค้นหา example.com ด้วย JSON DOH API ของ Google:
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
: authority = dnsserver.example.net
: path = / dns-query? dns = AAABAAABAAAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
accept = application / dns-message
ตัวอย่าง POST:
แบบสอบถาม DNS เดียวกันสำหรับ "www.example.com" โดยใช้วิธีการ POST จะเป็น:
: 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 6d 00 00 01 00 01
คุณสามารถค้นหารายการตัวแก้ไข DNS สาธารณะที่รองรับ DNS ผ่าน HTTPS ได้ในสองที่:
จากแหล่งข้อมูลข้างต้นฉันจะบอกว่ารายการใน wiki ของ Curl และรายการ DNSCrypt น่าจะเป็นรายการที่สมบูรณ์และอัปเดตบ่อยที่สุด หน้า Curl ยังมีรายการเครื่องมือโอเพนซอร์สสำหรับ DoH (เซิร์ฟเวอร์พร็อกซีไคลเอ็นต์ libs ฯลฯ )
เวอร์ชัน 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/
มีบริการของบุคคลที่สามซึ่งให้ REST API ที่เป็นมิตรกับ CORS เพื่อทำการค้นหา 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 library DNS-JS.comที่ทำสิ่งนี้ได้
DNS.Query("dns-js.com",
DNS.QueryType.A,
function(data) {
console.log(data);
});
การทำเช่นนี้จะต้องทำลายแซนด์บ็อกซ์ของเบราว์เซอร์ พยายามให้เซิร์ฟเวอร์ของคุณทำการค้นหาและร้องขอจากฝั่งไคลเอ็นต์ผ่าน XmlHttp
Firefox มี API ในตัวสำหรับสิ่งนี้ตั้งแต่ v60 สำหรับ WebExtensions:
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve
browser
ไม่มีใน Firefox 64 beta ดังนั้นฉันจึงสงสัยว่ามันถูกลบออกไป
dns
ได้รับอนุญาตและสคริปต์จะไม่ทำงานเป็นสคริปต์เนื้อหา (เช่นเดิมอีกครั้งbrowser.dns
จะไม่ถูกเปิดเผยที่นั่น)
แน่ใจว่าคุณสามารถทำได้โดยไม่ต้องใช้การเพิ่มเติมใด ๆ เพียงแค่ javascript บริสุทธิ์โดยใช้วิธีการ dns นี้browser.dns.resolve("example.com");
แต่เข้ากันได้กับ FIREFOX 60 เท่านั้นคุณสามารถดูข้อมูลเพิ่มเติมได้ที่ MDN https://developer.mozilla.org/en-US/docs / Mozilla / Add-ons / WebExtensions / API / dns / แก้ไข
ฉันไม่คิดว่าเบราว์เซอร์ส่วนใหญ่อนุญาตด้วยเหตุผลด้านความปลอดภัยในบริบท JavaScript บริสุทธิ์ตามที่คำถามถาม
บางทีฉันอาจพลาดประเด็นไป แต่ในการตอบกลับ NAVY guy นี่คือวิธีที่เบราว์เซอร์สามารถบอกที่อยู่ IP ของ 'ผู้ร้องขอ' (แม้ว่าอาจเป็นเพียงผู้ให้บริการของพวกเขา)
วางแท็กสคริปต์ในหน้าที่จะแสดงโดยไคลเอนต์ที่เรียก (มี src ชี้ไปที่) เซิร์ฟเวอร์อื่นที่ไม่ได้โหลดบาลานซ์ (ฉันรู้ว่านี่หมายความว่าคุณต้องเข้าถึงเซิร์ฟเวอร์ที่ 2 แต่โฮสติ้งราคาถูกในปัจจุบันและคุณสามารถทำได้ ตั้งค่านี้ได้ง่ายและราคาถูก)
นี่คือประเภทของรหัสที่ต้องเพิ่มในหน้าไคลเอนต์:
บนเซิร์ฟเวอร์อื่น "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();
นอกเหนือจากนั้นคุณอาจต้องใช้สคริปต์ฝั่งเซิร์ฟเวอร์