35

正しいFQDNが入力されているかどうかを検証するための迅速で汚い方法はありますか?DNSサーバーやインターネット接続がないため、検証はregex / awk/sedを介して実行する必要があることに注意してください。

何か案は?

4

6 に答える 6

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

正規表現は常にこのようなものの近似値になり、ルールは時間とともに変化します。上記の正規表現は次のことを念頭に置いて作成されており、ホスト名に固有です-

ホスト名は、ドットで連結された一連のラベルで構成されます。各ラベルの長さは1〜63文字で、次のものが含まれる場合があります。

  • ASCII文字az(大文字と小文字を区別しない方法)、
  • 0〜9の数字、
  • およびハイフン('-')。

さらに:

  • ラベルはハイフンで開始または終了できません(RFC 952)
  • ラベルは数字で始めることができます(RFC 1123)
  • ドットを含むASCIIホスト名の最大長は253文字です(末尾のドットは含まれません)(http://blogs.msdn.com/b/oldnewthing/archive/2012/04/12/10292868.aspx
  • アンダースコアはホスト名では許可されていません(ただし、他のDNSタイプでは許可されています)

いくつかの仮定:

  • TLDは2文字以上で、azのみ
  • TLDより少なくとも1レベル上が必要です

結果:有効/無効

  • 911.gov-有効
  • 911-無効(TLDなし)
  • a-.com-無効
  • -a.com-無効
  • a.com-有効
  • a.66-無効
  • my_host.com-無効(アンスコア)
  • 典型的な-hostname33.whatever.co.uk-有効

編集:John Rixは、TLDの仕様をオプションにするために、正規表現の代替ハックを提供しました。

(?=^.{1,253}$)(^(((?!-)[a-zA-Z0-9-]{1,63}(?<!-))|((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63})$)
  • 911-有効
  • 911.gov-有効

編集2:誰かがjsで動作するバージョンを求めました。jsで機能しない理由は、jsが正規表現のルックビハインドをサポートしていないためです。(?<!-)具体的には、前の文字をハイフンにすることはできないことを指定するコード。

とにかく、ここでは後読みなしで書き直されています-少し醜いですがあまりありません

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

同様に、JohnRixのバージョンでも同様の置換を行うことができます。

編集3:末尾のドットを許可する場合-技術的に許可されています:

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

@ChaimKutがそれらを指摘し、私がいくつかの調査を行うまで、私は末尾のドット構文に精通していませんでした

ただし、末尾のドットを使用すると、使用したさまざまなツールで予測できない結果が生じる可能性があるため、注意が必要です。

于 2013-11-25T22:34:57.930 に答える
19

今日では、国際化ドメイン名と数千(!)の新しいTLDがあり、より困難になっています。

簡単なのは、「。」でコンポーネントを分割できることです。

登録可能なTLDのリストが必要です。そのためのサイトがあります:

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

ICANNが認識しているものだけを確認する必要があります。登録可能なTLDには、「co.uk」などの複数のコンポーネントを含めることができることに注意してください。

次に、IDNとpunycodeがあります。ドメインは現在Unicodeです。例えば、

「xn--nnx388a」は「臺灣」と同等です。ちなみに、これらは両方とも有効なTLDです。

punycode変換コードについては、「http://golang.org/src/pkg/net/http/cookiejar/punycode.go」を参照してください。

各ドメインコンポーネントの構文をチェックすることにも、新しいルールがあります。https://www.rfc-editor.org/rfc/rfc5890でRFC5890を参照して ください

コンポーネントは、Aラベル(ASCIIのみ)またはUnicodeのいずれかです。ASCIIラベルは、古い構文に従うか、「xn--」で始まります。この場合、ASCIIラベルはUnicode文字列のpunycodeバージョンです。

Unicodeの規則は非常に複雑で、RFC5890に記載されています。ルールは、左から右への文字と右から左へのセットの文字の混合などを防ぐように設計されています。

申し訳ありませんが、簡単な答えはありません。

于 2014-10-28T21:41:34.653 に答える
7

この正規表現はあなたが望むものです:

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

サンプルドメイン(groupa-zone1appserver.example.comまたはcod.euなど)と一致します

説明しようと思います:

(?=^.{1,254}$)1〜254文字の長さのドメイン名(任意の文字で始めることができます)に一致します。co.ukが最小の長さであると仮定すると、5,254になる可能性もあります。

(^試合開始

(?:一致するグループを定義する

(?!\d+\.)ドメイン名は数字で構成しないでください。そのため、1a.ko.ukは受け入れられますが、1234.co.ukまたはabc.123.ukは受け入れられません。

[a-zA-Z0-9_\-]ドメイン名は、a-zA-Z0-9_-のみの単語で構成する必要があります

{1,63}ドメインレベルの長さは最大63文字です(2,63文字になる可能性があります)

+

(?:[a-zA-Z]{2,})$)ドメイン名の最後の部分の後に他の単語を続けることはできず、2文字以上の単語で構成する必要がありますa-zA-Z

于 2012-08-04T20:30:19.563 に答える
4

この正規表現を使用して、実際に発生するドメインを検証します。それは私が知っているすべての実際のユースケースをカバーしています。新しいものは大歓迎です。私たちのガイドラインによると、それは非キャプチャグループと貪欲なマッチングを回避します。

^(?!.*?_.*?)(?!(?:[\w]+?\.)?\-[\w\.\-]*?)(?![\w]+?\-\.(?:[\w\.\-]+?))(?=[\w])(?=[\w\.\-]*?\.+[\w\.\-]*?)(?![\w\.\-]{254})(?!(?:\.?[\w\-\.]*?[\w\-]{64,}\.)+?)[\w\.\-]+?(?<![\w\-\.]*?\.[\d]+?)(?<=[\w\-]{2,})(?<![\w\-]{25})$

証明と説明:https ://regex101.com/r/FLA9Bv/40

ドメインを検証するときに選択するアプローチは2つあります。

書籍ごとのFQDNマッチング(理論上の定義、実際にはめったに発生しません):

実用的/保守的なFQDNマッチング(実用的な定義、実際に期待およびサポートされている):

  • 以下の例外/追加と一致する本による
  • 有効な文字:[a-zA-Z0-9.-]
  • ラベルはハイフンで開始または終了できません(RFC-952およびRFC-1123 / 2.1による)
  • TLDの最小の長さは2文字、最大の長さは現在存在するレコードに従って24文字です
  • 末尾のドットと一致しない

上記の正規表現には、本によるルールと実用的なルールの両方が含まれています。

于 2019-07-21T00:08:27.597 に答える
3

考慮事項#1:

RFC-2181の要件が緩和されているため、DNSラベルはほとんどすべてのシンボルの組み合わせで構成されている可能性があることに注意してください(ただし、長さの制限は引き続き存在します)。

任意のリソースレコードのラベルとして使用できるバイナリ文字列。DNSプロトコルの実装では、使用できるラベルに制限を設けてはなりません。特に、DNSサーバーには、ラベルが含まれているため、ゾーンの提供を拒否してはなりません。一部のDNSクライアントプログラムでは受け入れられない可能性があります。 "(https://www.rfc-editor.org/rfc/rfc2181#section-11

考慮事項#2:

「トップレベルドメイン名がすべて数字ではないことを本質的に要求する追加のルールがあります」https://www.rfc-editor.org/rfc/rfc3696#section-2

これらの2つの考慮事項を考慮すると、正しい正規表現は次のようになります。

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

デモ@http://regexr.com/3g5j0を参照してください

于 2017-06-14T01:56:40.467 に答える
0

次の式

(^((?=^.{4,253}$)(((http){0,1}|(http){0,1}|(ftp){0,1}|(ws){0,1})(s{0,1}):\/\/){0,1})((((?!-)[\pL0-9\-]{1,63})(?<!-)(\.)){1,})(((?!-)[a-z0-9\-]{1,63})(?<!-)((\/{0,1}[\pL\pN?=\-]*)+){1})$)

一致します

https://www.tes1t.com/lets/to?878932572
https://www.test.co.uk/lets/to?878932572
http://www.test.com/lets/to?878932572
http://www.test.co.uk/lets/to?878932572
ftp://www.test.com/lets/to?878932572
subdomain.test.com/lets/to?878932572
subdomain.test.com/lets/to?878932572
subdomain.subdomain.test.net/lets/to?878932572

sub-domain.test.net/lets/to?878932572
sub-domain.test.net/lets-go/to?878932572
www.test.net/lets/to?878932572
www.test-test.com/
www.test-test.com

subdomain.subdomainsubdomainsuèdomainsubdomainsubdomainsubdomainsubdomain.net/let2s/to?=878932572

www.test-test.co.uk
http://www.test-test-.com/test
www.test-teèst.co.uk/lets
www.test-test.co.uk/lets/
www.test-test.co.uk/lets/to?
test-test.co.uk/lets/to?
test-test.co.uk/lets/
test-test.co.uk/lets
test-test.co.uk
http://test.com/lets/to?878932572
https://test.com/lets/to?878932572
ftp://test.com/lets/to?878932572
ftps://test.com/lets/to?878932572
ws://test.com/lets/to?878932572aa
wss://test.com/lets/to?=878932572bar
test.com

subdomain.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.khbdomainsubdomainsubdomain.test.net/lets/to?87893257

しかし一致しません:

www.-test-fail-.com
www.-test-fail.com
-test-fail.com
test-fail-.com

subdomain.subdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainubdomainsubdomainsubdomain.test.net/lets/to?878932572

subdomain.subdomainsubdomainsubdcnvcnvcnofhfhghgfhvnhj-mainsubdomainsubdohhghghghfhgffgjh-gfhfdhfdghmainsubdocgvhngvnbnbmghghghaihgfjgfnfhfdghgsufghgghghhdfjgffsgfbdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomain.test.net/lets/to?878932572

subdomain.test.test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test.khbdomainsubdomainsubdomain.test.net/lets/to?87893257
于 2018-03-16T16:52:04.470 に答える