Saltar al contenido

ASP.NET MVC Se detectó un valor Request.Form potencialmente peligroso del cliente al usar un modelbinder personalizado

El tutorial o código que hallarás en este artículo es la resolución más eficiente y efectiva que encontramos a tu duda o problema.

Solución:

Tienes pocas opciones.

En el modelo agrega esto attribute a cada propiedad que necesita para permitir HTML – mejor elección

using System.Web.Mvc;

[AllowHtml]
public string SomeProperty  get; set; 

En la acción del controlador, agregue esto attribute para permitir todo HTML

[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)

Fuerza bruta en web.config – definitivamente no recomendado

En el archivo web.config, dentro de las etiquetas, inserte el elemento httpRuntime con el attribute requestValidationMode=”2.0″. También agregue la solicitud de validación=”false” attribute en el elemento de páginas.


  
   
  
  
  

Más información: http://davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx

Lo anterior funciona para los usos del modelbinder predeterminado.

Carpeta de modelos personalizada

Parece que una llamada a bindingContext.ValueProvider.GetValue() en el código anterior siempre valida los datos, independientemente de cualquier attributes. Indagar en las fuentes de ASP.NET MVC revela que DefaultModelBinder primero verifica si se requiere la validación de la solicitud y luego llama al método bindingContext.UnvalidatedValueProvider.GetValue() con un parámetro que indica si se requiere o no la validación.

Desafortunadamente, no podemos usar ningún código del marco porque está sellado, es privado o lo que sea para proteger a los desarrolladores ignorantes de hacer cosas peligrosas, pero no es demasiado difícil crear un archivador de modelo personalizado que funcione y respete AllowHtml y ValidateInput. attributes:

public class MyModelBinder: IModelBinder

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    
        // First check if request validation is required
        var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;

        // Get value
        var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
        if (valueProviderResult != null)
        
            var theValue = valueProviderResult.AttemptedValue;

            // etc...
        
    

La otra pieza requerida es una forma de recuperar un valor no validado. En este ejemplo, usamos un método de extensión para la clase ModelBindingContext:

public static class ExtensionHelpers

    public static ValueProviderResult GetValueFromValueProvider(this ModelBindingContext bindingContext, bool performRequestValidation)
    
        var unvalidatedValueProvider = bindingContext.ValueProvider as IUnvalidatedValueProvider;
        return (unvalidatedValueProvider != null)
          ? unvalidatedValueProvider.GetValue(bindingContext.ModelName, !performRequestValidation)
          : bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    

Más información sobre esto en http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/

Probar:

HttpRequestBase request = controllerContext.HttpContext.Request;
string re = request.Unvalidated.Form.Get("ConfirmationMessage")

Ampliando la respuesta de @DW, en mi controlador de edición, al iterar sobre los valores del formulario, tuve que reemplazar todas las instancias de Request.Params.AllKeys con Request.Unvalidated.Form.AllKeys y todas las instancias de Request[key] con Request.Unvalidated.Form[key].

Esta fue la única solución que funcionó para mí.

Te mostramos las comentarios y valoraciones de los lectores

Más adelante puedes encontrar las interpretaciones de otros programadores, tú incluso tienes la habilidad mostrar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *