asp.net-mvc-4 viewmodel richtext

asp.net mvc 4 - ValidateInput(falso) vs AllowHtml



asp.net-mvc-4 viewmodel (1)

Tengo un formulario que se usa para crear una nota, para hacer eso, estoy usando un editor de texto enriquecido para proporcionar un poco de estilo, esto crea etiquetas html para aplicar estilo. Cuando publico ese texto, el mvc arroja un error para evitar secuencias de comandos potencialmente peligrosas, así que tengo que permitirlo específicamente.

He encontrado 2 formas de hacerlo, una es decorar el método del controlador con [ValidateInput(false)] y la otra es decorar el atributo ViewModel con [AllowHtml] . Para mí, [AllowHtml] ve mucho mejor, pero solo encontré ese enfoque usado una vez y el [ValidateInput(false)] parece ser el método preferido.

¿Qué método debo usar y cuáles son las diferencias entre los dos?


ValidateInput y AllowHTML están conectados directamente con problemas de seguridad de XSS .

Así que primero intentemos entender XSS.

XSS (scripting entre sitios) es un ataque de seguridad donde el atacante inyecta código malicioso mientras realiza la entrada de datos. Ahora la buena noticia es que XSS se previene por defecto en MVC. Entonces, si alguien intenta publicar código JavaScript o HTML, aterriza con el siguiente error.

Pero en tiempo real hay escenarios en los que se debe permitir HTML, como editores de HTML. Entonces, para ese tipo de escenarios, puede decorar su acción con el siguiente atributo.

[ValidateInput(false)] public ActionResult PostProduct(Product obj) { return View(obj); }

Pero espera, hay un problema aquí. El problema es que hemos permitido HTML en la acción completa que puede ser peligroso. Entonces, si podemos tener un control más granular en el campo o en el nivel de propiedad que realmente crearía una solución limpia, ordenada y profesional.

Ahí es donde AllowHTML es útil. Puede ver en el siguiente código que he decorado "AllowHTML" en el nivel de propiedad de la clase de producto.

public class Product { public string ProductName { get; set; } [AllowHtml] public string ProductDescription { get; set; } }

Por lo tanto, resumir "ValidateInput" permite que las secuencias de comandos y HTML se publiquen en el nivel de acción mientras que "AllowHTML" está en un nivel más granular.

Recomendaría usar "AllowHTML" más hasta que esté seguro de que toda la acción debe estar desnuda.

Le recomendaría que lea la publicación del blog Prevención de ataques XSS en ASP.NET MVC utilizando ValidateInput y AllowHTML, que muestra paso a paso la importancia de estos dos atributos con un ejemplo.