Si vous créez une API ou un portail Web public, vous êtes probablement préoccupé par les performances. La limitation de vitesse peut aider à prévenir les abus d'attaques DDoS de base, et c'est assez simple à configurer pour les applications Blazor / ASP.NET Core.
Pourquoi les demandes de plafond tarifaire?
Il existe de nombreuses raisons de qualifier les demandes de limite. La plupart des services devraient probablement définir une sorte de limite de vitesse, parce qu'aucun humain raisonnable ne va effectuer 100 requêtes par seconde pendant dix minutes d'affilée. Par défaut, votre application répondra à toutes les demandes, donc déterminer une limite raisonnable est une bonne idée.
Résolument, votre fournisseur de cloud peut également avoir une protection DDoS. Cela protégera généralement bien contre les attaques de Cloak. 3 et 4 dirigé vers votre serveur. Malgré cela, vous voudrez vous assurer que votre serveur fait tout son possible pour empêcher les attaquants d'y accéder.
De plus, vous avez la possibilité de définir une limite beaucoup plus basse pour limiter les demandes sur les API publiques. Par exemple, peut-être qu'un certain point de terminaison nécessite beaucoup de traitement pour répondre à la demande. Vous souhaiterez peut-être limiter ce point de terminaison afin qu'aucune adresse IP ne puisse effectuer plus de quelques requêtes toutes les deux secondes, qui limite le stress sur votre serveur / base de données.
Définition de la limitation de vitesse dans ASP.NET Core
Blazor en tant que framework est basé sur ASP.NET Core, qui gère tous les éléments internes pour exécuter un serveur HTTP et répondre aux requêtes. Pour cela, vous devrez configurer la limitation du débit pour ASP.NET Core. Les mêmes étapes s'appliqueront à toute personne n'utilisant pas Blazor.
Malheureusement, la limitation de vitesse n'est pas une fonctionnalité par défaut dans ASP.NET Core. Malgré cela, il existe un package NuGet très populaire, AspNetCoreRateLimit
, ça fait plutôt bien le boulot. Vous pouvez l’installer en cliquant avec le bouton droit sur votre projet dans Visual Studio et en sélectionnant “Gérer les packages NuGet …”:
Chercher AspNetCoreRateLimit
et l'installer.
Il existe des alternatives à la limitation de vitesse. Si vous utilisez une API qui a besoin de clés, nous vous suggérons de limiter le tarif en fonction de la clé API, couvrant tous les cas. Pour la plupart des gens, la limitation de vitesse basée sur l'adresse IP est probablement bien, et est la valeur par défaut recommandée par AspNetCoreRateLimit.
Vous devrez l'ajouter en tant que service à ASP.NET. Tous les services sont configurés dans Startup.cs
, qui les ajoute avec le ConfigureServices(IServiceCollection services)
fonction.
Il y a pas mal de services à configurer. La première fonction configure les services pour charger les configurations depuis son fichier de configuration. Vous voudrez également ajouter le cache Microsoft si vous ne l'avez pas déjà fait.. Après, vous devrez configurer IpRateLimiting à partir du fichier JSON puis ajouter le limiteur de débit.
// nécessaire pour charger la configuration à partir de appsettings.json prestations de service.Ajouter des options(); // nécessaire pour stocker les compteurs de limite de débit et les règles IP prestations de service.AjouterMemoryCache(); //charger la configuration générale depuis appsettings.json prestations de service.Configurer(Configuration.ObtenirSection("IpRateLimiting")); // compteur d'injection et magasins de règles prestations de service.AddInMemoryRateLimiting(); // configuration (résolveurs, constructeurs de clés de compteur) prestations de service.AjouterSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
Aussi dans Startup.cs
, vous devrez configurer le générateur d'applications pour utiliser la limitation du débit IP.
app.UseIpRateLimiting();
Notez que cela utilise une limitation de vitesse de mémoire, qu'est-ce que c'est par exemple. Si vous équilibrez la charge de votre application, vous devrez utiliser un magasin de mémoire distribué comme Redis, que ce paquet a également un soutien pour.
Paramètres de limitation de vitesse
Une fois qu'il est ajouté à ASP.NET, tu devrais aller dans ton appsettings.json
fichier de configuration pour le configurer. La configuration ressemble à la suivante:
"IpRateLimiting": { "Activer EndpointRateLimiting": faux, "StackBlockedRequests": vrai, "En-tête Ip réel": "X-Real-IP", "ClientIdHeader": "X-ClientId", "HttpStatusCode": 429, "IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ], "Liste blanche des points de terminaison": [ "avoir:/api/licence", "*:/api/état" ], "ClientWhitelist": [ "dev-id-1", "dev-id-2" ], "Règles générales": [ { "Point de terminaison": "*", "Période": "1s", "Limite": 2 }, { "Point de terminaison": "*", "Période": "15m", "Limite": 100 }, { "Point de terminaison": "*", "Période": "12h", "Limite": 1000 }, { "Point de terminaison": "*", "Période": "7ré", "Limite": 10000 } ] }
En premier lieu, si vous prévoyez de limiter les taux de certains points de terminaison différemment, vous voudrez activer EnableEndpointRateLimiting, ce qui est faux par défaut.
StackBlockedRequests fera compter les demandes bloquées pour le compteur. Simplement, avec ce désactivé, toute personne qui fait des demandes encore et encore recevra X réponses par période. Avec lui activé, le nombre maximum de réponses augmentera très rapidement et ne recevra plus de réponse.
RealIpHeader et ClientIdHeader sont utilisés lorsque votre serveur est derrière un proxy inverse, qui est une configuration courante. Étant donné que les demandes proviendront toujours du serveur proxy, le proxy définit un en-tête avec les informations utilisateur réelles. Vous devrez vérifier votre proxy et vous assurer que cet en-tête est correctement défini, cas contraire, le limiteur de vitesse traitera tout le monde comme la même IP.
Après, il y a trois listes blanches, un pour IP, ID client et points de terminaison. Vous pouvez les supprimer si vous n'en avez pas besoin.
Après, vous devrez configurer chaque point de terminaison, ainsi qu'un délai et une limite. Un caractère générique couvrira tout et est la seule chose qui fonctionne avec EnableEndpointRateLimiting défini sur false. Si ce n'est pas comme ça, vous pouvez définir des points de terminaison en utilisant {HTTP_VERB}{PATH}
, y compris les caractères génériques, Pour ce que *:/api/values
correspondra à toutes les demandes GET et POST pour /api/values
.
Vous devez vous assurer que votre point de terminaison correspond à un fichier et non à un répertoire.. Dans mon cas, *:/download/*/*
était un point de terminaison valide, mais *:/download/*/*/
ce n’était pas le cas., en raison de la barre à la fin.
ce paramètre par défaut inclut une liste blanche d’adresses IP pour localhost, que vous devrez commenter si vous faites des tests. Mais, vous devriez pouvoir tester votre configuration en fixant la limite très basse, Quoi 5 par minute, et faire beaucoup de demandes. Cette erreur devrait apparaître, “Quota d’appels d’API dépassé”, ce qui veut dire qu'il fonctionne correctement.
Il y a beaucoup plus que ce paquet peut faire, donc si vous avez des besoins plus spécifiques que cela, nous suggestons vérifier votre documentation et voir ce qui est faisable.