Analicemos lo que está sucediendo aquí observando el código de formularios web de ASP.NET.
Primer ejemplo, sin / co =1
[HttpRequestValidationException (0x80004005): se detectó un valor Request.QueryString potencialmente peligroso del cliente (= "alert (1) c__DisplayClass280_0.b__0 (clave de cadena, valor de cadena) +22
System.Web.HttpValueCollection.EnsureKeyValidated (String key) +9904693
System.Web.HttpValueCollection.GetValues (nombre de cadena) +17
System.Web.UI.Page.DeterminePostBackMode () +99
Si ejecutamos el código, podemos ver que la excepción se origina en EnsureKeyValidated
pero podemos llegar allí desde GetValues
, desde DeterminePostBackMode
. Así que si chequeas ahí vemos esto:
string[] values = nameValueCollection.GetValues((string) null);
para que parezca que lo que obtenemos aquí es recuperar todos los valores sin clave. Por lo tanto, la consulta anterior se puede volver a escribir en el formulario null=<script>alert(313)</script>&
. Por lo tanto, la secuencia de comandos se pasa a ser el valor para una clave nula / vacía .
Segundo ejemplo, w / =1
Aquí, estás haciendo que la clave sea igual a la secuencia de comandos, y el valor para que esa clave sea 1. Las claves se codifican antes de que se pasen al servidor, por lo que esto no sería un problema.
Sideseareplicarelerror,podríapasara=<script>alert(313)</script>
yobtendríaelmismoerrorqueseoriginóenunlugardiferente:
[HttpRequestValidationException(0x80004005):sedetectóunvalorRequest.QueryStringpotencialmentepeligrosodelcliente(a="alert (1) c__DisplayClass280_0.b__0 (clave de cadena, valor de cadena) +22
System.Web.HttpValueCollection.EnsureKeyValidated (String key) +9904693
System.Web.HttpValueCollection.GetValues (índice Int32) +29
System.Web.HttpValueCollection.ToString (urlencodificado Boolean, claves de exclusión de IDictionary) +206
System.Web.UI.Page.get_ClientQueryString () +411
Si necesita, puede controlar lo que se está denegado .