Limietverzoeken beoordelen in Blaz/ASP.NET Core

0
160

Als u een openbare API of website maakt, 8217; maakt zich waarschijnlijk zorgen over de prestaties. Snelheidsbeperking kan misbruik van elementaire DDoS-aanvallen helpen voorkomen, en het is vrij eenvoudig in te stellen voor Blazor/ASP.NET Core-toepassingen.

Waarom aanvragen voor tarieflimieten?

Er zijn tal van redenen om limietverzoeken te beoordelen. De meeste services zouden waarschijnlijk een soort snelheidslimiet moeten instellen, omdat geen enkel redelijk mens tien minuten lang 100 verzoeken per seconde zal doen. Uw applicatie reageert standaard op elk verzoek, dus het is een goed idee om een ​​redelijke limiet in te stellen.

Natuurlijk kan uw cloudprovider ook DDoS-beveiliging hebben. Dit beschermt meestal goed tegen Layer 3- en 4-aanvallen die op uw server zijn gericht. U wilt er echter wel zeker van zijn dat uw server er alles aan doet om te voorkomen dat aanvallers toegang krijgen.

Je hebt ook de mogelijkheid om de limiet veel lager in te stellen om verzoeken op openbare API's te beperken. Het kan bijvoorbeeld zijn dat een bepaald eindpunt veel verwerking nodig heeft om op het verzoek te reageren. Misschien wilt u dit eindpunt beperken, zodat geen enkel IP-adres meer dan een paar verzoeken per paar seconden kan doen, waardoor de belasting van uw server/database wordt beperkt.

Snelheidsbeperking instellen in ASP.NET Core

Blazor is als framework gebouwd bovenop ASP.NET Core, dat alle zaken onder de motorkap afhandelt voor het uitvoeren van een HTTP-server en het reageren op verzoeken. U moet dus snelheidsbeperking configureren voor ASP.NET Core. Dezelfde stappen zijn van toepassing op iedereen die Blazor niet gebruikt.

Advertentie

Snelheidsbeperking is helaas geen standaardfunctie in ASP.NET Core. Er is echter een zeer populair NuGet-pakket, AspNetCoreRateLimit, dat het werk redelijk goed doet. U kunt het installeren door met de rechtermuisknop op uw project in Visual Studio te klikken en 'NuGet-pakketten beheren' te selecteren:

Zoek naar AspNetCoreRateLimit en installeer het.

Er zijn een paar manieren om aan snelheidsbeperking te doen. Als u een API gebruikt die sleutels nodig heeft, raden we aan om de snelheid te beperken op basis van de API-sleutel, die alle gevallen dekt. Voor de meeste mensen is snelheidsbeperking op basis van IP-adres waarschijnlijk prima, en is de standaard aanbevolen door AspNetCoreRateLimit.

Je zult het als een service aan ASP.NET moeten toevoegen. Alle services worden geconfigureerd in Startup.cs, die ze toevoegt met de functie ConfigureServices(IServiceCollection services).

Er zijn nogal wat services om te configureren. De eerste functie configureert de services om instellingen uit uw configuratiebestand te laden. Je zult ook de geheugencache van Microsoft willen toevoegen als je dat nog niet hebt gedaan. Vervolgens moet u IpRateLimiting configureren vanuit het JSON-bestand en vervolgens de snelheidsbegrenzer toevoegen.

//nodig om configuratie te laden van appsettings.json services.AddOptions();   //nodig om snelheidslimiettellers en ip-regelsservices op te slaan.AddMemoryCache();   //laad de algemene configuratie van appsettings.json services.Configure"Configuration.GetSection""IpRateLimiting""""&41;;   //injecteer teller en regels slaan services op.AddInMemoryRateLimiting();   //configuratie (resolvers, counter key builders) services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();

Ook in Startup.cs moet u de applicatiebouwer configureren om IP-snelheidsbeperking te gebruiken.

app.UseIpRateLimiting();

Houd er rekening mee dat dit gebruikmaakt van snelheidsbeperking in het geheugen, wat per instantie is. Als je je applicatie load balancing nodig hebt, moet je een gedistribueerde geheugenopslag gebruiken zoals Redis, waarvoor dit pakket ook ondersteuning biedt.

Snelheidsbeperking configureren

Zodra het is toegevoegd aan ASP.NET, moet u naar uw app-instellingen gaan. json-configuratiebestand om het in te stellen. De configuratie ziet er ongeveer als volgt uit:

“IpRateLimiting”: { “EnableEndpointRateLimiting”: false, “StackBlockedRequests”: true, “RealIpHeader”: “X-Real-IP”, “ClientIdHeader”: “X-ClientId”, “HttpStatusCode”: 429, “IpWhitelist”: [ “127.0.0.1”, “::1/10”, “192.168.0.0/24” ], “EndpointWhitelist”: [ “get:/api/license”, “*:/api/status” ], “ClientWhitelist” : [ “dev-id-1”, “dev-id-2” ], “GeneralRules”: [ { “Eindpunt”: “*”, “Periode”: “1s”, “Limiet”: 2 }, { ” Eindpunt”: “*”, “Periode”: “15m”, “Limiet”: 100 }, { “Eindpunt”: “*”, “Periode”: “12u”, “Limiet”: 1000 }, { “Eindpunt” : “*”, “Periode”: “7d”, “Limit”: 10000 } ] } Advertentie

Ten eerste, als u van plan bent bepaalde eindpunten anders te beoordelen, moet u deze inschakelen EnableEndpointRateLimiting, wat standaard onwaar is.

StackBlockedRequests laat alle geblokkeerde verzoeken meetellen voor de teller. Kortom, als dit is uitgeschakeld, krijgt iedereen die keer op keer verzoeken doet X antwoorden per periode. Als het aan staat, werken ze heel snel het maximale aantal reacties op en zullen ze ook niet meer worden beantwoord.

RealIpHeader en ClientIdHeader worden gebruikt wanneer uw server zich achter een reverse proxy bevindt, wat een veelvoorkomende configuratie is. Aangezien de verzoeken altijd van de proxyserver komen, stelt de proxy een header in met de feitelijke informatie van de gebruiker. U moet uw proxy controleren en ervoor zorgen dat deze header correct is ingesteld, anders behandelt de snelheidsbegrenzer iedereen als hetzelfde IP-adres.

Dan zijn er drie witte lijsten, één voor IP's, client-ID's en eindpunten. Je kunt deze verwijderen als je ze niet nodig hebt.

Vervolgens moet u elk eindpunt configureren, evenals een periode en limiet. Een jokerteken dekt alles en is het enige dat werkt als EnableEndpointRateLimiting is ingesteld op false. Als dit niet het geval is, kunt u eindpunten definiëren met {HTTP_VERB}{PATH}, inclusief jokertekens, zodat *:/api/values ​​alle GET- en POST-verzoeken matcht met /api/values.

Advertentie

U moet ervoor zorgen dat uw eindpunt overeenkomt met een bestand en niet met een map. In mijn geval was *:/download/*/* een geldig eindpunt, maar *:/download/*/*/ was dat niet vanwege de slash.

Deze standaardconfiguratie bevat een IP-witte lijst voor localhost, die u moet opgeven als u’ ben bezig met testen. Maar u zou uw configuratie moeten kunnen testen door de limiet erg laag in te stellen, zoals 5 per minuut, en een heleboel verzoeken te doen. U zou deze foutmelding moeten krijgen, “API-aanroepen quota overschreden,” wat betekent dat het goed werkt.

Er is veel meer dat dit pakket kan doen, dus als je meer specifieke behoeften hebt dan dit, raden we je aan hun documentatie te bekijken en te zien wat 8217;s mogelijk.