2012-08-04 10 views
17

क्या सही FQDN दर्ज किया गया है, तो सत्यापित करने के लिए एक त्वरित और गंदा तरीका है? ध्यान रखें कि कोई DNS सर्वर या इंटरनेट कनेक्शन नहीं है, इसलिए regex/awk/sed के माध्यम से सत्यापन किया जाना है।पूरी तरह से योग्य डोमेन नाम सत्यापन

कोई विचार?

+0

वास्तव में नहीं .. कम से कम, यह विश्वसनीय नहीं होगा। आप यह जांच सकते हैं कि टीएलडी भाग आपके स्वयं के टीएलडी की सूची रखकर वैध है (जिसे अद्यतित रखा जाना चाहिए) लेकिन इसके अलावा मुझे लगता है कि आप भाग्य से बाहर हैं :) – favoretti

+1

इसे आज़माएं, यह एक रेगेक्स है : http://stackoverflow.com/questions/4912520/validate-fqdn-in-c-sharp – tombolinux

+0

अच्छी तरह से मेरा विचार यह सत्यापित करना था कि उपयोगकर्ता ने वैध डीएनएस नाम दर्ज किया है जैसे groupa-zone1appserver.example.com एक मानक। – Riaan

उत्तर

8

अब यह कठिन है, अंतर्राष्ट्रीय डोमेन नाम और कई हजार (!) नई TLD के साथ क्या।

आसान हिस्सा यह है कि आप अभी भी घटकों को "।" पर विभाजित कर सकते हैं।

आपको पंजीकरण योग्य टीएलडी की एक सूची की आवश्यकता है। उस के लिए एक साइट है:

https://publicsuffix.org/list/effective_tld_names.dat

आप केवल आईसीएएनएन मान्यता प्राप्त लोगों की जांच की जरूरत है। ध्यान दें कि एक पंजीकृत टीएलडी में एक से अधिक घटक हो सकते हैं, जैसे कि "co.uk"।

फिर आईडीएन और पन्योडोड है। डोमेन अब यूनिकोड हैं। उदाहरण के लिए,

"xn - nnx388a" "臺灣" के बराबर है। वे दोनों संयोग से वैध टीएलडी हैं।

पनीकोड ​​रूपांतरण कोड के लिए, "http://golang.org/src/pkg/net/http/cookiejar/punycode.go" देखें।

प्रत्येक डोमेन घटक के सिंटैक्स की जांच करने के नए नियम भी हैं। http://tools.ietf.org/html/rfc5890

पर RFC5890 देखें घटक या तो ए-लेबल्स (केवल ASCII) या यूनिकोड हो सकते हैं। ASCII लेबल या तो पुराने वाक्यविन्यास का पालन करते हैं, या "xn--" शुरू करते हैं, इस मामले में वे यूनिकोड स्ट्रिंग के एक पन्योड संस्करण हैं।

यूनिकोड के नियम बहुत जटिल हैं, और आरएफसी 58 9 0 में दिए गए हैं। नियमों को बाएं से दाएं और दाएं से बाएं सेट से वर्णों को मिश्रित करने जैसी चीजों को रोकने के लिए डिज़ाइन किया गया है।

क्षमा करें कोई आसान जवाब नहीं है।

6

इस regex तुम क्या चाहते है:

(?=^.{1,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{2,})$) 

यह अपने उदाहरण डोमेन से मेल (groupa-zone1appserver.example.com या cod.eu आदि ...)

मैं समझाने की कोशिश करता हूँ :

(?=^.{1,254}$) डोमेन नाम (जो किसी भी चार से शुरू हो सकता है) से मेल खाता है जो कि 1 और 254 चार के बीच लंबा होता है, तो यह भी 5,254 हो सकता है यदि हम मानते हैं कि co.uk न्यूनतम लंबाई है।

(^ शुरू कर मैच

(?: उससे मिलते-जुलते समूह

(?!\d+\.) डोमेन नाम, संख्या द्वारा रचित नहीं किया जाना चाहिए ताकि 1234.co.uk या abc.123.uk जबकि 1 क स्वीकार नहीं कर रहे परिभाषित करते हैं। ko.uk हाँ।

[a-zA-Z0-9_\-] डोमेन नाम केवल a-zA-Z0-9_-

{1,63} किसी भी डोमेन स्तर की लंबाई के साथ शब्दों द्वारा रचित किया जाना चाहिए अधिकतम 63 वर्ण है, (यह हो सकता है 2,63)

+ और

(?:[a-zA-Z]{2,})$) डोमेन नाम के अंतिम भाग किसी अन्य शब्द के बाद नहीं किया जाना चाहिए और एक-zA-Z

+1

क्या आप नोटेशन की व्याख्या करना चाहते हैं? 'Ac.uk' के साथ क्या करता है? यह वैध एफक्यूडीएन नहीं है; यह देश-कोड टीएलडी के तहत एक मध्य-स्तर का डोमेन है। उदाहरण के लिए –

+0

aa.com एक fqdn है यह regex केवल तारों से मेल खाता है जो डॉट्स द्वारा विभाजित हैं और अंतिम स्ट्रिंग न्यूनतम 2 char है। – tombolinux

+0

एक रेगेक्स के साथ आप केवल एक वाक्यविन्यास से मेल खा सकते हैं, वास्तविक डीएनएस fqdn नहीं। – tombolinux

31
चार का एक शब्द भी कम से कम से बना होना चाहिए

रेगेक्स हमेशा इस तरह की चीजों के लिए अनुमान लगाया जा रहा है, और नियम समय के साथ बदलते हैं। ऊपर regex मन में निम्नलिखित के साथ लिखा गया था और होस्ट नामों के लिए विशिष्ट है -

होस्ट का नाम डॉट्स के साथ concatenated लेबल की एक श्रृंखला से बना रहे हैं। प्रत्येक लेबल 1 से 63 वर्ण लंबा है, और हो सकता है:

  • az (एक मामले में असंवेदनशील तरीके से) ASCII अक्षरों,
  • 0-9 अंक,
  • और हाइफन ('- ')।

इसके अतिरिक्त:

  • लेबल शुरू करने या हाइफ़न (आरएफसी 952)
  • लेबल के साथ खत्म होता है के साथ नंबर (RFC 1123) डॉट्स सहित ASCII होस्टनाम की
  • अधिकतम लंबाई शुरू कर सकते हैं नहीं कर सकते है 253 अक्षर (पिछला बिंदु गिनती नहीं) (http://blogs.msdn.com/b/oldnewthing/archive/2012/04/12/10292868.aspx)
  • होस्टनामों में अंडरस्कोर की अनुमति नहीं है (लेकिन अन्य DNS प्रकारों में अनुमति है)

कुछ मान्यताओं:

  • टीएलडी कम से कम 2 वर्ण है और केवल az
  • हम चाहते हैं टीएलडी

परिणामों के ऊपर कम से कम 1 का स्तर: मान्य/अमान्य

  • 911.gov - मान्य
  • 911 - अमान्य (कोई टीएलडी नहीं)
  • a-.com - अमान्य
  • -a.com - अमान्य
  • a.com - वैध
  • a.66 - अमान्य
  • my_host.com - अमान्य (undescore)
  • ठेठ -hostname33.whatever.co.uk - वैध

संपादित करें:

: जॉन Rix एक टीएलडी वैकल्पिक के विनिर्देश बनाने के लिए regex का एक वैकल्पिक हैक प्रदान की
(?=^.{1,253}$)(^(((?!-)[a-zA-Z0-9-]{1,63}(?<!-))|((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63})$) 
  • 911 - वैध
  • 911.gov - वैध

संपादित करें 2: किसी एक संस्करण है कि जे एस में काम करता है के लिए कहा। जेएस में काम नहीं करने का कारण यह है क्योंकि जेएस रेगेक्स लुक का समर्थन नहीं करता है। विशेष रूप से, कोड (?<!-) - जो निर्दिष्ट करता है कि पिछले वर्ण एक हाइफ़न नहीं हो सकता है। एक छोटे से भद्दा लेकिन बहुत ज्यादा नहीं

(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$) 

आप वैसे ही जॉन Rix के संस्करण पर एक समान प्रतिस्थापन कर सकता है -

वैसे भी, यहाँ यह lookbehind बिना फिर से लिखा गया है।

संपादित करें 3: आप डॉट्स अनुगामी अनुमति देना चाहते हैं - जो तकनीकी रूप से अनुमति दी है:

(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}\.?$) 

मैं जब तक @ChaimKut उन्हें बताया डॉट वाक्य रचना अनुगामी से परिचित नहीं था और मैं कुछ शोध किया

पीछे के बिंदुओं का उपयोग करना, हालांकि मैंने खेले गए विभिन्न उपकरणों में कुछ हद तक अप्रत्याशित परिणाम पैदा किए हैं, इसलिए मुझे कुछ सावधानी बरतनी होगी।

+1

से मेल नहीं खाता है यहां एक (कुछ हद तक हैकी) वैकल्पिक संस्करण है जो संबद्ध डोमेन के बिना होस्टनाम को मान्य करेगा। कोई सुधार? '(? =^{} $ 1,254।) (^ (((-) [एक-zA-Z0-9 -] {1,63} (<-)) |?!?!?! ((-) [ ए-जेए-जेड 0-9 -] {1,63} (?

+0

@ जॉन रिक: आपका रेगेक्स ऐसा दिखता है काम करता है लेकिन कई लोगों को प्रतिलिपि/पेस्ट करने से यह असफल हो जाएगा क्योंकि स्टैक एक्सचेंज अदृश्य वर्णों को प्रारूपण उद्देश्यों के लिए टिप्पणियों के एचटीएमएल स्रोत में डालता है- HTML स्रोत को देखें और http://meta.stackexchange.com/questions/170970/occasionally- द यूनिकोड-कैरेक्टर-अनुक्रम-u200c-u200b-zwnj-zwsp-is-insert – bkr

+0

धन्यवाद @bkr, इसके बारे में पता नहीं था। ऐसा कोई समाधान नहीं है, लेकिन कम से कम आपने इस जाल को यहां अनियमित के लिए उजागर किया है! –

1

विचाराधीन # 1:

कृपया ध्यान दें कि RFC-2181 डीएनएस लेबल में आराम आवश्यकताओं के कारण प्रतीकों (हालांकि, लंबाई प्रतिबंध अभी भी देखते हैं) की काफी किसी भी संयोजन से मिलकर कर सकते हैं:

" किसी भी बाइनरी स्ट्रिंग को किसी भी संसाधन रिकॉर्ड के लेबल के रूप में इस्तेमाल किया जा सकता है। DNS प्रोटोकॉल के कार्यान्वयन को लेबल पर किसी भी प्रतिबंध को नहीं रखना चाहिए। विशेष रूप से, DNS सर्वर को ज़ोन की सेवा करने से इंकार नहीं करना चाहिए क्योंकि इसमें लेबल हैं हो सकता है कि कुछ DNS क्लाइंट प्रोग्राम्स को स्वीकार्य न हो। "(https://tools.ietf.org/html/rfc2181#section-11)

विचाराधीन # 2:

" एक अतिरिक्त नियम है कि अनिवार्य रूप से की आवश्यकता है कि शीर्ष स्तर के डोमेन नामों सभी संख्यात्मक " (https://tools.ietf.org/html/rfc3696#section-2)

ध्यान में रखते हुए नहीं हो इन दो कारणों से, सही regex इस तरह दिखता है:

/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i

डेमो @http://regexr.com/3g5j0

संबंधित मुद्दे