Je me demande quel est le nombre maximum de caractères pour un nom d'hôte dans un système Unix. De plus, y a-t-il une variable définie qui peut être utilisée dans la programmation Unix pour appeler ce numéro? (c'est-à-dire le nombre de caractères autorisés pour un nom d'hôte).
Je programme en C.
Vous pouvez généralement taper:
getconf Host_NAME_MAX
De plus, vous pouvez généralement inclure limits.h à votre application et lire la valeur de define.
Bien que la norme POSIX indique qu'il est garanti de ne pas dépasser 255 octets, cela ne signifie pas nécessairement que chaque implémentation y adhérera.
man gethostname sur votre plateforme pour obtenir des informations plus détaillées.
tl; dr :
Le code doit traiter les noms d'hôte jusqu'à 255 octets de long; les administrateurs doivent conserver la longueur du nom d'hôte (à l'exclusion du domaine) dans les 19 octets et la longueur du nom de domaine (à l'exclusion des noms d'hôte) dans les 23 octets.
Host.example.com
), dans quel cas:.
et tout ce qui vient du nom d'hôte) ne peut contenir que 63 octets.
caractères) de toutes les limites ci-dessus et soustrayez 1 à 2 octets supplémentaires (sans compter la surcharge de codage UTF-8 de 1 à 2 octets supplémentaires par caractère) pour chaque caractère non ASCII.Version longue:
Comme le dit @Michael, les noms d'hôte POSIX sont généralement limités à 255 octets, et comme le souligne @zrvan, DNS limite la longueur de chaque étiquette dans RFC 1035 - cependant, cette limite est en réalité 63 (à la fois dans RFC 1035 section 2.3.1 et comme précisé dans RFC 2181 section 11 ).
Il existe d'autres limites qui entrent en jeu lorsque vous utilisez des noms d'hôtes qui seront utilisés dans DNS, comme noms d'hôtes dans les certificats SSL ou les adresses e-mail.
Premièrement, la limite de longueur du nom de domaine complet (FQDN) est de 255 octets lorsqu'elle est représentée dans le protocole DNS comme
"une série d'étiquettes, ... terminées par une étiquette de longueur zéro. ... Une étiquette se compose d'un octet de longueur suivi de ce nombre d'octets représentant le nom lui-même" - Blog MSDN "The Old New Thing" " (en citant la RFC 1035, avec une illustration utile)
Avec ces préfixes de longueur (y compris celui de l'étiquette finale de longueur zéro), la limite réelle pour un nom de domaine complet est de 253 octets.
Si votre nom d'hôte sera également utilisé comme nom DNS pour un serveur pour lequel vous avez besoin d'un certificat TLS/SSL, il y a une limite beaucoup plus courte qui vous affectera. Appendice A.1 de la RFC 5280 et ses RFC prédécesseurs 3280 et 2459 spécifient les limites supérieures pour différents champs d'un certificat X.509; le ub-common-name-length
la limite pour le champ Nom commun, qui pour les certificats de serveur est le nom de domaine complet du serveur, est de 64 octets.
Si vous utilisez OpenSSL pour générer un certificat SSL avec un champ d'adresse de messagerie de plus de 40 octets, vous verrez cette erreur:
la chaîne est trop longue, elle doit être inférieure à 40 octets
Si un nom d'hôte sera utilisé dans les adresses électroniques pour les certificats générés par OpenSSL, le @
et le nom d'utilisateur devront également tenir dans les 40 octets (le "moins de" dans l'erreur devrait vraiment être "pas plus de"), ce qui, pour une longueur maximale de nom d'utilisateur de 8 octets, implique une longueur maximale du nom de domaine complet du nom d'hôte de 31 octets. Si la longueur maximale du nom d'utilisateur est supérieure à 8 octets, la longueur maximale du nom d'hôte est diminuée en conséquence - la limite Linux moderne de 32 donnerait une longueur FQDN maximale de 7 qui n'est pas pratique, même pour les services de raccourcissement d'URL comme bit.ly.
Le choix OpenSSL d'un 40 comme limite de longueur pour une autre adresse e-mail X.509 peut être choisi pour la compatibilité avec la syntaxe alternative la plus courte possible, E.163-4 (pour les numéros de téléphone), et c'est il est probable que les implémentations TLS/SSL (y compris peut-être même OpenSSL) prennent en charge utilisez des certificats avec des adresses e-mail plus longues. Il existe une limite supérieure distincte (ub-emailaddress-length
) de 128 octets dans RFC 3280, augmenté à 255 octets dans RFC 5280; il s'agit en fait d'une autre incorporation héritée des adresses e-mail dans les certificats X.509, mais il ne serait pas surprenant que de nombreuses implémentations utilisent également cette limite supérieure pour les IA5Strings e-mail rfc822Address.
Alors qu'OpenSSL pourrait augmenter cette limite à l'avenir, il n'y a pas de problème pour cela dans OpenSSL Request Tracker , et il semble peu probable qu'il soit modifié.
Même si vous n'utilisez pas TLS/SSL, le longueur maximale de l'adresse e-mail de 254 implique une longueur maximale de nom de domaine complet du nom d'hôte de 245 octets pour une limite de nom d'utilisateur traditionnelle de 8 octets; ou 221 octets pour une limite de longueur maximale de nom d'utilisateur moderne de 32.
En prenant le minimum de tous ces maximums et un longueur médiane du domaine .com 2012 de 11 (par coïncidence la longueur exacte de example.com), et vous obtenez une longueur maximale de nom d'hôte de première étiquette de 19 octets pour une adresse e-mail de 40 octets comme [email protected]
.
Si toutes vos adresses de messagerie sont mappées à un nom de domaine de niveau supérieur avec des enregistrements MX et une réécriture d'adresses MTA, en supposant une limite de longueur de nom d'utilisateur/alias plus raisonnable de 16, vous obtenez une longueur maximale de nom de domaine de 23 octets pour une adresse e-mail de 40 octets comme [email protected]
.
Enfin, les noms d'hôtes non ASCII nécessitent un codage IDN (nom de domaine internationalisé) pour une utilisation avec DNS; cela implique un encodage avec 4 caractères xn--
préfixe pour chaque étiquette de domaine avec des caractères non ASCII, et une expansion de 1 à 2 octets pour chaque caractère non ASCII (en plus de la plus grande taille résultant du codage UTF-8). Si votre nom d'hôte contient des caractères non ASCII, vous devez réduire toutes les limites ci-dessus en conséquence.
Selon RFC 1035 la longueur d'un nom de domaine complet est limitée à 255 caractères, et chaque étiquette (nœud délimité par un point dans le nom d'hôte) est limitée à 63 caractères, donc en fait la limite que vous recherchez est 63.
Vous pouvez obtenir cette valeur en exécutant getconf Host_NAME_MAX
dans le terminal.
Les noms d'hôtes sont généralement limités à 255 octets . Host_NAME_MAX
(ou _POSIX_Host_NAME_MAX
) défini dans <limits.h>
contiendra la valeur spécifique.
Voici un exemple de code qui rassemble tout cela:
#include <limits.h>
#include <unistd.h>
#include <stdio.h>
char Host[HOST_NAME_MAX + 1];
Host[HOST_NAME_MAX] = 0;
if (gethostname(Host, sizeof(Host) - 1) == 0)
{
printf("hostname is %s\n", Host);
}
Git 2.13 (Q2 2017) illustre cette limite de longueur de nom en C et rappelle que POSIX ne spécifie pas si le tampon sera terminé par null.
Il introduit une nouvelle fonction, xgethostname()
, qui assure qu'il y a toujours un \0
à la fin du tampon.
Voir commit 5781a9a (18 avril 2017) par David Turner (csusbdt
) .
(Fusionné par David Turner - csusbdt
- in commit 5781a9a , 19 avril 2017)
utilisation
Host_NAME_MAX
pour dimensionner les tampons pour gethostname (2)
POSIX
limite la longueur des noms d'hôtes àHost_NAME_MAX
.
Exportez la définition de secours dedaemon.c
et utilisez cette constante pour rendre tous les tampons utilisés avec gethostname (2) assez grands pour tout résultat possible et unNUL
de terminaison.