example - Se detectó un valor Request.QueryString potencialmente peligroso desde el cliente al enviar marcas HTML a partir de la llamada posterior de jquery a la página asp.net
token web api (5)
Estoy haciendo una llamada ajax usando jQuery a una página ASP.NET que actúa como mi página de servidor ajax para guardar los datos que le estoy enviando en la cadena de consulta. En la página ASP.NET cuando intento leer la cadena de consulta, recibo este error:
A potentially dangerous Request.QueryString value was detected from the client...
Establecí ValidateRequest="false"
en mi página. No quiero configurarlo para todas las páginas. Lo hizo en el nivel de página en lugar del nivel de configuración:
var content = "<h3>Sample header</h3><p>sample para</p>"
content = encodeURIComponent(content);
var url = "../Lib/ajaxhandler.aspx?mode=savecontent&page=home<xt=" + content;
$.post(url, function (data) {
//check return value and do something
});
y en mi página asp.net:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ajaxhandler.aspx.cs" ValidateRequest="false" Inherits="MyProject.Lib.ajaxhandler" %>
Pero cuando envío texto sin formato en lugar del marcado HTML, funciona bien.
He creado un par de métodos reutilizables basados en la respuesta de VAV
public static string ExtractUnvalidatedValue(HttpRequest request, string key)
{
var unvalidatedValue = HttpUtility.UrlDecode(request.Unvalidated.QueryString[key]);
// for RequestValidationMode="2.0"
//var unvalidatedValue = context.Request.QueryString["SomeKey"];
// remove all "potentially dangerous" symbols
return ReplacePotentiallyDangerousSymbols(unvalidatedValue, string.Empty);
}
public static string ReplacePotentiallyDangerousSymbols(string unvalidatedValue, string valueToReplace="")
{
if (!string.IsNullOrEmpty(unvalidatedValue))
{
//The regular expression made as result of this ASP.NET method analyzing: CrossSiteScriptingValidation.IsDangerousString http://referencesource.microsoft.com/#System.Web/CrossSiteScriptingValidation.cs,3c599cea73c5293b
unvalidatedValue = Regex.Replace(unvalidatedValue,
"(//<+[a-z!///?])|(&//#)",
new MatchEvaluator((m) => { return m.Value.Replace("<", valueToReplace).Replace("&#", valueToReplace); }), RegexOptions.IgnoreCase);
}
return unvalidatedValue;
}
Si desea agregar una lógica de validación personalizada para una página ASP.NET en particular o para uno o más parámetros de cadena de consulta sin establecer ValidateRequest="false"
para toda la página, la siguiente solución "hacky" podría ser útil:
public partial class MyPage : System.Web.UI.Page
{
private string SomeUnvalidatedValue { get; set; }
public override void ProcessRequest(HttpContext context)
{
var queryString = context.Request.QueryString;
var readOnly = queryString.GetType().GetProperty("IsReadOnly",
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
readOnly.SetValue(queryString, false);
var unvalidatedValue = context.Request.Unvalidated.QueryString["SomeKey"];
// for RequestValidationMode="2.0"
//var unvalidatedValue = context.Request.QueryString["SomeKey"];
// custom logic goes here
// you could store unvalidated value here and then remove it from the query string
SomeUnvalidatedValue = unvalidatedValue;
queryString["SomeKey"] = string.Empty;
// or just remove all "potentially dangerous" symbols, for example
if (!string.IsNullOrEmpty(unvalidatedValue))
{
queryString["SomeKey"] = Regex.Replace(unvalidatedValue,
"(//<+[a-z!///?])|(&//#)", new MatchEvaluator((m) =>
{
return m.Value.Replace("<", string.Empty).Replace("&#", string.Empty);
}), RegexOptions.IgnoreCase);
}
readOnly.SetValue(queryString, true);
// keep other request validation logic as is
base.ProcessRequest(context);
}
}
La expresión regular realizada como resultado de este método ASP.NET analizando: CrossSiteScriptingValidation.IsDangerousString
Código probado con .NET 4.5.2, modo integrado de IIS, con y sin RequestValidationMode="2.0"
.
Si esto es ASP.NET 4, hubo un cambio radical con ValidateRequest
. Consulte esta pregunta de para obtener más información sobre requestValidationMode
.
Ya hay una buena respuesta para esto, y aquí proporcionaré la información para que no tenga que hacer clic en los enlaces.
Al ejecutar ASP.NET 4.0, deberá configurar lo siguiente en su archivo web.config RequestValidationMode="2.0"
.
¿Para qué es esta propiedad?
Un valor que indica qué enfoque de validación específico de la versión de ASP.NET se usará. El valor predeterminado es 4.0.
Entonces, ¿cuáles son los valores posibles?
4.0 (el predeterminado). El objeto HttpRequest establece internamente un indicador que indica que la validación de solicitud debe activarse siempre que
Se accede a los datos de solicitud HTTP. Esto garantiza que la solicitud
la validación se desencadena antes de que los datos como las cookies y las URL sean
accedido durante la solicitud. La configuración de validación de solicitud de
elemento de páginas (si existe) en el archivo de configuración o de la página @
directiva en una página individual son ignoradas.2.0. La validación de solicitud está habilitada solo para páginas, no para todas las solicitudes HTTP. Además, la configuración de validación de solicitud del elemento de páginas (si existe) en el archivo de configuración o de la directiva @ Page en una página individual se usa para determinar qué solicitudes de página validar.
establecer ValidateRequest = "false" en la parte superior de la página asp.