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

12voto

vakeel Punkte 272

Ursache

ASP.NET prüft standardmäßig alle Eingabefelder auf potenziell unsichere Inhalte, die zu Cross-Site-Scripting (XSS) und SQL-Einschleusungen . Daher werden solche Inhalte nicht zugelassen, indem die oben genannte Ausnahme ausgelöst wird. Standardmäßig wird empfohlen, diese Prüfung bei jedem Postback zuzulassen.

Lösung

In vielen Fällen müssen Sie HTML-Inhalte über Rich TextBoxen oder Rich Text Editors an Ihre Seite übermitteln. In diesem Fall können Sie diese Ausnahme vermeiden, indem Sie das ValidateRequest-Tag in der @Page Richtlinie auf false.

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest = "false" %>

Dadurch wird die Validierung von Anfragen für die Seite deaktiviert, für die Sie das ValidateRequest-Flag auf false gesetzt haben. Wenn Sie dies deaktivieren möchten, überprüfen Sie Ihre gesamte Webanwendung; Sie müssen es in Ihrer web.config <system.web> auf false setzen

<pages validateRequest ="false" />

Bei .NET 4.0 oder höheren Frameworks müssen Sie außerdem die folgende Zeile in den <system.web>-Abschnitt einfügen, damit das oben genannte funktioniert.

<httpRuntime requestValidationMode = "2.0" />

Das war's. Ich hoffe, dass dies Ihnen hilft, das oben genannte Problem zu lösen.

Referenz von: ASP.Net-Fehler: Ein potenziell gefährlicher Request.Form-Wert wurde vom Client erkannt

10voto

magritte Punkte 7078

Die anderen Lösungen hier sind schön, aber es ist ein bisschen wie ein königlicher Schmerz in den Rücken zu haben, um [AllowHtml] zu jedem einzelnen Modell Eigenschaft anwenden, vor allem, wenn Sie über 100 Modelle auf einer anständigen Größe Website haben.

Wenn Sie wie ich diese (IMHO ziemlich sinnlose) Funktion standortweit ausschalten möchten, können Sie die Execute()-Methode in Ihrem Basis-Controller überschreiben (wenn Sie nicht bereits einen Basis-Controller haben, empfehle ich Ihnen, einen zu erstellen, da sie für die Anwendung allgemeiner Funktionen ziemlich nützlich sein können).

    protected override void Execute(RequestContext requestContext)
    {
        // Disable requestion validation (security) across the whole site
        ValidateRequest = false;
        base.Execute(requestContext);
    }

Stellen Sie einfach sicher, dass Sie HTML-Codierung alles, was gepumpt wird, um die Ansichten, die von Benutzereingaben kam (es ist Standardverhalten in ASP.NET MVC 3 mit Razor sowieso, so dass, es sei denn, aus irgendeinem bizarren Grund sind Sie mit Html.Raw() sollten Sie nicht diese Funktion benötigen.

10voto

woany Punkte 1199

Deaktivieren Sie die Seitenvalidierung, wenn Sie die Sonderzeichen wirklich benötigen, > , , < , usw. Stellen Sie dann sicher, dass die Daten bei der Anzeige der Benutzereingaben HTML-kodiert sind.

Es gibt eine Sicherheitslücke bei der Seitenvalidierung, so dass sie umgangen werden kann. Auch sollte man sich nicht ausschließlich auf die Seitenvalidierung verlassen.

Siehe: http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf

0 Stimmen

Der Link ist defekt.

9voto

Leniel Maccaferri Punkte 96851

Ich habe diesen Fehler auch erhalten.

In meinem Fall hat ein Benutzer ein Zeichen mit Akzent eingegeben á in einem Rollennamen (in Bezug auf den ASP.NET-Mitgliedschaftsanbieter).

Ich übergebe den Rollennamen an eine Methode, um Benutzern diese Rolle zu gewähren, und die $.ajax Post-Anfrage ist kläglich gescheitert...

Ich habe dies getan, um das Problem zu lösen:

Anstelle von

data: { roleName: '@Model.RoleName', users: users }

Tun Sie dies

data: { roleName: '@Html.Raw(@Model.RoleName)', users: users }

@Html.Raw hat den Zweck erfüllt.

Ich habe den Rollennamen als HTML-Wert erhalten roleName="Cadastro b&#225;s" . Dieser Wert mit HTML-Entität &#225; wurde von ASP.NET MVC blockiert. Jetzt bekomme ich die roleName Parameterwert so, wie er sein sollte: roleName="Cadastro Básico" und die ASP.NET MVC-Engine wird die Anfrage nicht mehr blockieren.

9voto

Trisped Punkte 5458

Sie können auch die JavaScript-Funktion escape(zeichenkette) Funktion, um die Sonderzeichen zu ersetzen. Dann Server-Seite verwenden Server. URLDecode(string) um sie zurückzuschalten.

Auf diese Weise müssen Sie die Eingabevalidierung nicht ausschalten und es wird für andere Programmierer deutlicher, dass die Zeichenkette HTML-Inhalt haben kann.

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