【问题标题】:Validating a domain without subdomain, requires a TLD, no IPs, and so on?验证没有子域的域,需要 TLD,没有 IP,等等?
【发布时间】:2018-09-11 13:22:17
【问题描述】:

我需要通过我的 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

似乎很容易做到。我不确定结合其中一些是否可行,但我非常怀疑。这个讨论已经被提过很多次了,但没有一个适合我的需要。

知道该怎么做吗?

【问题讨论】:

  • 由于构成域的规则已经改变了好几次(例如,除了org/com/net/gov 之外,所有名称都有 3 个名称;不用等待,现在我们有了新 TLD 预计会发布 2 个域名),也许您应该从如何使用此信息来解决问题。例如。如果您需要他们路由电子邮件,请改为对其进行 MX 查找?举个例子。
  • @Damien_The_Unbeliever 我可以在域上进行查找,但如果它尚未注册,那将是一个问题。

标签: c# .net validation


【解决方案1】:

好的,我有一个很好的解决方案,我认为效果很好: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;
}

检查了很多我想要的东西,所以我通常很开心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2019-09-04
    • 2023-04-07
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多