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:
Format se proveravao kroz
file.ContentType— a to je header koji klijent piše kako hoće. Nije bila kontrola nego uljudna molba.Ekstenzija se uzimala iz
file.FileName, dakle isto iz korisničkog unosa, i lepila na ime fajla koji završava uwwwroot. Poštowwwrootservira statični middleware, upload sa imenompayload.htmli header-omimage/jpegje pravio fajl koji se servira kaotext/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.