1590 Stimmen

Ein potenziell gefährlicher Request.Form-Wert wurde vom Client erkannt

Jedes Mal, wenn ein Nutzer einen Beitrag mit < ou > in einer Seite in meiner Webanwendung, bekomme ich diese Ausnahme ausgelöst.

Ich möchte nicht in die Diskussion über die Klugheit des Auslösens einer Ausnahme oder des Absturzes einer gesamten Webanwendung gehen, weil jemand ein Zeichen in ein Textfeld eingegeben hat, aber ich suche nach einer eleganten Möglichkeit, dies zu behandeln.

Abfangen der Ausnahme und Anzeigen

Es ist ein Fehler aufgetreten. Bitte gehen Sie zurück und geben Sie das gesamte Formular noch einmal ein, aber verwenden Sie dieses Mal bitte nicht <

scheint mir nicht professionell genug zu sein.

Deaktivieren der Nachvalidierung ( validateRequest="false" ) wird dieser Fehler definitiv vermieden, aber die Seite ist dadurch anfällig für eine Reihe von Angriffen.

Idealerweise: Wenn eine Rückmeldung erfolgt, die in HTML eingeschränkte Zeichen enthält, wird der gepostete Wert in der Formularsammlung automatisch HTML-kodiert. So wird der .Text Eigenschaft meines Textfeldes wird sein something & lt; html & gt;

Gibt es eine Möglichkeit, wie ich dies von einem Handler aus tun kann?

76 Stimmen

Beachten Sie, dass dieser Fehler auch auftreten kann, wenn Sie HTML-Entitätsnamen (&) oder Entitätsnummern (') in Ihrer Eingabe haben.

32 Stimmen

Nun, da es meine Frage ist, glaube ich, dass ich definieren kann, worum es eigentlich geht: einen ganzen Anwendungsprozess zum Absturz zu bringen und eine allgemeine Fehlermeldung auszugeben, weil jemand ein "<" eingegeben hat, ist übertrieben. Vor allem, weil man weiß, dass die meisten Leute einfach 'validateRequest=false' eingeben werden, um es loszuwerden, und damit die Schwachstelle wieder aufreißen

10 Stimmen

@DrewNoakes: Entitätsnamen (&) scheinen nach meinen Tests (getestet in .Net 4.0) kein Problem zu sein, obwohl Entitätsnummern (') die Validierung nicht bestehen (wie Sie sagten). Wenn Sie die Methode System.Web.CrossSiteScriptingValidation.IsDangerousString mit dem .Net Reflector zerlegen, werden Sie sehen, dass der Code speziell nach html-Tags (beginnend mit <) und Entity-Nummern (beginnend mit &#) sucht

43voto

A.Dara Punkte 784

Bei MVC ignorieren Sie die Eingabevalidierung, indem Sie

[ValidateInput(false)]

über jeder Aktion im Controller.

0 Stimmen

Dies scheint nicht zu funktionieren, wenn die Methode des Controllers über eine konfigurierte Route erreicht wird.

0 Stimmen

Die technische Erklärung ist, dass dies nur funktioniert, wenn das beanstandete Zeichen in der "Abfragezeichenfolge" enthalten ist... wenn es im Anforderungspfad enthalten ist, Validierungsattribut nicht Arbeit

36voto

Bitte beachten Sie, dass einige .NET-Steuerelemente die Ausgabe automatisch HTML-kodieren. Wenn Sie zum Beispiel die Eigenschaft .Text auf einem TextBox-Steuerelement setzen, wird es automatisch kodiert. Das bedeutet konkret die Konvertierung von < in &lt; , > in &gt; y & in &amp; . Seien Sie also vorsichtig, wenn Sie das tun...

myTextBox.Text = Server.HtmlEncode(myStringFromDatabase); // Pseudo code

Die .Text-Eigenschaft für HyperLink, Literal und Label kodiert jedoch nicht in HTML, so dass Sie alles, was in diesen Eigenschaften festgelegt wird, mit Server.HtmlEncode(); umschließen müssen, wenn Sie verhindern wollen, dass <script> window.location = "http://www.google.com"; </script> vor der Ausgabe auf Ihrer Seite und der anschließenden Ausführung.

Experimentieren Sie ein wenig, um zu sehen, was kodiert wird und was nicht.

30voto

Mahdi jokar Punkte 1237

Fügen Sie in der Datei web.config innerhalb der Tags das Element httpRuntime mit dem Attribut requestValidationMode="2.0" ein. Fügen Sie außerdem das Attribut validateRequest="false" in das Element pages ein.

Beispiel:

<configuration>
  <system.web>
   <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>

1 Stimmen

Für mich war validateRequest="false" nicht notwendig, nur requestValidationMode="2.0"

3 Stimmen

Der Abschnitt "Seiten" muss sich innerhalb des Abschnitts "system.web" befinden.

0 Stimmen

Eine gefährliche Antwort, wieder einmal.

25voto

Wenn Sie ValidateRequest nicht deaktivieren wollen, müssen Sie eine JavaScript-Funktion implementieren, um die Ausnahme zu vermeiden. Das ist nicht die beste Option, aber sie funktioniert.

function AlphanumericValidation(evt)
{
    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode :
        ((evt.which) ? evt.which : 0));

    // User type Enter key
    if (charCode == 13)
    {
        // Do something, set controls focus or do anything
        return false;
    }

    // User can not type non alphanumeric characters
    if ( (charCode <  48)                     ||
         (charCode > 122)                     ||
         ((charCode > 57) && (charCode < 65)) ||
         ((charCode > 90) && (charCode < 97))
       )
    {
        // Show a message or do something
        return false;
    }
}

Fügen Sie dann im nachfolgenden Code beim PageLoad-Ereignis das Attribut zu Ihrem Steuerelement mit dem folgenden Code hinzu:

Me.TextBox1.Attributes.Add("OnKeyPress", "return AlphanumericValidation(event);")

5 Stimmen

Dadurch bleibt die Anwendung weiterhin anfällig für gefälschte POST-Anfragen. Ein normaler Benutzer wird Probleme haben, Zeichen wie , : oder Anführungszeichen einzugeben, aber ein normaler Hacker wird keine Probleme haben, missgestaltete Daten an den Server zu POSTen. Ich würde das sehr weit herunterfahren.

15 Stimmen

@Radu094: Diese Lösung erlaubt es Ihnen, ValidateRequest=true beizubehalten, was bedeutet, dass Hacker immer noch auf diese Mauer treffen werden. Stimmen Sie für UP, da dies Sie weniger verwundbar macht als das Ausschalten von ValidateRequest.

22voto

Sel Punkte 1834

Eine andere Lösung ist:

protected void Application_Start()
{
    ...
    RequestValidator.Current = new MyRequestValidator();
}

public class MyRequestValidator: RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        bool result = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);

        if (!result)
        {
            // Write your validation here
            if (requestValidationSource == RequestValidationSource.Form ||
                requestValidationSource == RequestValidationSource.QueryString)

                return true; // Suppress error message
        }
        return result;
    }
}

0 Stimmen

Toll! Mir war nicht bewusst, dass man den Request Validator ersetzen kann. Anstatt einfach "ok" zu sagen, wie Sie es tun, habe ich diese Idee erweitert, um Felder, deren Name auf "_NoValidation" endet, nicht zu validieren. Code unten.

0 Stimmen

Walden Leverich, siehe dazu [AllowHtml]-Attribut

0 Stimmen

Sel, ja in einer MVC-Umgebung, die funktionieren würde. Aber in einer Webforms-Anwendung habe ich kein Modell, um das zu tun :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X