Vedi il codice di caricamento qui sotto. il metodo è chiamato all'interno di una prova, cattura. Se è necessario il codice per le utility immagine, basta dire. Fondamentalmente, tutto viene gestito in byte non elaborati e quindi archiviato nel DB. Attualmente eseguo il rendering delle immagini come base 64, ma mi sto muovendo verso l'utilizzo del frammento di fondo in web api.
I miei pensieri principali sono:
- L'immagine viene caricata in byte non elaborati. Anche se potrebbe contenere un virus, non verrebbe eseguito
- Il server ha una dimensione massima del file impostata e, prima di questo metodo, l'utente è autenticato e viene controllato che non stanno scaricando contemporaneamente altri file (uno alla volta) con un caricamento massimo di 100 immagini all'ora. Questo spero, spero, fermi un'immagine specifica.
- Poiché l'immagine viene modificata in modo da avere una certa dimensione (100 x 100), se non si tratta di un tipo di immagine valido ciò genera un'eccezione e tutto viene categorizzato
- Potrei aggiungere una lista bianca alle estensioni di file prima di questo se riesci a visualizzare potenziali problemi?
-
Credo che Image.FromStream sia al sicuro da un attacco di overflow
public string StoreProfileImage(ImageViewModel model, string userId) { var postedImg = model.Image; var image = Image.FromStream(postedImg.InputStream, true, true); if (image != null) { Rectangle rect = new Rectangle(); rect.X = (int)Math.Floor(model.x / model.scale); rect.Y = (int)Math.Floor(model.y / model.scale); rect.Width = (int)Math.Floor(model.width / model.scale); rect.Height = (int)Math.Floor(model.height / model.scale); // crop the image var croppedImg = ImageUtilities.CropImage(image, rect.Height, rect.Width, rect.X, rect.Y); // resize to max pic size var resizedImg = ImageUtilities.ResizeImage(100, 100, croppedImg); // convert to bytes byte[] imageData = ImageUtilities.ImageToByteArray(resizedImg); using (var db = new DbContext()) { var userImage = new UserImage { ImageBytes = imageData, ImageName = postedImg.FileName, UserId = userId, IsProfileImage = true }; // add new users image db.UserImage.Add(userImage); db.SaveChanges(); } return ImageUtilities.BytesToBase64(imageData); } return null; }
Snippet di rendering
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(image.ImageBytes);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
return result;