完全限定域名验证(Fully qualified domain name validation)

2019-06-17 15:08发布

是否有一个快速和肮脏的方式,如果正确的FQDN已输入验证? 请记住,没有DNS服务器或Internet连接,所以确认必须通过正则表达式/ AWK / SED完成。

有任何想法吗?

Answer 1:

这是很难如今,随着国际化域名和几千个(!)新TLD。

最简单的是,你还可以拆分的部件“”

你需要可注册顶级域名的列表。 有该站点:

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

你只需要检查ICANN认可的。 请注意,登记的TLD可以有多个组件,如“co.uk”。

再有就是IDN和Punycode的形式显示。 域是Unicode的了。 例如,

“XN - nnx388a” 等同于 “台湾”。 这两个都是有效的顶级域名,顺便说一句。

对于Punycode转码的代码,请参阅“ http://golang.org/src/pkg/net/http/cookiejar/punycode.go ”。

检查每个域成分的语法有新规定了。 参见RFC5890在http://tools.ietf.org/html/rfc5890

组件可以是A-标签(ASCII仅)或Unicode。 ASCII标签无论是沿袭旧的语法,或开始“后的xn”,在这种情况下,他们是一个Unicode字符串的使用Punycode版本。

对Unicode的规则是非常复杂的,并且在RFC5890中给出。 该规则旨在防止这样的事情由左到右,右到左的两组混合字符。

对不起有没有简单的答案。



Answer 2:

(?=^.{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 - 无效(undescore)
  • typical-hostname33.whatever.co.uk - 有效

编辑:约翰·里克斯所提供的正则表达式的替代黑客,使可选一个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}$)

你同样可以让约翰·里克斯的版本类似的替代品。

编辑3:如果你要允许小圆点 - 这在技术上是允许的:

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

我不熟悉尾随点语法,直到@ChaimKut指出出来,我做了一些研究

  • http://dns-sd.org./TrailingDotsInDomainNames.html
  • https://jdebp.eu./FGA/web-fully-qualified-domain-name.html

使用小圆点但是似乎导致我合作过的各种工具有些不可预知的结果,所以我会建议一些谨慎。



Answer 3:

这正则表达式是你想要什么:

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

它符合你的榜样域(groupa-zone1appserver.example.com或cod.eu等...)

我会试着解释:

(?=^.{1,254}$)匹配的域名(可以与任何字符开头)是很早以前1和254字符之间,也可能是还5254,如果我们假设co.uk是最小长度。

(^开始比赛

(?:定义一个匹配组

(?!\d+\.)的域名不应该由数字组成,所以1234.co.uk或abc.123.uk是不能接受的,而1a.ko.uk肯定。

[a-zA-Z0-9_\-]的域名应该由词语仅用-ZA-Z0-9_-组成

{1,63}的任何域级的长度是最大63字符,(也可能是2,63)

+

(?:[a-zA-Z]{2,})$)域名的最后部分不应被随后的任何其它的字,并且必须由至少2炭A-ZA-Z的一个字的



Answer 4:

审议#1:

请注意,由于在RFC-2181的DNS标签宽松的要求可以由符号(然而,长度的限制仍然存在)的几乎任意组合:

任何可作为任何资源记录的标签的任何二进制字符串。DNS协议的实现必须不放置任何限制,可以使用的标签。尤其是,DNS服务器必须不拒绝服务的区域,因为它包含的标签这是无法令人接受一些DNS客户端程序。“( https://tools.ietf.org/html/rfc2181#section-11 )

审议#2:

“有,基本上需要顶级域名不是全数字的附加规则”( https://tools.ietf.org/html/rfc3696#section-2 )

考虑到这两个因素,正确的正则表达式如下:

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

观看演示@ http://regexr.com/3g5j0



Answer 5:

下面的表达式

(^((?=^.{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


文章来源: Fully qualified domain name validation
标签: regex bash fqdn