文字列に相対または絶対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);
}
何らかの理由で、いくつかの適切な回答が所有者によって削除されました。
Uri.IsWellFormedUriString(url, UriKind.Absolute)
そして
Uri.IsWellFormedUriString(url, UriKind.Relative)
riParser および @ Marcelo Cantos による実装
相対URIと絶対URIの両方を処理できる UriBuilder
を使用すると、より直接目的を達成できます(以下の例を参照)。
@icktoofayも良い点です:許可リストにサブドメイン(www.google.com
など)を含めるか、builder.Host
プロパティをさらに処理して実際のドメインを取得してください。より多くの処理を行うことにした場合、bbc.co.uk
のような複雑なTLDを持つURLを忘れないでください。
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)
);
}
}
}