Ein potenziell gefährlicher Request.Form-Wert wurde vom Client erkannt
Jedes mal, wenn ein Benutzer Beiträge etwas mit <
oder >
auf einer Seite in meinem web-Anwendung, bekomme ich diese exception geworfen.
Ich will nicht zu gehen in die Diskussion über die Schlauheit eine Ausnahme zu werfen oder Absturz eines gesamten web-Anwendung, denn jemand betrat ein Zeichen in ein Textfeld, aber ich bin auf der Suche nach einem eleganten Weg, dies zu behandeln.
Abfangen der Ausnahme und zeigt
Ist ein Fehler aufgetreten, bitte gehen Sie zurück und re-geben Sie Ihre ganze form wieder, aber dieses mal bitte nicht verwenden <
nicht scheinen professionelle genug für mich.
Deaktivieren von post-Validierung (validateRequest="false"
) wird man auf jeden Fall vermeiden dieser Fehler, aber er wird die Seite verlassen, anfällig für eine Reihe von Angriffen.
Ideal: Wenn ein post-back-Auftritt mit HTML-eingeschränkte Zeichen, dass gesendete Wert in das Formular-Sammlung wird automatisch HTML kodiert.
Also die .Text
Eigentum meines text-box wird something & lt; html & gt;
Gibt es eine Möglichkeit, kann ich dies tun, die von einem handler?
InformationsquelleAutor der Frage Radu094 | 2008-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie greifen es aus dem falschen Winkel, indem Sie versuchen zu codieren, alle veröffentlichten Daten.
Beachten Sie, dass eine "
<
" könnte auch aus anderen externen Quellen, wie einer Datenbank-Feld, Konfiguration, Datei, füttern und so weiter.Darüber hinaus "
<
" ist nicht grundsätzlich gefährlich. Es ist nur dann gefährlich, in einem bestimmten Kontext: beim schreiben von Zeichenfolgen, die nicht codiert, um die HTML-Ausgabe (wegen XSS).In anderen Kontexten unterschiedliche sub-strings sind gefährlich, zum Beispiel, wenn Sie schreiben, eine vom Benutzer bereitgestellte URL in einen link, der sub-string "
javascript:
", kann gefährlich sein. Das einfache Anführungszeichen, auf der anderen Seite gefährlich ist, wenn die Interpolation von strings in SQL-Abfragen, aber perfekt sicher, wenn es ist ein Teil von einem Namen eingereicht, die von einem Formular oder aus einer Datenbank ausgelesen Feld.Die Quintessenz ist: Sie können nicht filtern oder zufällige Eingaben für gefährliche Charaktere, weil jeder Charakter kann gefährlich sein, unter den richtigen Umständen. Du encodieren solltest, an dem Punkt, wo einige bestimmte Zeichen können gefährlich werden, weil Sie das Kreuz in ein anderes sub-Sprache, wo Sie eine Besondere Bedeutung haben. Wenn Sie schreiben, einen string zu HTML haben, sollten Sie Zeichen Kodieren, die eine Besondere Bedeutung in HTML, Verwendung von Server.HtmlEncode. Wenn Sie eine Zeichenfolge übergeben, um eine dynamische SQL-Anweisung, sollten Sie codieren verschiedene Charaktere (oder besser, lassen Sie den Rahmen, der es für Sie tun durch die Verwendung von prepared statements oder ähnliches)..
Wenn Sie sicher sind, dass Sie HTML-codieren überall übergeben Sie strings in HTML einstellen und dann
validateRequest="false"
im<%@ Page ... %>
Richtlinie in Ihrer.aspx
Datei(en).In .NETZ 4-Sie müssen möglicherweise ein wenig mehr zu tun. Manchmal ist es notwendig, auch hinzufügen
<httpRuntime requestValidationMode="2.0" />
web.config (Referenz).InformationsquelleAutor der Antwort JacquesB
Gibt ' s eine andere Lösung um diesen Fehler wenn Sie ASP.NET MVC:
C# - Beispiel:
Visual Basic-Beispiel:
InformationsquelleAutor der Antwort Zack Peterson
In ASP.NET MVC (ab version 3), Sie können hinzufügen die
AllowHtml
- Attribut an eine Eigenschaft Ihres Modells.Ermöglicht es eine Anfrage, um HTML-markup während der Modell-Bindung durch überspringen Validierung Anforderung für die Eigenschaft.
InformationsquelleAutor der Antwort Anthony Johnston
Wenn Sie auf .NET 4.0 stellen Sie sicher, Sie fügen Sie diese in Ihre web.config Datei im
<system.web>
tags:In .NET 2.0, Validierung Anforderung nur angewendet
aspx
Anfragen. In .NET 4.0 wurde erweitert, um die alle Anfragen. Sie zurückgreifen können, um nur Durchführung von XSS-Validierung bei der Verarbeitung.aspx
durch die Angabe:Können Sie deaktivieren Sie die Anfrage überprüfen ganz durch die Angabe:
InformationsquelleAutor der Antwort JordanC
Für ASP.NET 4.0 können Sie Markups, die als Eingabe für bestimmte Seiten und nicht auf die gesamte Website, indem es alle in einem
<location>
element. Dies wird sicherstellen, dass alle anderen Seiten sind sicher. Sie NICHT brauchen, umValidateRequest="false"
in Ihr .aspx-Seite.Ist es sicherer, die dieses Steuerelement in Ihrem web.config, da kann man sehen, an einem Standort in der Ebene, welche Seiten Markups als Eingabe.
Sie noch brauchen, um programmgesteuert überprüfen der Eingaben auf den Seiten, wo die request-Validierung ist deaktiviert.
InformationsquelleAutor der Antwort Carter Medlin
Den vorherigen Antworten sind toll, aber niemand sagte so schließen Sie ein einzelnes Feld aus der Validierung für HTML/JavaScript-Injektionen. Ich weiß nicht, über die früheren Versionen, aber in MVC3-Beta können Sie dies tun:
Diese noch überprüft alle Felder mit Ausnahme der ausgeschlossenen. Die nette Sache über dieses ist, dass Ihre Validierung Attribute noch überprüfen das Feld, aber Sie einfach nicht bekommen, die "potenziell gefährlich Anfrage.Form-Wert wurde vom client erkannt" Ausnahmen.
Ich habe diese verwendet werden, für die überprüfung eines regulären Ausdrucks. Ich habe mir eine eigene ValidationAttribute, um zu sehen, ob der reguläre Ausdruck gültig ist oder nicht. Wie können reguläre Ausdrücke enthalten etwas, das aussieht wie ein Skript habe ich das obige code - der reguläre Ausdruck wird noch überprüft, ob es gültig ist oder nicht, aber nicht, wenn es enthält Skripte oder HTML.
InformationsquelleAutor der Antwort gligoran
In ASP.NET MVC müssen Sie requestValidationMode="2.0" und validateRequest="false" im web.config, und eine ValidateInput-Attribut, um Ihre controller-action:
und
InformationsquelleAutor der Antwort ranthonissen
Können Sie HTML-Kodieren Textfeld Inhalt, aber leider ist das aufhören nicht die Ausnahme zu verhindern. In meiner Erfahrung gibt es keinen Weg herum, und Sie haben zu deaktivieren, Seite Validierung. Dadurch, dass du sagst: "ich werde vorsichtig sein, ich verspreche es."
InformationsquelleAutor der Antwort Pavel Chuchuva
Für MVC, ignorieren-input-Validierung durch hinzufügen
oben jede Action im Controller.
InformationsquelleAutor der Antwort A.Dara
Erwischen Sie den Fehler in der Globalen.asax. Will ich noch überprüfen, aber zeigen Sie eine entsprechende Meldung. Auf dem blog unten aufgelistet, ein Beispiel wie diese vorhanden war.
Umleitung zu einer anderen Seite scheint auch, wie eine angemessene Reaktion auf die Ausnahme.
http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html
InformationsquelleAutor der Antwort BenMaddox
Bitte beachten Sie, dass einige .NET-Steuerelemente wird automatisch die HTML-Codierung der Ausgabe. Zum Beispiel, die Einstellung der .Text-Eigenschaft eines TextBox-Steuerelements wird automatisch Kodieren. Das bedeutet konkret die Umwandlung
<
in<
>
in>
und&
in&
. Also seien Sie vorsichtig, dies zu tun...Jedoch, die .Die Eigenschaft Text des HyperLink -, Druck-und Label nicht HTML codieren Dinge, so wickeln Server.HtmlEncode(); um alles, was festgelegt wird, die auf diese Eigenschaften ist ein muss, wenn Sie verhindern möchten, dass
<script> window.location = "http://www.google.com"; </script>
Ausgabe von in Ihre Seite ein und anschließend ausgeführt.Tun, ein wenig Experimentieren, um zu sehen, was codiert ist und was nicht.
InformationsquelleAutor der Antwort
Die Antwort auf diese Frage ist einfach:
Diese würde die überprüfung deaktivieren, für den besonderen Wunsch.
InformationsquelleAutor der Antwort flakomalo
Im web.config-Datei, in die tags, legen Sie die httpRuntime-element mit dem Attribut requestValidationMode="2.0". Fügen Sie auch die validateRequest="false" - Attribut im pages-element.
Beispiel:
InformationsquelleAutor der Antwort Mahdi jokar
Wenn Sie nicht möchten, deaktivieren ValidateRequest Sie implementieren müssen, um eine JavaScript-Funktion, um zu vermeiden, die Ausnahme. Es ist nicht die beste option, aber es funktioniert.
Dann in code-hinter, auf der PageLoad-Ereignis, fügen Sie das Attribut für das Steuerelement mit dem nächsten code:
InformationsquelleAutor der Antwort
Es scheint, hat niemand erwähnt die unten noch nicht, aber es behebt das Problem für mich. Und bevor jemand sagt: ja, es ist Visual Basic... igitt.
Ich weiß nicht, ob es irgendwelche Nachteile, aber für mich funktionierte dies erstaunlich.
InformationsquelleAutor der Antwort Piercy
Andere Lösung ist:
InformationsquelleAutor der Antwort Sel
In ASP.NET Sie können die Ausnahme abfangen und etwas dagegen tun, wie das anzeigen einer freundlichen Nachricht oder einer Umleitung zu einer anderen Seite... es besteht Außerdem die Möglichkeit, dass Sie verarbeiten kann die Validierung durch sich selbst...
Display freundliche Nachricht:
InformationsquelleAutor der Antwort Jaider
Ich denke, man könnte es in einem Modul, aber das lässt offen, einige Fragen; was, wenn Sie wollen speichern Sie die Eingabe für eine Datenbank? Plötzlich, weil Sie sparen Sie codierte Daten in der Datenbank, die Sie am Ende Vertrauen input von es die ist wahrscheinlich eine schlechte Idee. Idealerweise speichern Sie raw nicht-codierten Daten in der Datenbank und das codieren jedes mal.
Deaktivieren Sie den Schutz auf einer pro-Seite-Ebene und dann die Codierung jedes mal ist eine bessere option.
Anstatt Server.HtmlEncode Sie sollten sich auf die neuere, vollständigere Anti-XSS library von der Microsoft ACE-team.
InformationsquelleAutor der Antwort blowdart
Wenn Sie mit framework 4.0 dann den Eintrag in der web.config (<pages validateRequest="false" />)
Wenn Sie mit framework 4.5 dann wird der Eintrag in der web.config (requestValidationMode="2.0")
Wenn Sie möchten, für nur eine einzige Seite, In der Sie die aspx-Datei sollten Sie die erste Zeile wie diese :
wenn Sie bereits so etwas wie <%@ Page so nur noch den rest =>
EnableEventValidation="false"
%>Empfehle ich, es nicht zu tun.
InformationsquelleAutor der Antwort Durgesh Pandey
Den anderen Lösungen hier sind nett, aber es ist ein bisschen eine königliche Schmerz in der Rückseite zu bewerben [AllowHtml] zu jedem einzelnen Modell-Eigenschaft, vor allem, wenn Sie über 100 Modelle, die auf einer anständigen Website.
Wenn Sie wie ich, möchten Sie diese (IMHO ziemlich sinnlos) Funktion off-site-weit, Sie können das überschreiben der Execute () - Methode in Ihrer Basis-controller (wenn Sie nicht bereits über ein Basis-controller ich schlage vor, Sie machen ein, können Sie ziemlich nützlich für die Anwendung gemeinsamer Funktionalität).
Nur sicherstellen, dass Sie die HTML-Codierung alles abgepumpt, um die Ansichten, die kam von Benutzereingaben (es ist das default-Verhalten in ASP.NET MVC 3 mit Razor sowieso, also, es sei denn aus unerfindlichen Gründen sind Sie mit Html.Raw (), sollten Sie nicht benötigen diese Funktion.
InformationsquelleAutor der Antwort magritte
War ich immer diesen Fehler auch.
In meinem Fall, ein Benutzer eingegebenen Zeichen mit Akzent
á
in einer Rolle, die Namen (in Bezug auf die ASP.NET die Mitgliedschaft provider).Gebe ich den Namen der Rolle ein, um eine Methode zu gewähren Benutzer, die der Rolle und der
$.ajax
post-Anforderung scheiterte kläglich...Habe ich dieses problem zu lösen:
Statt
Tun
@Html.Raw
hat den trick.War ich immer der Rollenname als HTML-Wert
roleName="Cadastro bás"
. Dieser Wert mit HTML-entityá
wurde blockiert ASP.NET MVC. Jetzt bekomme ich dieroleName
parameter Wert, wie es sein sollte:roleName="Cadastro Básico"
und ASP.NET MVC-Motor wird nicht blockiert die Anfrage nicht mehr.InformationsquelleAutor der Antwort Leniel Macaferi
Ursache
ASP.NET standardmäßig überprüft alle Eingangs-Kontrollen für potenziell unsicheren Inhalt kann dazu führen, dass cross-site-scripting (XSS) und SQL-Injektionen. Damit es verbietet, solche Inhalte durch das werfen dieser Ausnahme. Standardmäßig ist es empfohlen, damit Sie diese überprüfen, um zu passieren, auf jedem postback.
Lösung
Bei vielen Gelegenheiten, die Sie benötigen, um HTML-Inhalt zu Ihrer Seite durch Rich-Textfelder oder Rich-Text-Editoren. In diesem Fall können Sie vermeiden, diese Ausnahme von der Einstellung der ValidateRequest tag in der
@Page
Direktive auf false.Dies deaktiviert die überprüfung der Anforderungen für die Seite, die Sie festgelegt haben, dass das ValidateRequest-flag auf "false". Wenn Sie deaktivieren möchten, Haken Sie während Ihrer web-Anwendung, müssen Sie ihn auf false setzen in Ihrer Website.config <system.web - > Abschnitt
Für .NET 4.0 oder höher-frameworks müssen Sie auch fügen Sie die folgende Zeile in den <system.web - > Kapitel, um die oben genannten arbeiten.
Das ist es. Ich hoffe, dies hilft Ihnen helfen, loszuwerden, das oben genannte Problem.
Referenz: ASP.Net Fehler: Ein möglicherweise gefährlicher Request.Form-Wert wurde vom client erkannt
InformationsquelleAutor der Antwort vakeel
Deaktivieren Sie die Seite Validierung, wenn Sie wirklich brauchen, die Sonderzeichen wie
>
,<
usw. Dann sicherstellen, wenn die Eingabe des Benutzers angezeigt, der die Daten in HTML codiert.Gibt es eine Sicherheitslücke auf der Seite mit Validierung, so kann es umgangen werden. Auch die Seite Validierung sollte nicht ausschließlich auf die Ergebnisse verlassen.
Finden Sie unter: http://www.procheckup.com/PDFs/bypassing-dot-NET-ValidateRequest.pdf
InformationsquelleAutor der Antwort woany
Konnte man auch mit JavaScript, escape(string) Funktion zum ersetzen der Sonderzeichen. Dann auf server-Seite mit Server.URLDecode(string) wechseln Sie zurück.
Diese Weise müssen Sie nicht zu deaktivieren, input-Validierung, und es wird klarer sein, um anderen Programmierern, die der string haben kann HTML-Inhalte.
InformationsquelleAutor der Antwort Trisped
Ich habe eine Lösung gefunden, die JavaScript verwendet, um die Daten zu codieren, die dekodiert werden .NET (und nicht jQuery).
Fügen Sie die folgende JavaScript-Funktion auf Ihrem Kopf.
Funktion boo() {
targetText = document.getElementById("HiddenField1");
Quelltext = document.getElementById("userbox");
targetText.Wert = escape(Quelltext.innerText);
}
In Ihrem textarea, onchange, dass Anrufe boo():
Schließlich, in .NET, verwenden
Ich bin mir bewusst, dass diese one-way - wenn Sie brauchen, zwei-Wege-Sie müssen kreativ werden, aber dies bietet eine Lösung, wenn Sie nicht Bearbeiten können die web -.config
Hier ist ein Beispiel, das ich (MC9000) kam mit und verwenden über jQuery:
Und das markup:
Diese funktioniert Super. Wenn ein hacker versucht, post per JavaScript umgehen, Sie Sie sehen nur die Fehler. Sie können speichern Sie alle diese Daten verschlüsselt in einer Datenbank als gut, dann unescape (auf der server-Seite), und parse & - Prüfung für Angriffe vor der Anzeige anderswo.
InformationsquelleAutor der Antwort Jason Shuler
Landete ich mit JavaScript vor jedem postback zu prüfen, für die Zeichen, die Sie nicht wollen, wie zum Beispiel:
Gewährt, meine Seite ist vor allem Daten-Eintrag, und es gibt sehr wenige Elemente, die postbacks, aber zumindest Ihre Daten erhalten.
InformationsquelleAutor der Antwort Ryan
Solange diese nur "<" und ">" (und nicht die Anführungszeichen selbst) Zeichen und Sie sind mit Ihnen in Zusammenhang, wie <input value="diese" /> bist du sicher (während für <textarea>diese eine</textarea> Sie wäre gefährdet natürlich). Das kann vereinfachen Ihre situation, aber für alles mehr verwenden Sie eine der anderen Lösungen gepostet.
InformationsquelleAutor der Antwort Paweł Hajdan
Wenn Sie einfach suchen, teilen Sie den Benutzern mit, dass < und > nicht ABER, wollen Sie nicht die gesamte form verarbeitet/zurück gebucht (und verlieren alle input), bevor die hand konnte man nicht einfach eine Prüfung, um das Feld herum auf dem Bildschirm für diese (und vielleicht andere potenziell gefährliche Zeichen)?
InformationsquelleAutor der Antwort Captain Toad
Keiner der Vorschläge, die für mich gearbeitet. Ich wollte nicht, um dieses feature zu deaktivieren, die für die gesamte website sowieso nicht, da 99% der Zeit in der ich nicht möchte, dass meine Benutzer die Platzierung HTML-Code auf web-Formularen. Ich schuf meine eigene Arbeit um Methode, da ich der einzige bin mit dieser bestimmten Anwendung. Ich konvertiert die Eingabe in HTML code hinter, und stecken Sie es in meine Datenbank.
InformationsquelleAutor der Antwort Mike S.
Können Sie so etwas wie:
Später
nvc["yourKey"]
funktionieren sollte.InformationsquelleAutor der Antwort Ady Levy