Sigurnost Blazor aplikacije: 12 provjera prije puštanja u rad
Dvanaest sigurnosnih provjera za Blazor poslovne aplikacije na .NET-u 10: ovlasti u servisima, tajne, WebAssembly, forme, greške, CSP i ranjivi paketi.
Vlado Pandžić · Osnivač · Senior .NET arhitekt
Objavljeno · 5 min čitanja
Većina sigurnosnih incidenata u poslovnim aplikacijama nije pametna. Ključ ostavljen u repozitoriju, token koji nikad ne istječe, ekran koji skriva gumb, ali ne i radnju iza njega. Blazor dolazi s razumnim zadanim postavkama, ali kod sučelja i kod servera u njemu izgledaju gotovo isto, i upravo se tu kriju lake greške.
Evo dvanaest provjera koje se isplati proći prije nego što Blazor aplikacija ode u produkciju ili prije idućeg audita. Neke vrijede svugdje, a neke samo za određeni način rada.
Svugdje
1. Ovlasti pripadaju servisu, a ne samo sučelju
AuthorizeView odlučuje što korisnik vidi. Ne odlučuje što korisnik smije napraviti.
<AuthorizeView Roles="Finance">
<button @onclick="() => Payments.ApproveAsync(payment.Id, user)">Approve payment</button>
</AuthorizeView>
Skrivanje gumba je dobro iskustvo za korisnika, ali zaštita mora biti u metodi koja radi posao, tako da vrijedi bez obzira na to koji je ekran, API ili budući developer poziva:
public sealed class PaymentService(IAuthorizationService authorization, PaymentRepository payments)
{
public async Task ApproveAsync(int paymentId, ClaimsPrincipal user)
{
var result = await authorization.AuthorizeAsync(user, "ApprovePayments");
if (!result.Succeeded)
throw new UnauthorizedAccessException();
await payments.ApproveAsync(paymentId);
}
}
Stranice se štite s @attribute [Authorize], a osjetljive radnje pravilom u servisu. Oboje, a ne jedno ili drugo. Isto pravilo vrijedi i za AI asistenta unutar aplikacije.
2. Nema tajni u repozitoriju
Connection stringovi, API ključevi i certifikati pripadaju u Azure Key Vault ili u postavke hosting okruženja, a lokalno u Secret Manager, a ne u appsettings.json. Ako je ključ ikad bio commitan, nije dovoljno obrisati ga, jer ostaje u git povijesti. Mora se zamijeniti novim.
3. Tokeni i ključevi koji istječu
API ključevi bez datuma isteka i sesije koje traju mjesecima otvorena su vrata kojih se nitko ne sjeća. Svaki ključ treba vlasnika, datum isteka i način da se opozove.
4. Poznate ranjivosti u NuGet paketima
Od .NET 8 SDK-a NuGet pri dohvaćanju paketa upozorava na pakete s poznatim ranjivostima. Ta se upozorenja ne smiju utišati i zaboraviti. Za starije aplikacije naš besplatni alat za migraciju .NET Frameworka pokazuje koji vaši paketi imaju poznate ranjivosti.
5. Sirovi HTML samo iz pouzdanih izvora
Blazor kodira sve što prikazuje, pa tekst koji korisnik upiše ne može postati skripta. Iznimka je MarkupString, koji HTML prikazuje takav kakav jest. Ako taj HTML dolazi od korisnika, iz e-mailova ili vanjskih sustava, prvo ga treba očistiti.
6. Detaljne greške samo u razvoju
DetailedErrors šalje u preglednik cijelu grešku s detaljima. Na developerovom računalu to je korisno, a u produkciji je poklon napadaču. U produkciji korisnik dobiva kratku poruku, a detalji idu u log, na primjer u Application Insights.
7. Ograničenja za prijavu i skupe operacije
Prijava, reset lozinke i izvozi koji jako opterećuju bazu trebaju ograničenje koliko zahtjeva korisnik ili adresa smije poslati. ASP.NET Core to ima ugrađeno, uz AddRateLimiter.
8. Sigurnosna zaglavlja i CSP
Content Security Policy pregledniku kaže koje skripte smije izvršavati. Blazor ima svoje zahtjeve: WebAssembly aplikaciji u pravilima treba wasm-unsafe-eval. Pravila postavite namjerno i testirajte ih, umjesto da ih izostavite jer je “nešto prestalo raditi”.
Statične forme
9. Zaštita od lažnih zahtjeva (antiforgery)
U Blazor Web App aplikaciji forme koje se iscrtavaju na serveru zaštićene su od lažnih zahtjeva s drugih stranica kad aplikacija poziva app.UseAntiforgery(). EditForm sam dodaje token, a obična HTML <form> treba komponentu <AntiforgeryToken />.
Interactive Server
10. Ne dižite ograničenja veze naslijepo
Kod Interactive Servera svaki korisnik drži vezu i memoriju na serveru. Blazor ima ograničenja za veličinu poruka i za to koliko sprema po korisniku, a njihovo dizanje “jer nije prošao upload” otvara put iscrpljivanju servera. Velike datoteke idu kroz zaseban upload, a ne kroz jednu ogromnu poruku. Kako se memorija po korisniku zbraja, opisuje članak o sporim Blazor aplikacijama.
WebAssembly
11. Ništa tajno u klijentu
Sve što WebAssembly aplikacija sadrži preuzima se u preglednik: kod, konfiguracija i biblioteke. Microsoft jasno kaže da se connection stringovi, ključevi, lozinke i privatni kod nikad ne smiju naći ondje. Provjere ovlasti u pregledniku mogu se zaobići, pa svaki API mora ponovno provjeriti ovlasti na serveru.
12. Tokeni ostaju na serveru
Pristupni tokeni u lokalnoj pohrani preglednika laka su meta. Microsoftov preporučeni pristup za Blazor Web App aplikacije je uzorak Backend for Frontend: server čuva tokene i razgovara s API-jima, a preglednik dobiva samo siguran cookie.
Kontrolna lista u jednoj tablici
| # | Provjera | Vrijedi za |
|---|---|---|
| 1 | Ovlasti u servisima, a ne samo u sučelju | Svugdje |
| 2 | Nema tajni u repozitoriju | Svugdje |
| 3 | Ključevi i tokeni koji istječu | Svugdje |
| 4 | Nema poznatih ranjivosti u NuGet paketima | Svugdje |
| 5 | MarkupString samo za pouzdan HTML |
Svugdje |
| 6 | Detaljne greške isključene u produkciji | Svugdje |
| 7 | Ograničenja za prijavu i skupe operacije | Svugdje |
| 8 | Promišljen CSP i sigurnosna zaglavlja | Svugdje |
| 9 | Antiforgery za forme | Statične forme |
| 10 | Ograničenja veze ostaju na mjestu | Interactive Server |
| 11 | Ništa tajno u klijentu | WebAssembly |
| 12 | Tokeni na serveru (BFF) | WebAssembly |
Koji način rada treba koristiti koji ekran i što to znači za sigurnost, opisujemo u članku Blazor Server vs WebAssembly vs Auto.
Kako mi radimo
Blazor i .NET aplikacije pregledavamo upravo po ovoj listi i popravljamo ono što nađemo, od ovlasti koje su postojale samo u sučelju do ključeva koji su završili u repozitoriju. Dobivate listu rizika poredanu po važnosti, od onih koje se isplati riješiti ovaj tjedan do onih koji mogu pričekati. Više o našem radu s Blazorom, a prvi korak je besplatan razgovor od 30 minuta.
Izvori
- ASP.NET Core Blazor authentication and authorization, Microsoft Learn
- Secure ASP.NET Core Blazor WebAssembly, Microsoft Learn
- Threat mitigation for interactive server-side rendering, Microsoft Learn
- Secure a Blazor Web App with OpenID Connect, Microsoft Learn
- Content Security Policy for Blazor, Microsoft Learn
- Blazor forms and antiforgery, Microsoft Learn
- Handle errors in Blazor apps, Microsoft Learn
- Rate limiting middleware, Microsoft Learn
- Auditing NuGet packages for security vulnerabilities, Microsoft Learn
Ovaj članak služi općem informiranju i nije pravni, porezni, financijski ni drugi stručni savjet. Scenariji, primjeri i izračuni su ilustrativni. Uvjeti korištenja i odricanje od odgovornosti.