Ответ 1
bool IsAbsoluteUrl(string url)
{
Uri result;
return Uri.TryCreate(url, UriKind.Absolute, out result);
}
У меня есть относительный или абсолютный url в строке. Сначала я должен знать, является ли он абсолютным или относительным. Как мне это сделать? Затем я хочу определить, находится ли домен URL в списке разрешений.
Вот мой список разрешений, например:
string[] Allowed =
{
"google.com",
"yahoo.com",
"espn.com"
}
Как только я знаю, является ли его относительным или абсолютным, его довольно простой, я думаю:
if (Url.IsAbsolute)
{
if (!Url.Contains("://"))
Url = "http://" + Url;
return Allowed.Contains(new Uri(Url).Host);
}
else //Is Relative
{
return true;
}
bool IsAbsoluteUrl(string url)
{
Uri result;
return Uri.TryCreate(url, UriKind.Absolute, out result);
}
По некоторым причинам несколько хороших ответов были удалены их владельцами:
Через @Chamika Sandamal
Uri.IsWellFormedUriString(url, UriKind.Absolute)
и
Uri.IsWellFormedUriString(url, UriKind.Relative)
UriParser и реализации через @Marcelo Cantos
Вы можете добиться того, что хотите более непосредственно с UriBuilder
, который может обрабатывать как относительные, так и абсолютные URI (см. пример ниже).
@icktoofay также делает хороший вывод: обязательно укажите субдомены (например, www.google.com
) в разрешенном списке или сделайте больше обработки в свойстве builder.Host
, чтобы получить фактический домен. Если вы решите сделать больше обработки, не забывайте о URL-адресах со сложными TLD, например bbc.co.uk
.
using System;
using System.Linq;
using System.Diagnostics;
namespace UriTest
{
class Program
{
static bool IsAllowed(string uri, string[] allowedHosts)
{
UriBuilder builder = new UriBuilder(uri);
return allowedHosts.Contains(builder.Host, StringComparer.OrdinalIgnoreCase);
}
static void Main(string[] args)
{
string[] allowedHosts =
{
"google.com",
"yahoo.com",
"espn.com"
};
// All true
Debug.Assert(
IsAllowed("google.com", allowedHosts) &&
IsAllowed("google.com/bar", allowedHosts) &&
IsAllowed("http://google.com/", allowedHosts) &&
IsAllowed("http://google.com/foo/bar", allowedHosts) &&
IsAllowed("http://google.com/foo/page.html?bar=baz", allowedHosts)
);
// All false
Debug.Assert(
!IsAllowed("foo.com", allowedHosts) &&
!IsAllowed("foo.com/bar", allowedHosts) &&
!IsAllowed("http://foo.com/", allowedHosts) &&
!IsAllowed("http://foo.com/foo/bar", allowedHosts) &&
!IsAllowed("http://foo.com/foo/page.html?bar=baz", allowedHosts)
);
}
}
}