2012-01-05 22 views
5

¿Cuál es el regular expression que utiliza Microsoft .NET Framework para realizar la validación estándar que da como resultado HttpRequestValidationException "Se detectó un valor Request.Form potencialmente peligroso desde el cliente" cuando HTML u otro medio potencialmente inseguro el contenido está publicado.ASP.NET potencialmente peligroso Solicitar Javascript Regex

Me gustaría tener una copia exacta de convertir a JavaScript para que el usuario pueda ser alertado temprano.

Mi expresión regular actual (/ (& #) | < [^ <>] +> /) está cerca, pero no es lo mismo que .NET.

Soy consciente de que esto podría ser diferente para diferentes versiones de .NET tan específicamente me gustaría saber:

  • Una expresión regular para .NET 2
  • Una expresión regular para .NET 4
+1

Tengo muchas dudas de que las expresiones regulares sean el único componente implicado - si es que lo es - para detectar eso ... – fge

Respuesta

4

Puede usar alguna herramienta decompilig y comprobar por sí mismo que no existe una expresión regular en absoluto. Llama al método estático CrossSiteScriptingValidation.IsDangerousString.

Pero tal vez pueda utilizar la biblioteca Microsoft AntiXSS para lograr lo mismo. De todos modos, aquí está el método:

internal static bool IsDangerousString(string s, out int matchIndex) 
{ 
    matchIndex = 0; 
    int num1 = 0; 
    int num2 = s.IndexOfAny(CrossSiteScriptingValidation.startingChars, num1); 
    if (num2 < 0) 
    { 
     return false; 
    } 
    if (num2 == s.Length - 1) 
    { 
     return false; 
    } 
    matchIndex = num2; 
    char chars = s.get_Chars(num2); 
    if ((chars == 38 || chars == 60) && (CrossSiteScriptingValidation.IsAtoZ(s.get_Chars(num2 + 1)) || s.get_Chars(num2 + 1) == 33 || s.get_Chars(num2 + 1) == 47 || s.get_Chars(num2 + 1) == 63)) 
    { 
     return true; 
    } 
    else 
    { 
     if (s.get_Chars(num2 + 1) == 35) 
     { 
      return true; 
     } 
    } 
    num1 = num2 + 1; 
} 
3

que podría haber respondido a esta pregunta en otra aquí: https://stackoverflow.com/a/4949339/62054

esta expresión regular sigue la lógica de .NE T 4.

/^(?!(.|\n)*<[a-z!\/?])(?!(.|\n)*&#)(.|\n)*$/i 

Buscar en la fuente de .NET para CrossSiteScriptingValidation para encontrar la lógica que sigue Microsoft. FGE tiene razón, no usa una expresión regular, en cambio usa algunos bucles y comparaciones de cadenas. Sospecho que es por el rendimiento.

Cuestiones relacionadas