ASP.NET potentiellement Dangerous Request Javascript Regex

Quelle est l' expression régulière que .NET Framework de Microsoft utilise pour effectuer la validation standard qui aboutit à HttpRequestValidationException "Une valeur potentiellement dangereuse Request.Form a été détectée à partir du client" lorsque le contenu HTML ou autre contenu potentiellement dangereux est affiché.

J'aimerais que la copie exacte soit convertie en JavaScript afin que l'utilisateur puisse être alerté au début.

Mon expression actuelle actuelle (/ (& #) | <[^ <>] +> /) est proche, mais pas la même que celle de .NET.

Je suis conscient que cela pourrait être différent pour différentes versions de .NET, donc je souhaiterais savoir:

  • Une expression régulière pour .NET 2
  • Une expression régulière pour .NET 4

Vous pouvez utiliser un outil de décompilig et voir par vous-même qu'il n'y a pas d'expression régulière du tout. Il appelle la méthode statique CrossSiteScriptingValidation.IsDangerousString .

Mais peut-être que vous pouvez utiliser la bibliothèque Microsoft AntiXSS pour atteindre les mêmes résultats. De toute façon, voici la méthode:

 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; } 

J'aurais peut-être répondu à cette question dans une autre question ici: https://stackoverflow.com/a/4949339/62054

Ce regex suit la logique dans .NET 4.

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

Regardez dans la source .NET pour CrossSiteScriptingValidation pour trouver la logique suivie par Microsoft. Fge est correct, il n'utilise pas un regex, mais il utilise des boucles et des comparaisons de chaînes. Je pense que c'est pour la performance.