regex bash fqdn

regex - Validación de nombre de dominio completamente calificado



bash fqdn (5)

¿Hay una manera rápida y sucia de validar si se ha ingresado el FQDN correcto? Tenga en cuenta que no hay un servidor DNS o conexión a Internet, por lo que la validación debe realizarse a través de regex / awk / sed.

¿Algunas ideas?


CONSIDERACIÓN # 1:

Tenga en cuenta que debido a los requisitos relajados en RFC-2181, las etiquetas DNS pueden consistir en casi cualquier combinación de símbolos (sin embargo, las restricciones de longitud siguen ahí):

" Cualquier cadena binaria puede usarse como etiqueta de cualquier registro de recursos. Las implementaciones de los protocolos DNS no deben imponer restricciones a las etiquetas que se pueden usar. En particular, los servidores DNS no deben negarse a servir una zona porque contiene etiquetas eso podría no ser aceptable para algunos programas cliente DNS " . ( https://tools.ietf.org/html/rfc2181#section-11 )

CONSIDERACIÓN # 2:

"Hay una regla adicional que esencialmente requiere que los nombres de dominio de nivel superior no sean totalmente numéricos" ( https://tools.ietf.org/html/rfc3696#section-2 )

Teniendo en cuenta estas dos consideraciones, la expresión regular correcta se ve así:

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

Ver demo @ http://regexr.com/3g5j0


Este regex es lo que quieres:

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

Coincide con su dominio de ejemplo (groupa-zone1appserver.example.com o cod.eu etc ...)

Voy a tratar de explicar:

(?=^.{1,254}$) coincide con los nombres de dominio (que pueden comenzar con cualquier char) que son largos entre 1 y 254 char, también podría ser 5,254 si asumimos que co.uk es la longitud mínima.

(^ partida inicial

(?: definir un grupo coincidente

(?!/d+/.) el nombre de dominio no debe estar compuesto por números, por lo que 1234.co.uk o abc.123.uk no se aceptan mientras 1a.ko.uk sí.

[a-zA-Z0-9_/-] los nombres de dominio deben estar compuestos por palabras con solo a-zA-Z0-9_-

{1,63} la longitud de cualquier nivel de dominio es de máximo 63 caracteres, (podría ser 2,63)

+ y

(?:[a-zA-Z]{2,})$) la parte final del nombre de dominio no debe ir seguida de ninguna otra palabra y debe estar compuesta de una palabra como mínimo de 2 caracteres a-zA-Z


Hoy en día es más difícil, con nombres de dominio internacionalizados y varios miles de (!) Nuevos TLD.

La parte fácil es que aún puede dividir los componentes en ".".

Necesita una lista de TLDs registrables. Hay un sitio para eso:

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

Solo necesita verificar los reconocidos por la ICANN. Tenga en cuenta que un TLD registrable puede tener más de un componente, como "co.uk".

Luego hay IDN y Punycode. Los dominios son Unicode ahora. Por ejemplo,

"xn - nnx388a" es equivalente a "臺灣". Ambos son TLD válidos, por cierto.

Para el código de conversión de punycode, consulte " http://golang.org/src/pkg/net/http/cookiejar/punycode.go ".

La verificación de la sintaxis de cada componente del dominio también tiene nuevas reglas. Consulte RFC5890 en http://tools.ietf.org/html/rfc5890

Los componentes pueden ser etiquetas A (solo ASCII) o Unicode. Las etiquetas ASCII siguen la sintaxis anterior o comienzan con "xn--", en cuyo caso son una versión de código de una cadena Unicode.

Las reglas para Unicode son muy complejas y se dan en RFC5890. Las reglas están diseñadas para evitar cosas como la mezcla de personajes de conjuntos de izquierda a derecha y de derecha a izquierda.

Lo siento, no hay una respuesta fácil.


La siguiente expresion

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

coincidirá

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

pero no coinciden:

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


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

Las expresiones regulares siempre serán, en el mejor de los casos, una aproximación para cosas como esta, y las reglas cambian con el tiempo. La expresión regular anterior se escribió teniendo en cuenta lo siguiente y es específica de los nombres de host :

Los nombres de host están compuestos por una serie de etiquetas concatenadas con puntos. Cada etiqueta tiene una longitud de 1 a 63 caracteres y puede contener:

  • las letras ASCII az (de una manera insensible al caso),
  • los dígitos 0-9,
  • y el guión (''-'').

Adicionalmente:

  • las etiquetas no pueden comenzar ni terminar con guiones (RFC 952)
  • Las etiquetas pueden comenzar con números (RFC 1123)
  • La longitud máxima del nombre de host ascii, incluidos los puntos, es de 253 caracteres (sin contar el punto final) ( http://blogs.msdn.com/b/oldnewthing/archive/2012/04/12/10292868.aspx )
  • los guiones bajos no están permitidos en los nombres de host (pero sí en otros tipos de DNS)

algunas suposiciones

  • TLD es de al menos 2 caracteres y solo az
  • queremos al menos 1 nivel por encima de TLD

resultados: valido / invalido

  • 911.gov - válido
  • 911 - inválido (sin TLD)
  • a-.com - inválido
  • -a.com - inválido
  • a.com - válido
  • a.66 - inválido
  • my_host.com - inválido (undescore)
  • nombre de host típico33.whatever.co.uk - válido

EDITAR: John Rix proporcionó un truco alternativo de la expresión regular para hacer la especificación de un TLD opcional:

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

  • 911 - valido
  • 911.gov - válido

EDIT 2: alguien pidió una versión que funciona en js. La razón por la que no funciona en js es porque js no admite la expresión de expresiones regulares. específicamente, el código (?<!-) - que especifica que el carácter anterior no puede ser un guión.

De todos modos, aquí se reescribe sin mirar atrás, un poco más feo, pero no mucho.

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

También podría hacer un reemplazo similar en la versión de John Rix.

EDITAR 3: si desea permitir puntos de cola, lo que técnicamente está permitido:

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

No estaba familiarizado con la sintaxis del punto final hasta que @ChaimKut los señaló e hice una investigación

Sin embargo, el uso de puntos al final parece causar resultados impredecibles en las diversas herramientas con las que jugué, por lo que le aconsejaría precaución.