Por favor, vea el código de carga a continuación. El método se llama dentro de un try, catch. Si se necesita el código para las utilidades de imagen, simplemente diga. Básicamente, todo se maneja en bytes sin procesar y luego se almacena en la base de datos. Actualmente reproduzco imágenes como base 64, pero me estoy moviendo hacia el uso del fragmento inferior en la api web.
Mis principales pensamientos son:
- La imagen se carga en bytes sin procesar. Si bien podría contener un virus, no se ejecutaría
- El servidor tiene un tamaño máximo de archivo establecido, y antes de este método el usuario se autentica y se comprueba que no están descargando ningún otro archivo (uno a la vez) con una carga máxima de 100 imágenes por hora. Espero que esto detenga una imagen específica DoS.
- Debido a que la imagen se modifica para que tenga un tamaño determinado (100 x 100), si no es un tipo de imagen válido, se generará una excepción y todo se incluirá en la lista
- ¿Puedo agregar una lista blanca en las extensiones de archivo antes de esto si puedes ver algún problema potencial?
-
Creo que Image.FromStream está a salvo de un ataque por desbordamiento
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; }
Fragmento de procesamiento
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(image.ImageBytes);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
return result;