Определите, разрешено ли хост 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
, или даже внешний статический метод от помощника класс, который мог бы сделать это определение вместо этого?
Ответы
Ответ 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.
}