ক্লায়েন্টের কম্পিউটার থেকে দেখা হিসাবে আমি ডিএনএস লুপ (আইপি ঠিকানার হোস্টনাম) সম্পাদন করতে ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট ব্যবহার করতে চাই। এটা কি সম্ভব?
ক্লায়েন্টের কম্পিউটার থেকে দেখা হিসাবে আমি ডিএনএস লুপ (আইপি ঠিকানার হোস্টনাম) সম্পাদন করতে ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট ব্যবহার করতে চাই। এটা কি সম্ভব?
উত্তর:
জাভাস্ক্রিপ্ট স্ট্যান্ডার্ড লাইব্রেরিতে হোস্ট বা আইপি-ঠিকানাগুলির কোনও ধারণা নেই। সুতরাং আপনার জন্য হোস্ট-নেম সন্ধান করতে আপনাকে কিছু বাহ্যিক পরিষেবা অ্যাক্সেস করতে হবে।
আমি একটি সিজি-বিন হোস্ট করার পরামর্শ দিচ্ছি যা কোনও হোস্টনামের আইপি-ঠিকানা দেখতে এবং জাভাস্ক্রিপ্টের মাধ্যমে অ্যাক্সেস করবে।
সম্পাদনা করুন : এই প্রশ্নটি আমাকে চুলকানি দিয়েছে, তাই আমি গুগল অ্যাপ ইঞ্জিনে একটি জেএসওএনপি ওয়েব সার্ভিস স্থাপন করেছি যা ক্লায়েন্টদের আইপি ঠিকানাটি দেয়। ব্যবহার:
<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>
হ্যাঁ, কোনও সার্ভারের প্রক্সি প্রয়োজন।
খাঁটি জেএস পারে না। যদি আপনার একই ডোমেনের আওতায় কোনও সার্ভার স্ক্রিপ্ট থাকে যা এটি মুদ্রণ করে তবে আপনি এটি পড়ার জন্য একটি এক্সএমএলএইচটিপিআরকুয়েস্ট পাঠাতে পারেন।
খুব দেরিতে, তবে আমার ধারণা অনেক লোক এখনও "গুগল এয়ারলাইনস" এর মাধ্যমে এখানে অবতরণ করবে। একটি মডেম অ্যাপ্রোচ হল ওয়েবআরটিটিসি ব্যবহার করা যাতে সার্ভারের সমর্থন প্রয়োজন হয় না।
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.";
}
আমি জানি এই প্রশ্নটি অনেক আগে জিজ্ঞাসা করা হয়েছিল, তবে আমি বুঝতে পেরেছিলাম যে আমি আরও সাম্প্রতিক উত্তর দেব।
আপনি এইচটিটিপিএসের মাধ্যমে ডিএনএস রেজোলভারগুলিকে সমর্থন করে এমন ডিএনএস ক্যোয়ারী প্রেরণ করতে পারেন। ডিওএইচের জন্য মানটি আরএফসি 8484 - এ বর্ণিত হয়েছে ।
এটি অন্যান্য সমস্ত উত্তরগুলির মতামতের অনুরূপ, কেবলমাত্র ডিওএইচই এইচটিটিপিএসের উপর ডিএনএস প্রোটোকল। এটি একটি "প্রস্তাবিত" ইন্টারনেট স্ট্যান্ডার্ড এবং এটি বেশ জনপ্রিয় হয়ে উঠছে। উদাহরণস্বরূপ, কিছু প্রধান ব্রাউজার এটি সমর্থন করে বা এটি সমর্থন করার পরিকল্পনা করেছে (ক্রোম, এজ, ফায়ারফক্স), এবং মাইক্রোসফ্ট তাদের অপারেটিং সিস্টেমে এটি তৈরির প্রক্রিয়াধীন রয়েছে।
ডিওএইচ এর অন্যতম উদ্দেশ্য:
ক্রস অরিজিন রিসোর্স শেয়ারিং (সিওআরএস) এর সাথে সুরক্ষিতভাবে নিরাপদে উপায়ে ব্রাউজারের API গুলির মাধ্যমে ওয়েব অ্যাপ্লিকেশনগুলিকে DNS তথ্য অ্যাক্সেস করার অনুমতি দেয়
বিশেষত দোহজ নামে পরিচিত ওয়েব অ্যাপ্লিকেশনগুলি থেকে ডিএনএস লুকআপ করার জন্য একটি ওপেন সোর্স সরঞ্জাম রয়েছে । এটি আরএফসি 8484-তে বর্ণিত হিসাবে HTTPS (DoH) ওয়্যারফর্ম্যাট প্রশ্নের উপর ডিএনএস করে । এটি জিইটি এবং পোস্ট উভয় পদ্ধতিই সমর্থন করে।
সম্পূর্ণ প্রকাশ: আমি dohjs এর একজন সহযোগী।
আপনি যদি ডিএনএস ওয়্যারফর্ম্যাট নিয়ে বিরক্ত না করতে চান তবে গুগল এবং ক্লাউডফ্লেয়ার এইচটিটিপিএস-এর মাধ্যমে ডিএনএসের জন্য জেএসএন এপিআই সরবরাহ করে।
গুগলের জেএসন ডিওএইচ এপিআই সহ উদাহরণ ডটকমকে দেখার জন্য জাভাস্ক্রিপ্ট কোড উদাহরণ:
var response = await fetch('https://dns.google/resolve?name=example.com');
var json = await response.json();
console.log(json);
আরএফসি জিইটি এবং পোষ্ট উভয়ের জন্য যে উদাহরণ দেয় তা এখানে ( https://tools.ietf.org/html/rfc8484#section-4.1.1.1 দেখুন ):
উদাহরণস্বরূপ:
প্রথম উদাহরণ অনুরোধটি "www.example.com" র অনুরোধের জন্য জিইটি ব্যবহার করে।
: পদ্ধতি = জিইটি
: স্কিম = https
: কর্তৃপক্ষ = dnsserver.example.net
: পথ = / ডিএনএস -কোয়েরি? ডিএনএস = এএএবিএএবিএএএএএএএএএএএএডিএবিএইবি
গ্রহণ = অ্যাপ্লিকেশন / ডিএনএস -বার্তা
পোস্ট উদাহরণ:
"Www.example.com" এর জন্য পোষ্ট পদ্ধতিটি ব্যবহার করে একই ডিএনএস কোয়েরি হ'ল:
: পদ্ধতি = পোস্ট
: প্রকল্প = https
: কর্তৃপক্ষ = dnsserver.example.net
: পথ = / ডিএনএস -কোয়েরি
গ্রহণ = প্রয়োগ / ডিএনএস-বার্তা
সামগ্রী-প্রকার = অ্যাপ্লিকেশন / ডিএনএস-বার্তা
সামগ্রী-দৈর্ঘ্য = 33<33 বাইটগুলি নিম্নলিখিত হেক্স এনকোডিং দ্বারা প্রতিনিধিত্ব করা হচ্ছে> 00 00 01 00 00 01 00 00 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 01 01
আপনি কয়েকটি পাবলিক ডিএনএস রেজোলভারের একটি তালিকা খুঁজে পেতে পারেন যা এইচটিটিপিএসের মাধ্যমে ডিএনএসকে কয়েকটি জায়গায় সমর্থন করে:
উপরোক্ত সংস্থানগুলির মধ্যে আমি বলব যে কার্লের উইকির তালিকা এবং ডিএনএসক্রিপ্টের তালিকাটি সম্ভবত সবচেয়ে সম্পূর্ণ এবং সর্বাধিক ঘন ঘন আপডেট হওয়া। কার্লের পৃষ্ঠায় DoH (সার্ভার, প্রক্সি, ক্লায়েন্ট libs, ইত্যাদি) এর জন্য ওপেন সোর্স সরঞ্জামগুলির একটি তালিকাও অন্তর্ভুক্ত রয়েছে।
হোস্ট করা জেএসএনপি সংস্করণটি কবজির মতো কাজ করে তবে মনে হয় এটি বেশিরভাগ দিন (পূর্ব সময়) রাতের সময় এটির সংস্থানগুলি অতিক্রম করে, তাই আমাকে নিজের সংস্করণ তৈরি করতে হয়েছিল।
এইভাবে আমি পিএইচপি দিয়ে এটি সম্পাদন করেছি:
<?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>
যে হিসাবে সহজ!
পার্শ্ব নোট: আপনি যদি কোনও জন-মুখোমুখি পরিবেশে এটি ব্যবহার করেন তবে আপনার G _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>
উপরের পৃষ্ঠাটিতে আমার সার্ভারের আইপি লিখেছে এটি অবস্থিত তবে স্ক্রিপ্টটি অন্য কোনও ডোমেইনের নামে 'শূন্য.ইউ.আর.আর.জি.' পরিবর্তন করে যে কোনও আইপি সন্ধানের জন্য পরিবর্তন করা যেতে পারে। এটি আমার পৃষ্ঠায় ক্রিয়াকলাপে দেখা যেতে পারে: http://meon.zero.eu.org/
একটি তৃতীয় পক্ষের পরিষেবা রয়েছে যা ব্রাউজার থেকে ডিএনএস লুকআপ করার জন্য একটি কর্স-বান্ধব REST এপিআই সরবরাহ করে - https://exana.io/tools/dns/
অনেক লোক বলেছে আপনার একটি বাহ্যিক পরিষেবা ব্যবহার করা এবং এটি কল করা দরকার। এবং এটি আপনাকে সার্ভারের দৃষ্টিকোণ থেকে কেবল ডিএনএস রেজোলিউশন পাবে।
যদি এটি যথেষ্ট ভাল হয় এবং আপনার যদি কেবল ডিএনএস রেজোলিউশন প্রয়োজন হয় তবে আপনি নিম্নলিখিত ডকার পাত্রটি ব্যবহার করতে পারেন:
https://github.com/kuralabs/docker-webaiodns
সমাপ্তি:
[GET] /ipv6/[domain]
: প্রদত্ত ডোমেনের জন্য একটি ডিএনএস রেজোলিউশন সম্পাদন করুন এবং সম্পর্কিত আইপিভি 6 ঠিকানাগুলি ফিরিয়ে দিন।
{
"addresses": [
"2a01:91ff::f03c:7e01:51bd:fe1f"
]
}
[GET] /ipv4/[domain]
: প্রদত্ত ডোমেনের জন্য একটি ডিএনএস রেজোলিউশন সম্পাদন করুন এবং সম্পর্কিত আইপিভি 4 ঠিকানাগুলি ফিরিয়ে দিন।
{
"addresses": [
"139.180.232.162"
]
}
আমার সুপারিশটি হ'ল আপনি আপনার জাভাস্ক্রিপ্ট পরিবেশন করার জন্য আপনার সার্ভারের নির্দিষ্ট প্রান্তে ধারকটিতে প্রক্সিটি উল্টানোর জন্য আপনার ওয়েব সার্ভারটি সেটআপ করুন এবং এটি আপনার স্ট্যান্ডার্ড জাভাস্ক্রিপ্ট অ্যাজাক্স ফাংশনগুলি ব্যবহার করে কল করুন।
একটি জাভাস্ক্রিপ্ট লাইব্রেরি আছে DNS-JS.com যা কেবল এটি করে।
DNS.Query("dns-js.com",
DNS.QueryType.A,
function(data) {
console.log(data);
});
ফায়ারফক্সের ওয়েব-এক্সটেনশনের জন্য v60 সাল থেকে এর জন্য একটি অন্তর্নির্মিত এপিআই রয়েছে:
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExistances/API/dns/resolve
browser
ফায়ারফক্স bet৪ বিটাতে উপস্থিত নেই তাই আমি ভাবছি যে এটি অপসারণ করা হয়েছে কিনা।
dns
অনুমতি প্রয়োজন এবং স্ক্রিপ্টটি কোনও সামগ্রীর স্ক্রিপ্ট হিসাবে চলবে না (যেমনটি আবার browser.dns
সেখানে প্রকাশ করা হবে না)
নিশ্চিত যে আপনি browser.dns.resolve("example.com");
ডিএনএসের এই পদ্ধতিটি ব্যবহার করে কোনও খাঁটি জাভাস্ক্রিপ্ট, কোনও সংযোজন না করেই এটি করতে পারেন তবে এটি কেবলমাত্র ফায়ারফক্স 60 এর সাথে সামঞ্জস্যপূর্ণ আপনি এমডিএন https://developer.mozilla.org/en-US/docs এ আরও তথ্য দেখতে পারবেন / মোজিলা / অ্যাড-অনস / ওয়েব এক্সটেনশনগুলি / এপিআই / ডিএনএস / সমাধান
আমি মনে করি না যে এটি বেশিরভাগ ব্রাউজারের দ্বারা সুরক্ষার কারণে অনুমোদিত হয়েছে, প্রশ্ন হিসাবে শুদ্ধ জাভাস্ক্রিপ্ট প্রসঙ্গে।
হয়তো আমি বিষয়টিটি মিস করেছি তবে NAVY লোকের জবাবে এখানে ব্রাউজারটি কীভাবে আপনাকে 'অনুরোধকারীর' আইপি ঠিকানা বলতে পারে (যদিও তারা কেবল তাদের পরিষেবা সরবরাহকারী হতে পারে)।
পৃষ্ঠায় একটি স্ক্রিপ্ট ট্যাগটি ক্লায়েন্ট দ্বারা রেন্ডার করার জন্য কল করুন (এসসিআর পয়েন্ট করছে) অন্য একটি সার্ভার যা ভারসাম্য লোড করা হয়নি (আমি বুঝতে পেরেছি যে এর অর্থ আপনার একটি দ্বিতীয় সার্ভারে অ্যাক্সেস প্রয়োজন তবে হোস্টিং এই দিনগুলিতে সস্তা এবং আপনি করতে পারেন) এটি সহজে এবং সস্তায় সেট আপ করুন)।
এটি এমন ধরণের কোড যা ক্লায়েন্ট পৃষ্ঠায় যুক্ত করা দরকার:
অন্যান্য সার্ভারে "কিছু সার্ভারআইউন" আপনার এএসপি, এএসপিএক্স বা পিএইচপি পৃষ্ঠা থাকা দরকার;
----- এর মধ্যে সার্ভার কোড রয়েছে:
"%
---- এবং স্ক্রিপ্ট ট্যাগ এ ফিরে এই কোডটি লিখেছেন:
var clientipaddress = '178.32.21.45';
এটি কার্যকরভাবে একটি জাভাস্ক্রিপ্ট ভেরিয়েবল তৈরি করে যা আপনি পৃষ্ঠাতে জাভাস্ক্রিপ্টের সাহায্যে অ্যাক্সেস করতে পারবেন।
আশা করি, আপনি এই ভ্যারিসটি অ্যাক্সেস করেন এবং ফেরত প্রেরণের জন্য প্রস্তুত একটি ফর্ম নিয়ন্ত্রণে মানটি লিখুন।
ব্যবহারকারী যখন জাভাস্ক্রিপ্ট এবং / অথবা ফর্মটি পরবর্তী অনুরোধে আসে বা "বা অন্যান্য ফর্মটি" অন্যান্য সার্ভারআইউন "আপনার জন্য ভেরিয়েবলের মান প্রেরণ করে, আপনি যে সার্ভারটিতে এটি চান তা ফিরে পাবেন।
এইভাবে আমি বোবা লোড ব্যালেন্সারের কাছাকাছি আসি যা আমাদের ক্লায়েন্টের আইপি অ্যাড্রেসটি মাস্ক করে এবং এটিকে লোড ব্যালান্সারের মতো প্রদর্শিত হয় .... বোবা ... বোবা বোবা!
আমি সঠিক সমাধানটি দেয়নি কারণ সবার পরিস্থিতি কিছুটা আলাদা। ধারণাটি অবশ্য দৃ sound়। এছাড়াও, আপনি যদি এইচটিটিপিএস পৃষ্ঠায় এটি করছেন তবে আপনার "অন্যান্য সার্ভারআইওন" অবশ্যই সেই সুরক্ষিত ফর্মটি সরবরাহ করতে হবে অন্যথায় ক্লায়েন্টকে মিশ্র সামগ্রীতে সতর্ক করা হয়েছে। এবং যদি আপনার https থাকে তবে আপনার সমস্ত শংসাপত্রগুলি বৈধ কিনা তা নিশ্চিত করুন অন্যথায় ক্লায়েন্টও একটি সতর্কতা পেয়েছে।
আশা করি এটি কাউকে সাহায্য করবে! দুঃখিত, উত্তর দিতে / অবদান করতে এক বছর সময় নিয়েছে। :-)
আমার সংস্করণটি এরকম:
আমার সার্ভারে পিএইচপি:
<?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();
তা ছাড়া, আপনাকে সম্ভবত একটি সার্ভার সাইড স্ক্রিপ্ট ব্যবহার করতে হবে।