Table of Contents

Class ImageUploads

Namespace
UsluzionicaServer.Infrastructure.Media
Assembly
UsluzionicaServer.dll

Provera otpremljenih slika po SADRŽAJU fajla, i dodela ekstenzije na osnovu onoga što je stvarno pronađeno.

Ranije se radilo dvoje, i oboje je bilo pogrešno:

  1. Format se proveravao kroz file.ContentType — a to je header koji klijent piše kako hoće. Nije bila kontrola nego uljudna molba.

  2. Ekstenzija se uzimala iz file.FileName, dakle isto iz korisničkog unosa, i lepila na ime fajla koji završava u wwwroot. Pošto wwwroot servira statični middleware, upload sa imenom payload.html i header-om image/jpeg je pravio fajl koji se servira kao text/html — dakle stored XSS na domenu API-ja. Isto sa .svg, koji sme da nosi <script>.

Ovde se ekstenzija NIKAD ne uzima od klijenta. Čita se prvih nekoliko bajtova, utvrdi format, i vrati se ekstenzija koju MI biramo. Ime fajla koje je klijent poslao se ne koristi ni za šta.

Uz to se sadržaj pretražuje za tragovima skripte (vidi ContainsScriptMarkerAsync(Stream, byte[], CancellationToken)), jer validan JPEG može u sebi nositi i drugi payload — klasično je dopisati ga IZA završnog markera slike, gde ga dekoder ignoriše a drugi parser ne mora.

Ni to nije garancija: obfuskacija i kodiranje zaobilaze svaku pretragu po obrascu. Jedina potpuna mera je re-enkodiranje slike, koje uništava sve što nije piksel. Zato klijent svaku sliku pretvara u JPEG pre slanja (UsluzionicaApp/Services/ImageConverter.cs), a ovo je odbrana za slučaj da neko zaobiđe klijenta i gađa API direktno.

public static class ImageUploads
Inheritance
ImageUploads
Inherited Members

Fields

MaxAvatarBytes

Najveća dozvoljena veličina avatara.

MaxImageBytes

Najveća dozvoljena veličina slike oglasa i cover slike.

Methods

ValidateAsync(IFormFile, long, CancellationToken)

Vraća ekstenziju koju treba upisati (uključujući tačku), ili poruku o grešci. Tačno jedno od to dvoje je različito od null.