यदि स्थानीय होस्ट कनेक्शन है तो जावास्क्रिप्ट के साथ कैसे जांचें?


99

यदि मेरी लोडिंग पृष्ठ मेरे स्थानीय मशीन पर है, तो मैं अपनी जावास्क्रिप्ट में एक जांच करना चाहता हूं।

यही कारण है कि मैं यह करना चाहता हूं कि जब मैं विकसित कर रहा हूं तो मुझे यह सुनिश्चित करना पसंद है कि मेरे सर्वर साइड (C #) सत्यापन सही ढंग से काम कर रहे हैं। इसलिए मैं क्लाइंट साइड और सर्वर साइड दोनों त्रुटियों को दिखाना पसंद करता हूं।

इसलिए जब मैं परीक्षण कर रहा हूं तो मेरे पास मेरे वैध सामान में एक झंडा है जो हमेशा अमान्य डेटा से गुजरता है। इस तरह मैं क्लाइंट साइड और सर्वर की त्रुटियों को एक बार में देखता हूं।

हालाँकि अभी मुझे मैन्युअल रूप से जाना है और विकास से उत्पादन तक जाते समय आगे और पीछे बदलना होगा।


3
मैं इनमें से किसी भी तरीके का उपयोग करके किसी को भी सावधानी बरतने के लिए जवाब दूंगा, ताकि सिस्टम में कार्यक्षमता को "जोड़" सके, खासकर अगर आपके सिस्टम में अन्यथा सुरक्षित जानकारी या डेटा को उजागर करने के लिए कार्यक्षमता का उपयोग किया जा सकता है। इस तकनीक को "हटाने" के लिए कार्यक्षमता का उपयोग करना समझ में आता है। उदाहरण के लिए, यदि आप अपने विकास के माहौल में ट्रैकिंग विश्लेषिकी को दबाना चाहते हैं, भले ही आप इसे अपने उत्पादन वातावरण में करते हैं। बस इस बारे में ध्यान से सोचें कि आप ब्राउज़र-साइड सशर्त या टॉगल के माध्यम से क्या उजागर कर रहे हैं और यह सुरक्षा भेद्यता कैसे बन सकती है।
जावीद जमा

जवाबों:


206

location.hostnameचर आप वर्तमान मेजबान देता है। आपके लिए यह निर्धारित करना पर्याप्त होगा कि आप किस वातावरण में हैं।

if (location.hostname === "localhost" || location.hostname === "127.0.0.1")
    alert("It's a local server!");

14
क्या अधिक सामान्य / "कैच-ऑल" समाधान नहीं है जो 127.0.0.1 आदि का उपयोग करने के मामलों को भी कवर करेगा?
१२:२१ पर जकोबक

8
यह सिर्फ गलत है। बहुत से लोग अपनी होस्ट फ़ाइल को संपादित करते हैं, इसलिए 'लोकलहोस्ट' शब्द नहीं मिलेगा
vsync

4
मैं सहमत हूँ। ये गलत है। नेटवर्क ड्राइव के माध्यम से "स्थानीय" फ़ाइल तक पहुँचने पर भी काम नहीं करेगा।
ProblemsOfSumit

1
@ फ़ाइल इंटरफ़ेस के माध्यम से देखें कि आप होस्टनाम खाली है
chacham15

1
उह यकीन नहीं है कि हर एक इसे गलत क्यों कह रहा है। यह साधारण स्निप्ड लोकलहोस्ट और प्रोडक्शन पर मेरे लिए परफेक्ट काम करता है। मेरा सॉफ्टवेयर विज्ञापनों की सेवा के लिए मौसम जानता है - या नहीं, कोड की 1 सरल रेखा के साथ। धन्यवाद ओपी
एंडी

30

अगर ब्राउज़र में स्टेटिक html लॉन्च करना, जैसे कि file:///C:/Documents and Settings/Administrator/Desktop/"लोकलहोस्ट" का पता लगाने से काम नहीं चलेगा। location.hostnameखाली स्ट्रिंग लौटेंगे। इसलिए

if (location.hostname === "localhost" || location.hostname === "127.0.0.1" || location.hostname === "")
    alert("It's a local server!");

मैं इस सटीक मुद्दे पर भाग गया और जब मैंने स्वयं समाधान निकाला, तब भी यह उत्तर अधिक होना चाहिए।
डोमसन

6

अभी भी सभी को पकड़ नहीं है लेकिन यह थोड़ा सुधार हो सकता है। अब आप डोमेन और उपयोग की एक सरणी बना सकते हैं .includes

const LOCAL_DOMAINS = ["localhost", "127.0.0.1", ...];

if (LOCAL_DOMAINS.includes(window.location.hostname))
  alert("It's a local server!");

3

यही कारण है कि यह रिएक्ट में जांचा जाता है , सेवा कार्यकर्ता को पंजीकृत करें , यह जांचने का अच्छा तरीका है कि क्या आप लोकलहोस्ट पर होस्टनाम की जांच करके, लोकलहोस्ट और आईपीवी 6 सहित , और 127 के साथ मिलान शुरू कर रहे हैं :

const isLocalhost = Boolean(
    window.location.hostname === 'localhost' ||
    // [::1] is the IPv6 localhost address.
    window.location.hostname === '[::1]' ||
    // 127.0.0.1/8 is considered localhost for IPv4.
    window.location.hostname.match(
        /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
    )
);

2

ऐसा करने का एक आसान तरीका यह होगा कि आप केवल लोकलहोस्ट के खिलाफ होस्टनाम की जाँच करें या अपने कस्टम डोमेन नाम को एक सबस्ट्रिंग के खिलाफ चेक करें, इस मामले में ".Local" यूआरएल, जैसे http: //testsite.local

var myUrlPattern = '.local';
if (window.location.hostname === "localhost" || location.hostname === "127.0.0.1" || window.location.hostname.indexOf(myUrlPattern) >= 0) {
    alert("It's a local server!");
}

2

अन्य लिपियों के समान मैकेनिक का उपयोग करके सबसे छोटा रूप:

if ( ["localhost", "127.0.0.1", ""].includes(window.location.hostname) ) {
     console.log("It's local host !");
}

2

यह एक भी कुछ सामान्य मामलों में जहां स्थानीय नेटवर्क आईपी के साथ शुरू शामिल किया गया है 10.0.या 192.168.या Bonjour डोमेन को समाप्त होने की तरह .local:

export function isLocalNetwork(hostname = window.location.hostname) {
  return (
    (['localhost', '127.0.0.1', '', '::1'].includes(hostname))
    || (hostname.startsWith('192.168.'))
    || (hostname.startsWith('10.0.'))
    || (hostname.endsWith('.local'))
  )
}

1

आप इस तरह से c # वाले पृष्ठों के पीछे अपने किसी एक कोड का पता लगा सकते हैं:

if ((Request.Url.Host.ToLower() == "localhost"))
{
    // ..., maybe set an asp:Literal value that's in the js
}

या यदि आप इसे क्लाइंट स्क्रिप्ट से करना चाहते हैं, तो आप window.location.host का मान जाँच सकते हैं।

if (window.location.host == "localhost")
{
    // Do whatever
}

उम्मीद है की यह मदद करेगा।


3
location.host में होस्टनाम और पोर्ट शामिल हैं। इसके बजाय location.hostname का उपयोग करें।
18

1
const LOCAL_DOMAINS = [ "localhost", "127.0.0.1" ];

/* offline || development */
if ( LOCAL_DOMAINS.includes(location.hostname) )
{
    BASE_URL_PUBLIC = location.hostname + "/folder/website/"; // your project folder
}

/* online || production */
else
{
    BASE_URL_PUBLIC = location.hostname;
}

0

उपरोक्त उत्तर ज्यादातर समस्या को हल करते हैं लेकिन ...

  • क्या होगा अगर लोकलहोस्ट जरूरी नहीं है 'लोकलहोस्ट /'?
  • क्या होगा यदि आप विकास के दौरान FE सत्यापन करना चाहते हैं?
  • क्या होगा यदि आप देव के दौरान विभिन्न व्यवहार चाहते हैं
    ( सत्यापन, कोई सत्यापन नहीं )

एक समाधान स्थान हैश सेट और यह जाँच करने के लिए है।

http://myname.foo.com/form.html#devValidation

आप स्विच के साथ असीमित विकल्प जोड़ सकते हैं

switch(location.hash) {}
    case '#devValidation':
        // log the results and post the form
        break;
    case '#beValidation':
        // skip front end validation entirely
        break;
    case '#noValidation':
        // skip all validation $('[name=validationType']).val('novalidation');
        break;
    case '#feValidation':
    default:
        // do fe validation
        break;
}

इस समाधान में अभी भी कुछ मैनुअल काम है और इसके साथ छेड़छाड़ की जा सकती है।
A1rPun

मुझे लगता है कि "मैनुअल वर्क" महत्वहीन है, साथ ही छेड़छाड़ के बाद से हम जो कुछ भी पसंद करते हैं उसे जावास्क्रिप्ट की मंजूरी के बिना सबमिट कर सकते हैं और अधिकांश रूपरेखाओं में फ़िल्टर होते हैं जो अनुरोध पर पहुंचने से पहले हमलों को कम करते हैं। शायद ओपी को सर्वर साइड सत्यापन को छोड़ने की अनुमति देना एक जोखिम है, लेकिन यह केवल हैश में एक कुंजी का उपयोग करने की उपयोगिता दिखाने के लिए जोड़ा गया था।
शनीमल

मैं कभी भी लोकलहोस्ट या लूपबैक का उपयोग नहीं करता हूं क्योंकि दर्जनों अंतरराष्ट्रीय क्लाइंट (clinetA.com, clientA.de, clientB.com, clientB.au, आदि ...) को सफ़ेद किया जाता है। मैंने इस समाधान की पेशकश करने का फैसला किया क्योंकि यह डोमेन के बारे में परवाह नहीं करता है और पैच के बिना एक लाइव साइट में जांच की जा सकती है।
शनीमल

0

नियमित अभिव्यक्ति * धीमी है, लेकिन छोटी और साफ है। इसके अलावा, यहाँ कोई भी IPv6 लोकलहोस्ट के लिए जाँच नहीं करता है (:: 1)

/localhost|127\.0\.0\.1|::1|\.local|^$/i.test(location.hostname)

यह सामान्य लोकलहोस्ट, .लोकल डोमेन और फ़ाइल के लिए जाँच करता है: (खाली होस्टनाम)।

*) क्रोम में, परफॉर्मेंस [].includes(...)चेकिंग (119 एमएस), फिर [].indexOf(...) > -1(289 एमएस) और अंत में रीजेक्सपी (566 एमएस) के साथ सरल लूप (के लिए, जबकि) का प्रदर्शन सबसे अच्छा (42 एमएस) है। लेकिन वे माप किसी न किसी तरह से सापेक्ष होते हैं, क्योंकि अलग-अलग ब्राउज़रों को अलग-अलग तरीके से अनुकूलित किया जाता है। एफएफ 52 ईएसआर में includesऔर indexOfइसी तरह के परिणाम हैं, रेगेक्सप 2 × धीमा और लूप 6 × धीमा है।


0

उपरोक्त टिप्पणियों के आधार पर नियमित अभिव्यक्ति के बाद वें ने मुझे यह सत्यापित करने में मदद की है कि क्या url 'लोकलहोस्ट' है, किसी भी आईपी एड्रेस IPv4 या IPv6।

window.location.hostname.match(/localhost|[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}|::1|\.local|^$/gi)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.