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

75voto

gligoran Punkte 3077

Die vorherigen Antworten sind großartig, aber niemand hat gesagt, wie man ein einzelnes Feld von der Überprüfung auf HTML/JavaScript-Injektionen ausschließen kann. Ich weiß nicht, über frühere Versionen, aber in MVC3 Beta können Sie dies tun:

[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
    ...
}

Dadurch werden immer noch alle Felder außer dem ausgeschlossenen validiert. Das Schöne daran ist, dass Ihre Validierungsattribute das Feld immer noch validieren, aber Sie erhalten einfach nicht die Ausnahmen "Ein potenziell gefährlicher Request.Form-Wert wurde vom Client erkannt".

Ich habe dies zur Validierung eines regulären Ausdrucks verwendet. Ich habe mein eigenes ValidationAttribute erstellt, um zu sehen, ob der reguläre Ausdruck gültig ist oder nicht. Da reguläre Ausdrücke etwas enthalten können, das wie ein Skript aussieht, habe ich den obigen Code angewendet - der reguläre Ausdruck wird immer noch daraufhin überprüft, ob er gültig ist oder nicht, aber nicht darauf, ob er Skripte oder HTML enthält.

11 Stimmen

Leider sieht es so aus, dass die Exclude-Funktion aus MVC 3 RTW entfernt wurde :(

3 Stimmen

Sie wurde auch nicht in MVC 4 aufgenommen.

10 Stimmen

使用方法 [AllowHtml] auf die Eigenschaften des Modells anstelle von [ValidateInput] auf die Aktion, um das gleiche Ergebnis zu erzielen.

55voto

ranthonissen Punkte 1435

In ASP.NET MVC müssen Sie requestValidationMode="2.0" und validateRequest="false" in web.config festlegen und ein ValidateInput-Attribut auf Ihre Controller-Aktion anwenden:

<httpRuntime requestValidationMode="2.0"/>

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

y

[Post, ValidateInput(false)]
public ActionResult Edit(string message) {
    ...
}

3 Stimmen

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

0 Stimmen

RequestValidationMode="2.0" erzeugt immer noch den Fehler mit HTML-kodierten Daten. Keine Lösung, außer alles mit base64 zu kodieren und es dann zu senden.

51voto

Pavel Chuchuva Punkte 21957

Sie können HTML kodieren Inhalt des Textfeldes, aber leider verhindert das nicht, dass die Ausnahme auftritt. Meiner Erfahrung nach gibt es keinen Ausweg, und Sie müssen die Seitenvalidierung deaktivieren. Damit sagen Sie: "Ich bin vorsichtig, ich verspreche es."

50voto

flakomalo Punkte 690

Die Antwort auf diese Frage ist einfach:

var varname = Request.Unvalidated["parameter_name"];

Dadurch wird die Validierung für die jeweilige Anfrage deaktiviert.

1 Stimmen

Gilt nur für ASP.NET 4.5 (und vermutlich alles, was danach kommt). Vor 4.5 wird dies nicht unterstützt.

3 Stimmen

Ich wünschte, ich könnte diesen Weg nach oben stoßen. Ich bin mit .NET 4.5 und das ist genau das, was ich brauchte, da ich nicht mit MVC und ich kann nicht die web.config ändern.

1 Stimmen

Ja, aber was ist, wenn Sie .Net 2 verwenden? Einige von uns haben keine Wahl

46voto

BenMaddox Punkte 1740

Sie können diesen Fehler in Global.asax abfangen. Ich möchte trotzdem validieren, aber eine entsprechende Meldung anzeigen. Auf dem unten aufgeführten Blog war ein Beispiel wie dieses verfügbar.

    void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();

        if (ex is HttpRequestValidationException)
        {
            Response.Clear();
            Response.StatusCode = 200;
            Response.Write(@"[html]");
            Response.End();
        }
    }

Die Weiterleitung auf eine andere Seite scheint auch eine angemessene Reaktion auf die Ausnahme zu sein.

http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html

0 Stimmen

Diese Seite scheint sich zu bewegen romsteady.blogspot.com/2007/06/

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