Blazor i .NET

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ć

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

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.

Povezani članci

© 2026 ProCoding — Sva prava pridržana.Impresum i privatnostUvjeti korištenjaSplit, Hrvatska