Подтвердить что ты не робот

Определите, разрешено ли хост DNS-имя или IP-адрес

Если вы извлекаете значение HOST из коллекции HttpContext HttpRequest Headers, существует ли способ определить, является ли возвращаемое значение именем разрешенного DNS или прямым IP-адресом?

Пример использования

 string host = HttpContext.Current.Request.Headers["HOST"]; 

 if (host.IsIPAddress()) ... /// Something like this ?
     or
    (host.IsDNSResolved()) // Or this?

Резюме

Очевидно, что можно было бы выполнить тест шаблона регулярного выражения на результат, чтобы искать шаблон IP, но есть ли свойство на HttpContext или, более вероятно, HttpRequest, или даже внешний статический метод от помощника класс, который мог бы сделать это определение вместо этого?

4b9b3361

Ответ 1

Как насчет Uri.CheckHostName()?

Это возвращает System.UriHostNameType.

Пример:

Uri.CheckHostName("127.0.0.1"); //=> IPv4
Uri.CheckHostName("www.google.com"); //=> Dns
Uri.CheckHostName("localhost"); //=> Dns
Uri.CheckHostName("2000:2000:2000:2000::"); //=> IPv6

Конечно, чтобы использовать способ, который вы предложили, самый простой способ - создать расширение, например:

    public static class UriExtension {
        public static bool IsIPAddress(this string input) {
            var hostNameType = Uri.CheckHostName(input);

            return hostNameType == UriHostNameType.IPv4 || hostNameType == UriHostNameType.IPv6;
        }
    }

И это результат:

"127.0.0.1".IsIPAddress(); //true
"2000:2000:2000:2000::".IsIPAddress(); //true
"www.google.com".IsIPAddress(); //false

Ответ 2

Вы можете воспользоваться System.Net.IPAddress.TryParse Method (String, IPAddress) и создать метод расширения для выполнения требуемых функций.

public static class IpAddressExtension {
    public static bool IsIPAddress(this string ipAddress) {
        System.Net.IPAddress address = null;
        return System.Net.IPAddress.TryParse(ipAddress, out address);
    }
}

Теперь это позволяет использовать

string host = System.Web.HttpContext.Current.Request.Headers["HOST"];

if (host.IsIPAddress()) {
    //...valid ip address
}

Ответ 3

Один из способов сделать это - использовать Dns.GetHostName() для получения HostName машины, на которой выполняется этот оператор, для сравнения с значением, которое вы прочитали из заголовка HOST - что-то вроде этого

var host = HttpContext.Current.Request.Headers["HOST"];
var machineHostName = Dns.GetHostName();

if(host.ToLower().Equals(machineHostName.ToLower()))
{
    // Perform your action here.
}