2012-07-06 5 views
5

Ähnlich wie this question aber es ist mir egal, welche Zeichen den Fehler auslösen/verursachen werden. Ich bin eher neugierig, welche Methode ich aufrufen kann, um selbst zu überprüfen, ob die aktuelle Zeichenfolge die obige Fehlermeldung auslöst.Wie überprüft man, ob der String ausgelöst wird "Ein potentiell gefährlicher Request.Form-Wert wurde gefunden ..." Fehler

Um ein bisschen Hintergrundwissen zu geben, erstelle ich zufällige Passwörter, wenn ein Benutzer sie vergisst und einen Reset benötigt. Leider hat der zufällige Passwortgenerator "versehentlich" einen mit &# darin neu erstellt. Dies führte zum Brechen der Seite, wenn der Benutzer versuchte, sich mit der Seite anzumelden.

Wie in vielen Beiträge rund um dieses Thema erwähnt, ValidateRequest=false (oder <httpRuntime requestValidationMode="2.0" /> für .NET 4.0) verwendet werden, .NET deaktivieren für diese Taten überprüft, aber ich sehe keinen Grund, diese zusätzliche Schicht zu verlieren Sicherheit, wenn ich derjenige bin, der die Saite an erster Stelle erzeugt. Und dem Zufallsgenerator einfach zu sagen, dass er auf einer unvollständigen Liste (<, &#, etc) re-randomieren soll, scheint nicht die sauberste Lösung zu sein, daher würde ich gerne dieselbe Methode verwenden, die .NET verwendet.

Microsofts Erklärung, welche Exploits in Frage stehen und was gegen sie unternommen wird here.

This guy spricht über die Suche nach einer Funktion namens IsDangerousString nach dem Graben mit Reflektor, aber ich bin nicht in der Lage, diese Funktion zu finden, um es zu verwenden. Er bezieht sich auch auf .NET 1.1 und ich arbeite mit .NET 3.5

+0

Interessante Frage, aber ich sehe keinen Grund, warum Sie solche unverständliche Zeichen umfassen würde. Ich würde wahrscheinlich die RandomNumberGenerator-Klasse verwenden, um ein Byte [] zu füllen und dann einen Z-Base32-Encoder zu verwenden, um die Bytes zu einer Zeichenfolge zu codieren. – Shelakel

+2

Sie wissen, die "Exploit" -Charakter, den Sie wollen, warum nicht Html Kodieren Sie sie vor dem Post und dann html dekodieren sie zurück – HatSoft

+0

@Shelakel Sicher gibt es viele andere Möglichkeiten, zufällige Passwörter zu generieren. Leider müssen wir jedoch alle 4 der 4 Zeichen (Kleinbuchstaben, Großbuchstaben, Zahlen, Sonderzeichen) mit Passwörtern für dieses Projekt erfüllen. Natürlich könnte ich nur die anstößigen "obskuren" Zeichen entfernen, aber da die Spezifikation nicht sehr klar ist, möchte ich die gleiche Funktion verwenden, die das System überprüfen soll. – Mercurybullet

Antwort

5

Die ASP.NET-Klasse, die Anforderungen überprüft, ist System.Web.CrossSiteScriptingValidation, und die gewünschte Methode ist IsDangerousString. Leider sind beide mit internal gekennzeichnet, sodass Sie nicht direkt darauf zugreifen können. Sie haben mehrere Möglichkeiten:

Option 1: Rufen Sie über Reflection IsDangerousString an. Microsoft könnte jedoch die Methode jederzeit ändern, wodurch Ihre Anwendung beschädigt wird.

Option 2: Dekompilieren Sie IsDangerousString und kopieren Sie es in Ihre eigene Anwendung. Siehe den folgenden Code.

Option 3: Anruf Membership.GeneratePassword. Dies gibt ein Kennwort zurück, das die Anforderungsüberprüfung garantiert bestanden hat.

Auszüge aus dem ASP.NET CrossSiteScriptingValidation Klasse (über .NET Reflector):

private static char[] startingChars = new char[] { '<', '&' }; 

internal static bool IsDangerousString(string s, out int matchIndex) 
{ 
    matchIndex = 0; 
    int startIndex = 0; 
    while (true) 
    { 
     int num2 = s.IndexOfAny(startingChars, startIndex); 
     if (num2 < 0) 
     { 
      return false; 
     } 
     if (num2 == (s.Length - 1)) 
     { 
      return false; 
     } 
     matchIndex = num2; 
     char ch = s[num2]; 
     if (ch != '&') 
     { 
      if ((ch == '<') && ((IsAtoZ(s[num2 + 1]) || (s[num2 + 1] == '!')) || ((s[num2 + 1] == '/') || (s[num2 + 1] == '?')))) 
      { 
       return true; 
      } 
     } 
     else if (s[num2 + 1] == '#') 
     { 
      return true; 
     } 
     startIndex = num2 + 1; 
    } 
} 

private static bool IsAtoZ(char c) 
{ 
    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))); 
} 
+3

Danke für die Info.Da die Funktion intern ist und ich nicht direkt auf Updates zugreifen kann, gibt es einen Grund, die folgende Regex nicht zu verwenden (mit ignoreCase)? '\ <[a-z! /?] | & #' – Mercurybullet

+0

Die Regex ist äquivalent zu Option 2, nur viel prägnanter. :-) Dies ist wahrscheinlich das Beste, was Sie für jetzt tun können. In der nächsten Version von ASP.NET können Sie jedoch die Validierung für bestimmte Felder überspringen, indem Sie [HttpRequest.Unvalidated] (http://msdn.microsoft.com/de-de/library/system.web) verwenden .httprequest.unvalidated (v = VS.110) .aspx) -Eigenschaft. –

Verwandte Themen