J'ai une URL relative ou absolue dans une chaîne. J'ai d'abord besoin de savoir si c'est absolu ou relatif. Comment puis-je faire cela? Je veux ensuite déterminer si le domaine de l'URL est dans une liste d'autorisation.
Voici ma liste d'autorisation, à titre d'exemple:
string[] Allowed =
{
"google.com",
"yahoo.com",
"espn.com"
}
Une fois que je sais si c'est relatif ou absolu, c'est assez simple je pense:
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);
}
Pour une raison quelconque, quelques bonnes réponses ont été supprimées par leurs propriétaires:
Uri.IsWellFormedUriString(url, UriKind.Absolute)
et
Uri.IsWellFormedUriString(url, UriKind.Relative)
--- riParser et implémentations via @ Marcelo Cantos
Vous pouvez obtenir ce que vous voulez plus directement avec UriBuilder
qui peut gérer à la fois les URI relatifs et absolus (voir l'exemple ci-dessous).
@icktoofay fait également un bon point: assurez-vous d'inclure soit des sous-domaines (comme www.google.com
) dans votre liste autorisée ou effectuez d'autres traitements sur le builder.Host
propriété pour obtenir le domaine réel. Si vous décidez de faire plus de traitement, n'oubliez pas les URL avec des TLD complexes comme 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)
);
}
}
}