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

1146voto

JacquesB Punkte 40790

Ich denke, Sie gehen das Problem von der falschen Seite an, indem Sie versuchen, alle veröffentlichten Daten zu verschlüsseln.

Beachten Sie, dass ein " < "Die Informationen können auch aus anderen Quellen stammen, z. B. aus einem Datenbankfeld, einer Konfiguration, einer Datei, einem Feed usw.

Außerdem: " < " ist nicht per se gefährlich. Es ist nur in einem bestimmten Kontext gefährlich: beim Schreiben von Zeichenketten, die nicht für die HTML-Ausgabe kodiert wurden (wegen XSS).

In anderen Kontexten sind verschiedene Teilstrings gefährlich, z. B. wenn Sie eine vom Benutzer bereitgestellte URL in einen Link schreiben, ist der Teilstring " javascript: " kann gefährlich sein. Das einfache Anführungszeichen hingegen ist gefährlich, wenn es um die Interpolation von Zeichenketten in SQL-Abfragen geht, aber völlig ungefährlich, wenn es Teil eines Namens ist, der in einem Formular eingegeben oder aus einem Datenbankfeld gelesen wird.

Die Quintessenz ist: Sie können die zufällige Eingabe nicht nach gefährlichen Zeichen filtern, denn jedes Zeichen kann unter den richtigen Umständen gefährlich sein. Sie sollten an dem Punkt kodieren, an dem bestimmte Zeichen gefährlich werden können, weil sie in eine andere Untersprache übergehen, wo sie eine besondere Bedeutung haben. Wenn Sie eine Zeichenfolge in HTML schreiben, sollten Sie Zeichen, die in HTML eine besondere Bedeutung haben, mit Server.HtmlEncode kodieren. Wenn Sie eine Zeichenkette an eine dynamische SQL-Anweisung übergeben, sollten Sie verschiedene Zeichen kodieren (oder besser, das Framework dies für Sie tun lassen, indem Sie vorbereitete Anweisungen oder ähnliches verwenden).

Wenn Sie sicher sind, dass Sie überall, wo Sie Zeichenketten an HTML übergeben, HTML-kodieren, dann setzen Sie ValidateRequest="false" において <%@ Page ... %> Richtlinie in Ihrem .aspx Datei(en).

In .NET 4 müssen Sie möglicherweise ein wenig mehr tun. Manchmal ist es notwendig, auch <httpRuntime requestValidationMode="2.0" /> zu web.config ( Referenz ).

0 Stimmen

@Hightechrider danke für den Link. Die einfache Einstellung validateRequest="false" funktioniert nicht für einen View in ASP.Net MVC @olavk - Nett. Joel hat sich die Zeit genommen, Ihre Antwort zu kommentieren.

80 Stimmen

Für alle, die zu spät kommen: validateRequest="false" gehört in die Page-Direktive (erste Zeile der .aspx-Datei)

63 Stimmen

Tipp: Setzen Sie <httpRuntime requestValidationMode="2.0" /> in einem Location-Tag, um zu vermeiden, dass der nützliche Schutz, den die Validierung bietet, für den Rest Ihrer Website verloren geht.

534voto

Zack Peterson Punkte 54531

Es gibt eine andere Lösung für diesen Fehler, wenn Sie ASP.NET MVC verwenden:

C#-Beispiel:

[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
    // ...
}

Visual Basic-Beispiel:

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
    ...
End Function

0 Stimmen

Das Problem kann auftreten, wenn es nur auf einer Seite der gesamten Anwendung benötigt wird

3 Stimmen

Sie können auch das Attribut [ValidateInput(false)] auf Klassenebene hinzufügen. Wenn Sie es zu Ihrer Basis-Controllerklasse hinzufügen, gilt es für alle Controller-Methodenaktionen.

0 Stimmen

@Zack Danke für die Lösung. Auf der anderen Seite frage ich mich, ob [AllowHtml] ist besser als ValidateInput(false) denn [AllowHtml] einmal für eine Eigenschaft, d.h. ein Editor-Feld, definiert wird und wenn es verwendet wird, ist es nicht notwendig, es für mehrere Aktionen zu verwenden. Was schlagen Sie vor?

443voto

Anthony Johnston Punkte 9129

In ASP.NET MVC (beginnend mit Version 3) können Sie die AllowHtml Attribut auf eine Eigenschaft Ihres Modells.

Sie ermöglicht es einer Anfrage, HTML-Markup während der Modellbindung einzuschließen, indem die Anfragevalidierung für die Eigenschaft übersprungen wird.

[AllowHtml]
public string Description { get; set; }

14 Stimmen

Es ist viel besser, dies deklarativ zu tun als im Controller!

0 Stimmen

Ist diese Funktion in MVC 4 verschwunden?

0 Stimmen

Es scheint nur in DotNet 4.0 Framework zu sein. msdn.microsoft.com/de-us/library/ Was tun?

224voto

JordanC Punkte 4249

Wenn Sie mit .NET 4.0 arbeiten, fügen Sie dies in Ihrem web.config Datei innerhalb der <system.web> Tags:

<httpRuntime requestValidationMode="2.0" />

In .NET 2.0 galt die Anforderungsvalidierung nur für aspx Anfragen. In .NET 4.0 wurde dies um folgende Punkte erweitert 何れも Anfragen. Sie können zurückkehren zu sólo Durchführung einer XSS-Validierung bei der Verarbeitung .aspx durch Angabe:

requestValidationMode="2.0"

Sie können die Validierung von Anfragen deaktivieren vollständig durch Angabe:

validateRequest="false"

31 Stimmen

Im Inneren der <system.web> Tags.

9 Stimmen

Ich habe dies in der web.config, aber immer noch auf den Fehler "Ein potenziell gefährlicher Wert Request.Form "

21 Stimmen

Es sieht so aus, als ob <httpRuntime requestValidationMode="2.0" /> nur funktioniert, wenn das Framework 2.0 auf dem Rechner installiert ist. Was ist, wenn das Framework 2.0 überhaupt nicht installiert ist, sondern nur das Framework 4.0 installiert ist?

122voto

Carter Medlin Punkte 11077

Bei ASP.NET 4.0 können Sie Markup als Eingabe für bestimmte Seiten statt für die gesamte Website zulassen, indem Sie alles in eine <location> Element. Dadurch wird sichergestellt, dass alle Ihre anderen Seiten sicher sind. Sie müssen NICHT das Element ValidateRequest="false" in Ihrer .aspx-Seite.

<configuration>
...
  <location path="MyFolder/.aspx">
    <system.web>
      <pages validateRequest="false" />
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
...
</configuration>

Es ist sicherer, dies in Ihrer web.config zu steuern, da Sie auf Site-Ebene sehen können, welche Seiten Markup als Eingabe zulassen.

Sie müssen die Eingaben auf Seiten, auf denen die Anforderungsüberprüfung deaktiviert ist, immer noch programmatisch validieren.

0 Stimmen

Weitere Informationen zu requestValidationMode=2|4 finden Sie hier: msdn.microsoft.com/de-us/library/

0 Stimmen

Leider wird dies nicht mit ASP.net 2.0 funktionieren, wie es ist. Entfernen Sie die httpRuntime Zeile und es wird funktionieren.

0 Stimmen

Ich habe eine Warnung hinzugefügt, die die Benutzer daran erinnert, Eingaben manuell zu überprüfen, wenn die Überprüfung deaktiviert ist.

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