Проверка домена без субдомена, требует TLD, без IP-адресов и так далее? - PullRequest
0 голосов
/ 11 сентября 2018

Мне нужно проверить входные данные моего пользователя через службу C # .NET. Пользователи могут ввести домен, о котором я должен позаботиться. Однако к этому есть несколько правил:

  • Нет поддоменов, поэтому разрешены только домены
  • Это не может быть IP-адрес
  • Это не может быть просто имя хоста (поэтому localhost не разрешено)
  • Не может содержать недопустимые символы (например, [\½( и т. Д.)
  • TLD не обязательно должен быть действительным, поэтому test.mmmmmmm должен пройти)

Пока я пробовал кучу вещей, но ни одна из них, похоже, не удовлетворяла моим потребностям. Мне просто нужно проверить, если домен действителен. Вот несколько вещей, которые я пробовал:

if(!Uri.IsWellFormedUriString(DomainName, UriKind.Absolute))
//problem: has to be an uri, but http://1 would pass

if (Uri.CheckHostName(DomainName) == UriHostNameType.Unknown)
//problem: abc would pass (probably also IPs)

if (Uri.CheckHostName(DomainName) != UriHostNameType.Dns)
//problem: abc would pass (probably also IPs)

Regex: (\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9])
//problem: IPs and subdomains are allowed but neither abc or invalid characters are allowed

Похоже, что-то легко сделать. Я не уверен, что объединение некоторых из них может сработать, но я сильно сомневаюсь в этом. Эта дискуссия поднималась много раз, но ни одна из них не удовлетворяла моим потребностям.

Любая подсказка, что делать?

1 Ответ

0 голосов
/ 12 сентября 2018

Ладно, у меня получилось довольно хорошее решение, которое, я думаю, прекрасно работает: https://dotnetfiddle.net/zjg3Ep

private bool IsDomainValid(string DomainName)
{
    //no hostnames
    if (DomainName.Split('.').Length <= 1) return false;

    //cannot start or end with a dot - simply invalid
    if (DomainName[0] == '.' || DomainName[DomainName.Length - 1] == '.') return false;

    //cannot start or end with a hyphen - simply invalid
    if (DomainName[0] == '-' || DomainName[DomainName.Length - 1] == '-') return false;

    //hostname cannot start or end with a hyphen - simply invalid
    if (DomainName.Split('.')[0] == "-" || DomainName.Split('.')[0][DomainName.Split('.')[0].Length - 1] == '-') return false;

    //cannot have two dots right after eachother
    if (DomainName.Matches($"[\\.]{2}")) return false;

    //cannot be an IP
    if (Uri.CheckHostName(DomainName) == UriHostNameType.IPv4) return false;

    //cannot contain illegal characters
    if (!DomainName.Matches($"^[a-zA-Z_0-9.-]+$")) return false;

    return true;
}

Проверяет многое из того, что я хотел, поэтому я в целом очень счастлив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...