Quel est le meilleur moyen de valider une Adresse IP?
J'ai une méthode pour valider un paramètre d'Adresse IP. Étant nouveau développement dans son ensemble, je voudrais savoir si il existe une meilleure façon de le faire.
///<summary>
///Check IP Address, will accept 0.0.0.0 as a valid IP
///</summary>
///<param name="strIP"></param>
///<returns></returns>
public Boolean CheckIPValid(String strIP)
{
// Split string by ".", check that array length is 3
char chrFullStop = '.';
string[] arrOctets = strIP.Split(chrFullStop);
if (arrOctets.Length != 4)
{
return false;
}
// Check each substring checking that the int value is less than 255 and that is char[] length is !> 2
Int16 MAXVALUE = 255;
Int32 temp; //Parse returns Int32
foreach (String strOctet in arrOctets)
{
if (strOctet.Length > 3)
{
return false;
}
temp = int.Parse(strOctet);
if (temp > MAXVALUE)
{
return false;
}
}
return true;
}
Sa simple (j'ai pu le faire), mais il semble faire l'affaire.
- Je ne veux pas que ce soit trop de discussion, ce qui n'est pas ce qui est DONC pour. Comment jamais, je ne veux post pour voir si j'ai une réponse intéressante.
- Je n'avais aucune idée que IPAddress.Parse() en fait validé en tant que tel. J'ai juste pensé que ça a changé un 12 chiffre entier dans le format d'adresse IP. Vraiment utile que si elle ne le fait (même si ça me fait un peu stupide).
- outre le "out of the box" réponses je voudrais changer
arrOctets.Length != 4
àarrOctets.Length < 3
parce que si quelqu'un passait dans123.123.123.123.123
? ce n'est pas 4 et toujours pas valide v4 adresse. - Que l'adresse est valide, c'est à dire entre 1.0.0.0 et 254.254.254.254. L'adresse réseau est inclus bien sûr
- parfait. Je ne l'avais pas vu, mais serait gâcher les choses devraient quelqu'un entrer 🙂
- Yup. N'aimez-vous pas quand vous le faites travailler dur pour trouver le cadre déjà fait pour vous 😛
- enfait, serait arrOctets == 3, le meilleur de tous. Il ne doit jamais être différent devrait-il?
- Heureusement, il n'est pas arrivé beaucoup de choses encore, mais je suis sûr que dans le temps il sera. Je suis sûr qu'il ne cesse de changer 😛
- mmm si vous modifiez ce qui serait, je pense que vous avez de l'envelopper le reste de votre fonction à l'intérieur que si. plutôt que de simplement retourner faux à ce point. si la longueur est de 3 ce faire, l'autre sage de sortie. Ou si c'est plus que trois à la sortie, l'autre sage de continuer.
- Non,
Length != 4
est le bon critère, il rejette à la fois trop et trop peu (moins de quatre champs sans doute sont alternes encodages, mais doit être rejetée, sauf si vous voulez vraiment de la souplesse). La longueur de la fente de sortie n'est PAS le nombre de séparateurs trouvé, de sorte que l'inégalité de comparaison contre 3 est faux.
Vous devez vous connecter pour publier un commentaire.
La limitation avec
IPAddress.TryParse
méthode est qu'elle vérifie si une chaîne de caractères peut être converti en adresse IP, donc si il est fourni avec une chaîne de valeur comme"5"
, il le considérer comme"0.0.0.5"
.Une autre approche pour valider une adresse IPv4 pourraient être les suivants :
Il pourrait être testé comme:
La sortie sera:
Vous pouvez également utiliser
IPAddress.TryParse
mais il a des limites et pourrait fausser l'analyse.Système.Net.IPAddress.Méthode TryParse
Mais ce serait avec la normale de la chaîne de caractères contenant au moins trois points. Quelque chose comme:
Avec
IPAddress.TryParse
vous pouvez vérifier l'existence de trois points, puis appelTryParse
comme:127.0.0
comme IP valide. Pour être précis, je l'ai coupée la chaîne d'abord par.
et a confirmé qu'il a 4 splits.127.000000000.0.1 => True
127.-0.0.1 => True
byte.TryParse
permet beaucoup de bizarre, peu de variations que d'autres programmes ne peuvent pas. Je vous suggère d'ajouter quelque chose comme&& tempForParsing.ToString() == r
à laAll()
.IPAddress.TryParse
peut-être plus facile à utiliser si vous ajoutez&& address.ToString() == ipString
à elle. Ensuite, vous ne devriez pas avoir à compter les points. Et il peut travailler à la fois IPv4 et IPv6.et vous avez terminé
Edit 1
Ajouté quelques vérifications supplémentaires, afin d'éviter que les exceptions d'être jeté (ce qui est coûteux). PS il ne gère pas l'unicode.
Edit 2
@StephenMurby
IPAddress.TryParse
sera de retour vrai si il correctement analysé la chaîne. Si vous cochez la la documentation pour la méthode si elle va lever une exception dans les deux cas.Son à vous de décider (décision de conception) si vous voulez lancer des exceptions ou de fausse déclaration. Quand il s'agit de l'analyse en général, je préfère retourner false plutôt que des exceptions (l'hypothèse étant que cette entrée n'est pas garanti pour être correct).
La rupture de l'instruction de retour vers le bas, je suis en train de dire,
Rappelez-vous, C# expressions booléennes sont paresseux évalué, de sorte que le CLR ne cherchera pas à même d'analyser la chaîne si elle est
null
ou vide.Sur le manque si vous pouvez faire quelque chose comme,
Mais tous vous avez vraiment à faire est de dire si quelque chose est vrai, retourner la valeur true. Plus facile de simplement retourner l'expression tout de suite.
&& result.ToString() == strIP
. Il devrait résoudre beaucoup de problèmes avec lesIPAddress.TryParse
.Pourquoi ne pas vous utiliser IPAddress.Analyser ou IPAddress.TryParse
Le cadre fournit la
IPAddress
classe qui à son tour vous offre laParse
etTryParse
méthodes.Sans utiliser l'adresse ip de classe et de validation à partir de l'octet, ce qui est beaucoup mieux que de l'Int<256 approche.
byte.TryParse(strOctet, out obyte) == false
et j'ai aussi ajouté un premier passage.Split(':')
en haut à analyser importe quel numéro de port. Merci pour la conduire!IPAddress.TryParse
est très lent...Le meilleur Regex solution :
C#
Surprise offert une Regex solution. Tous vous avez besoin est d'inclure Système.Texte.RegularExpressions. Pour des raisons de lisibilité à la fois dans le code et pour cet exemple, j'ai TOUJOURS un morceau de ma regex modèle dans un tableau de chaînes et ensuite la rejoindre.
Vous pouvez traiter comme ça, c'est soit une adresse ipv4 ou ipv6:
essayer avec ceci:
Si vous voulez juste vérifier si il est valide de ne seulement:
bool isValid = IPAddress.TryParse(stringIP, out IPAddress _);
Il sera valide, même si cela est au-dessus de 255 et si vous avez de points, donc pas besoin de les vérifier.