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


Jedes Mal, wenn ein Benutzer etwas veröffentlicht, das enthält < oder > Auf 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 ganzen Webanwendung einsteigen, weil jemand einen Charakter in eine Textbox eingegeben hat, aber ich suche nach einer eleganten Art, damit umzugehen.

Überfüllen der Ausnahme und Anzeigen

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

scheint mir nicht professionell genug zu sein.

Deaktivierung der Postvalidierung (validateRequest="false") wird diesen Fehler definitiv vermeiden, aber es wird die Seite anfällig für eine Reihe von Angriffen machen.

Idealerweise: Wenn ein Post-Back auftritt, der HTML-beschränkte Zeichen enthält, wird dieser Wert in der Form-Sammlung automatisch HTML-codiert. Also die .Text Eigenschaft meiner Textbox wird sein something & lt; html & gt;

Gibt es einen Weg, wie ich das von einem Hundeführer machen kann?


1324
2017-09-17 10:58


Ursprung


Antworten:


Ich denke, Sie greifen es aus dem falschen Winkel an, indem Sie versuchen, alle veröffentlichten Daten zu kodieren.

Beachten Sie, dass ein "<"könnte auch von anderen externen Quellen kommen, wie einem Datenbankfeld, einer Konfiguration, einer Datei, einem Feed und so weiter.

Außerdem, "<"Es ist nicht von Natur aus gefährlich. Es ist nur in einem bestimmten Kontext gefährlich: beim Schreiben von Strings, die nicht in HTML-Ausgabe codiert wurden (wegen XSS).

In anderen Kontexten sind verschiedene Teilzeichenfolgen gefährlich, wenn Sie beispielsweise eine von einem Benutzer bereitgestellte URL in eine Verknüpfung schreiben, die Teilzeichenfolge "javascript:"Das kann gefährlich sein. Das einfache Anführungszeichen andererseits ist gefährlich, wenn Zeichenfolgen in SQL-Abfragen interpoliert werden, aber vollkommen sicher, wenn es ein Teil eines Namens ist, der von einem Formular gesendet oder aus einem Datenbankfeld gelesen wird.

Die Quintessenz ist: Du kannst keine zufälligen Eingaben für gefährliche Charaktere filtern, da jeder Charakter unter den richtigen Umständen gefährlich sein kann. Sie sollten an dem Punkt kodieren, an dem bestimmte Zeichen gefährlich werden können, weil sie in eine andere Untersprache übergehen, in der sie eine besondere Bedeutung haben. Wenn Sie eine Zeichenfolge in HTML schreiben, sollten Sie Zeichen, die eine besondere Bedeutung in HTML haben, mit Server.HtmlEncode codieren. Wenn Sie eine Zeichenfolge an eine dynamische SQL-Anweisung übergeben, sollten Sie verschiedene Zeichen codieren (oder besser, lassen Sie das Framework dies für Sie tun, indem Sie vorbereitete Anweisungen oder ähnliches verwenden).

Wann Sie sind sicher, dass Sie HTML überall dort codieren, wo Sie Strings an HTML übergeben und dann setzen validateRequest="false" in dem <%@ Page ... %> Richtlinie in Ihrem .aspx Datei (en).

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


995
2017-09-17 11:26



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

C # -Probe:

[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

467
2017-10-08 22:56



In ASP.NET MVC (ab Version 3) können Sie die AllowHtml Attribut zu einer Eigenschaft in Ihrem Modell.

Es ermöglicht einer Anforderung, HTML-Markup während der Modellbindung einzufügen, indem die Anforderungsüberprüfung für die Eigenschaft übersprungen wird.

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

361
2017-09-05 09:33



Wenn Sie auf .NET 4.0 sind, stellen Sie sicher, dass Sie dies in Ihrem hinzufügen web.config Datei in der <system.web> Stichworte:

<httpRuntime requestValidationMode="2.0" />

In .NET 2.0 wurde die Anforderungsüberprüfung nur für aspx Anfragen. In .NET 4.0 wurde dieses erweitert alle Anfragen. Sie können zu zurückkehren nur Durchführung der XSS-Validierung bei der Verarbeitung .aspx durch Angabe von:

requestValidationMode="2.0"

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

validateRequest="false"

202
2017-07-30 04:51



Für ASP.NET 4.0 können Sie Markup als Eingabe für bestimmte Seiten anstelle der gesamten Site zulassen, indem Sie sie alle in a einfügen <location> Element. Dadurch wird sichergestellt, dass alle anderen Seiten sicher sind. Sie müssen nicht setzen 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 kontrollieren, da Sie auf Seitenebene sehen können, welche Seiten Markup als Eingabe zulassen.

Sie müssen die Eingabe auf Seiten, auf denen die Anforderungsüberprüfung deaktiviert ist, weiterhin programmgesteuert überprüfen.


102
2017-11-27 17:22



Die vorherigen Antworten sind großartig, aber niemand hat gesagt, wie man ein einzelnes Feld von der Validierung für HTML / JavaScript-Injektionen ausschließen kann. Ich weiß nichts ü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)
{
    ...
}

Dies validiert immer noch alle Felder außer dem ausgeschlossenen. Das Schöne daran ist, dass Ihre Validierungsattribute das Feld immer noch validieren, aber Sie erhalten einfach nicht die "Eine potentiell gefährliche Request.Form Wert wurde von den Client erkannt" Ausnahmen.

Ich habe dies für die 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 überprüft, ob er gültig ist oder nicht, aber nicht, wenn er Skripte oder HTML enthält.


68
2017-11-06 14:58



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>

und

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

46
2017-11-30 12:56



Sie können HTML-Codierung Textfeld-Inhalt, aber das wird leider nicht verhindern, dass die Ausnahme passiert. Nach meiner Erfahrung gibt es keinen Weg, und Sie müssen die Seitenvalidierung deaktivieren. Damit sagst du: "Ich werde vorsichtig sein, das verspreche ich."


45
2017-09-17 11:20



Bei MVC ignorieren Sie die Eingabeüberprüfung, indem Sie hinzufügen

[ValidateInput (false)]

über jeder Aktion im Controller.


42
2018-01-29 09:40



Sie können diesen Fehler in Global.asax abfangen. Ich möchte immer noch bestätigen, aber eine entsprechende Nachricht anzeigen. Auf dem unten aufgelisteten Blog war ein solches Beispiel 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 Umleitung auf eine andere Seite scheint ebenfalls eine vernünftige Antwort auf die Ausnahme zu sein.

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


41
2017-10-13 22:37



Beachten Sie, dass einige .NET-Steuerelemente die Ausgabe automatisch mit HTML codieren. Wenn Sie beispielsweise die Eigenschaft .Text für ein TextBox-Steuerelement festlegen, wird es automatisch codiert. Das heißt konkret konvertieren <in &lt;, >in &gt; und &in &amp;. Sei also vorsichtig damit ...

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

Die Eigenschaft .Text für HyperLink, Literal und Label wird jedoch keine HTML-codierten Objekte enthalten, daher muss das Umbrechen von Server.HtmlEncode (); Um alles, was auf diesen Eigenschaften gesetzt wird, ist ein Muss, wenn Sie verhindern wollen <script> window.location = "http://www.google.com"; </script> in Ihre Seite ausgegeben und anschließend ausgeführt werden.

Machen Sie ein wenig experimentieren, um zu sehen, was codiert wird und was nicht.


33
2017-09-17 14:40