asp.net mvc - validaterequest - Se detectó un valor Request.Form potencialmente peligroso.
system.web.httpexception: se detectó un posible valor request.path peligroso en el cliente(:). (6)
En MVC 3, agregue [AllowHtml]
a la propiedad en el modelo de vista que desea que no se valide.
Tengo un formulario con el editor de wmd en él. El área de texto de entrada se representa utilizando:
<%: Html.TextAreaFor(t => t.NewsBody, new{@class="wmd-panel", id="wmd-input"}) %>
Cada vez que envío el formulario, recibo A potentially dangerous Request.Form value was detected from the client
Intenté establecer [ValidateInput (false)] en el método de acción, intenté agregar <httpRuntime requestValidationMode="2.0" />
a web.config y probé validateRequest="false"
en la directiva de páginas en web.config pero todavía está sucediendo
¿Algunas ideas?
Editar
Método de acción:
[ILFFAuthorize(Roles = "Admin")] // this is a custom auth attrobite
[HttpPost]
[ValidateInput(false)]
public ActionResult AddNews(FormCollection col){
//public ActionResult AddNews(News news)
//{
if (ModelState.IsValid)
{
News news = new News();
news.NewsDate = DateTime.Now;
news.NewsPosterId = 0;
news.NewsTitle = col["NewsTitle"];
news.NewsBody = col["NewsBody"];
newsRepository.Add(news);
newsRepository.Save();
return RedirectToAction("Index", "Home");
}
else
{
return View();
}
}
En el archivo web.config, dentro de las etiquetas, inserte el elemento httpRuntime con el atributo requestValidationMode = "2.0". También agregue el atributo validateRequest = "false" en el elemento pages.
Ejemplo:
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
<pages validateRequest="false">
</pages>
</configuration>
Intenté encontrar una solución a este problema todo el día.
Deshabilitar la validación no era una opción.
La adición de allowHtml tampoco era una opción, porque según la especificación msdn:
AllowHtmlAttribute permite que una solicitud incluya un marcado HTML durante el enlace del modelo omitiendo la validación de solicitud para la propiedad. source
Además, hay muchas propiedades con atributos de cadena dentro de un proyecto que deben validarse si la validación predeterminada se establece en falso.
Solución:
He creado una clase CustomRequestValidation:
public class CustomRequestValidation : System.Web.Util.RequestValidator
{
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{
validationFailureIndex = -1;
if (requestValidationSource == RequestValidationSource.RawUrl)
return true;
if (requestValidationSource == RequestValidationSource.Form)
{
var isValid = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
if (!isValid)
{
validationFailureIndex = -1;
return true;
}
}
return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
}
lo que hace es que simplemente omite RequestValidation con el fin de alcanzar el estado del modelo.
A continuación, he anulado la carpeta del modelo por defecto:
public class CustomModelBinder : DefaultModelBinder
{
protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
{
if (value != null)
{
if (propertyDescriptor.PropertyType == typeof(string))
{
string val = value.ToString();
int validationIndex;
var isValid = new System.Web.Util.RequestValidator().InvokeIsValidRequestString(controllerContext.HttpContext.ApplicationInstance.Context, val, RequestValidationSource.Form, null, out validationIndex);
if (!isValid && !propertyDescriptor.Attributes.OfType<AllowHtmlAttribute>().IsAny())
{
var key = CreateSubPropertyName(bindingContext.ModelName, propertyDescriptor.Name);
bindingContext.ModelState.AddModelError(key, ErrorConstants.SpecialCharacters);
}
}
}
return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
}
}
Ahora aquí hacemos toda la validación. En la carpeta del modelo, invoco el método predeterminado .Net IsValidRequestString junto con una verificación si se estableció AllowHtml y establecí el estado del modelo en consecuencia. Me da control sobre los datos y puedo volver a la página y rellenar el formulario con los datos ingresados previamente sin disparar los scripts insertados. Estoy usando modelos fuertemente tipados.
La regla general es que obtendrá ese error al publicar en un método de acción que no permita valores de forma potencialmente peligrosos. Si lo tiene en cuenta junto con el hecho de que, obviamente, ha elegido permitir tales valores en un método de acción determinado, debe concluir que de alguna manera está publicando en un método de acción diferente.
¿Puedes intentar publicar una cadena estándar (es decir, "hola") sin WMD y verificar si se alcanzan los puntos de interrupción en el método de acción seleccionado?
use [ValidateInput (false)] para resolver este tipo de error
Esto sucede porque la entrada del usuario contiene varias etiquetas html. Por lo tanto, la arquitectura MVC3 no tiene permiso para este tipo de entrada.
Podemos eliminar este error escribiendo [ValidateInput (falso)] sobre el resultado de una acción o donde estamos enviando nuestro formulario. Este comando deshabilitará la validación del formulario para las etiquetas html.
[HttpPost]
colocar esto encima de su método de acción [HttpPost]
[HttpPost]
[ValidateInput(false)]
public ActionResult Edit(FormCollection collection) {
.....
}
Si está utilizando MVC3, entonces no debe usar [ValidateInput(false)]
sino usar [AllowHtml]
que se explica aquí: http://dailydotnettips.com/2011/08/24/how-to-allow-user-to-input-html-in-asp-net-mvc/
también: intente colocar [ValidateInput(false)]
sobre su [HttpPost]
no debajo, como recuerdo, estos se ejecutan de arriba a abajo.