Jedes Mal, wenn ein Benutzer etwas in meiner Webanwendung veröffentlicht, das etwas enthält <
oder >
auf einer Seite steht, wird diese Ausnahme ausgelöst.
Ich möchte nicht auf die Diskussion eingehen, wie intelligent es ist, eine Ausnahme auszulösen oder eine gesamte Webanwendung zum Absturz zu bringen, weil jemand ein Zeichen in ein Textfeld eingegeben hat, aber ich suche nach einer eleganten Möglichkeit, damit umzugehen.
Die Ausnahme abfangen und anzeigen
Es ist ein Fehler aufgetreten. Bitte gehen Sie zurück und geben Sie Ihr gesamtes Formular erneut ein. Verwenden Sie diesmal jedoch nicht <
scheint mir nicht professionell genug zu sein.
Durch Deaktivieren der Nachvalidierung ( validateRequest="false"
) wird dieser Fehler definitiv vermieden , die Seite wird jedoch für eine Reihe von Angriffen anfällig.
Idealerweise: Wenn ein Postback mit HTML-beschränkten Zeichen erfolgt, wird der in der Formularsammlung veröffentlichte Wert automatisch HTML-codiert. So wird die .Text
Eigenschaft meines Textfeldes seinsomething & lt; html & gt;
Gibt es eine Möglichkeit, dies von einem Handler aus zu tun?
<httpRuntime requestValidationMode="2.0" />
in web.configAntworten:
Ich denke, Sie greifen es aus dem falschen Blickwinkel an, indem Sie versuchen, alle veröffentlichten Daten zu verschlüsseln.
Beachten Sie, dass ein "
<
" auch von anderen externen Quellen stammen kann, z. B. einem Datenbankfeld, einer Konfiguration, einer Datei, einem Feed usw.Darüber hinaus ist "
<
" nicht von Natur aus gefährlich. Dies ist nur in einem bestimmten Kontext gefährlich: beim Schreiben von Zeichenfolgen, die nicht in die HTML-Ausgabe codiert wurden (aufgrund von XSS).In anderen Kontexten sind andere Unterzeichenfolgen gefährlich. Wenn Sie beispielsweise eine vom Benutzer angegebene URL in einen Link schreiben, kann die Unterzeichenfolge "
javascript:
" gefährlich sein. Das einfache Anführungszeichen hingegen ist beim Interpolieren von Zeichenfolgen in SQL-Abfragen gefährlich, aber absolut sicher, wenn es Teil eines Namens ist, der aus einem Formular gesendet oder aus einem Datenbankfeld gelesen wurde.Das Fazit lautet: Sie können keine zufälligen Eingaben nach gefährlichen Zeichen filtern, da jedes Zeichen unter den richtigen Umständen gefährlich sein kann. Sie sollten an der Stelle codieren, an der bestimmte Zeichen gefährlich werden können, weil sie in eine andere Subsprache übergehen, in der sie eine besondere Bedeutung haben. Wenn Sie eine Zeichenfolge in HTML schreiben, sollten Sie mit Server.HtmlEncode Zeichen codieren, die in HTML eine besondere Bedeutung haben. 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).
Wenn Sie sicher sind, dass Sie überall HTML-codieren, übergeben Sie Zeichenfolgen an HTML, und legen Sie
validateRequest="false"
die<%@ Page ... %>
Anweisung in Ihren.aspx
Dateien fest.In .NET 4 müssen Sie möglicherweise etwas mehr tun. Manchmal ist es notwendig, auch
<httpRuntime requestValidationMode="2.0" />
web.config ( Referenz ) hinzuzufügen .quelle
<httpRuntime requestValidationMode="2.0" />
ein Standort-Tag ein, um zu vermeiden, dass der nützliche Schutz, der durch die Validierung durch den Rest Ihrer Site bereitgestellt wird, beeinträchtigt wird.[AllowHtml]
in der Modelleigenschaft.GlobalFilters.Filters.Add(new ValidateInputAttribute(false));
inApplication_Start()
.<pages validateRequest="false" />
in zur web.config hinzufügen<system.web />
. Dadurch wird die Eigenschaft auf alle Seiten angewendet.Es gibt eine andere Lösung für diesen Fehler, wenn Sie ASP.NET MVC verwenden:
C # Beispiel:
Visual Basic-Beispiel:
quelle
[AllowHtml]
es besser ist alsValidateInput(false)
, weil[AllowHtml]
es sofort für eine Eigenschaft definiert ist, dh für ein Editor-Feld, und wenn es verwendet wird, muss es nicht für mehrere Aktionen verwendet werden. Was schlagen Sie vor?In ASP.NET MVC (ab Version 3) können Sie das
AllowHtml
Attribut einer Eigenschaft in Ihrem Modell hinzufügen .Es ermöglicht einer Anforderung, HTML-Markup während der Modellbindung einzuschließen, indem die Anforderungsüberprüfung für die Eigenschaft übersprungen wird.
quelle
ValidateInput(false)
undAllowHtml
? Was ist der Vorteil von einem gegenüber dem anderen? Wann möchte ichAllowHtml
anstelle von verwendenValidateInput(false)
? Wann würde ich verwenden sollValidateInput(false)
überAllowHtml
? Wann möchte ich beide verwenden? Ist es sinnvoll, beide zu verwenden?Wenn Sie mit .NET 4.0 arbeiten, stellen Sie sicher, dass Sie dies in Ihrer web.config- Datei innerhalb der
<system.web>
Tags hinzufügen :In .NET 2.0 wurde die Anforderungsüberprüfung nur auf
aspx
Anforderungen angewendet . In .NET 4.0 wurde dies um alle Anforderungen erweitert. Sie können bei der Verarbeitung nur die XSS-Validierung durchführen,.aspx
indem Sie Folgendes angeben:Sie können die Validierung von Anforderungen vollständig deaktivieren, indem Sie Folgendes angeben:
quelle
<system.web>
Tags.In ASP.NET 4.0 können Sie Markups als Eingabe für bestimmte Seiten anstelle der gesamten Site zulassen, indem Sie alles in ein
<location>
Element einfügen. Dadurch wird sichergestellt, dass alle anderen Seiten sicher sind. Sie müssenValidateRequest="false"
Ihre ASPX-Seite NICHT einfügen.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 Eingabe auf Seiten, auf denen die Anforderungsüberprüfung deaktiviert ist, weiterhin programmgesteuert überprüfen.
quelle
Die vorherigen Antworten sind großartig, aber niemand hat gesagt, wie ein einzelnes Feld von der Validierung für HTML / JavaScript-Injektionen ausgeschlossen werden kann. Ich weiß nichts über frühere Versionen, aber in MVC3 Beta können Sie dies tun:
Dadurch werden weiterhin alle Felder außer dem ausgeschlossenen überprüft. Das Schöne daran ist, dass Ihre Validierungsattribute das Feld immer noch validieren, Sie jedoch nicht die Ausnahmen "Ein potenziell gefährlicher Request.Form-Wert wurde vom Client erkannt" erhalten.
Ich habe dies zum Überprüfen eines regulären Ausdrucks verwendet. Ich habe mein eigenes ValidationAttribute erstellt, um festzustellen, 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 noch geprüft, ob er gültig ist oder nicht, aber nicht, ob er Skripte oder HTML enthält.
quelle
[AllowHtml]
die Eigenschaften des Modells anstelle[ValidateInput]
der Aktion, um das gleiche Endergebnis zu erzielen.[AllowHtml]
ist keine Option. Ich empfehle, diesen Artikel zu lesen : weblogs.asp.net/imranbaloch/… , aber auch er ist etwas alt und möglicherweise veraltet.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:
und
quelle
validateRequest="false"
war das nicht nötig, nurrequestValidationMode="2.0"
Sie können Textfeldinhalte in HTML codieren , dies verhindert jedoch leider nicht, dass die Ausnahme auftritt. Nach meiner Erfahrung führt kein Weg daran vorbei, und Sie müssen die Seitenüberprüfung deaktivieren. Damit sagen Sie: "Ich werde vorsichtig sein, das verspreche ich."
quelle
Ignorieren Sie bei MVC die Eingabevalidierung durch Hinzufügen
über jeder Aktion im Controller.
quelle
Sie können diesen Fehler in Global.asax abfangen. Ich möchte noch validieren, zeige aber eine entsprechende Meldung. In dem unten aufgeführten Blog war ein Beispiel wie dieses verfügbar.
Das Weiterleiten 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
quelle
Die Antwort auf diese Frage ist einfach:
Dies würde die Validierung für die bestimmte Anforderung deaktivieren.
quelle
Request
?Beachten Sie bitte, dass einige .NET-Steuerelemente die Ausgabe automatisch in HTML codieren. Wenn Sie beispielsweise die Eigenschaft .Text in einem TextBox-Steuerelement festlegen, wird sie automatisch codiert. Das bedeutet konkret,
<
in<
,>
in>
und&
in umzuwandeln&
. Seien Sie also vorsichtig, wenn Sie dies tun ...Die .Text-Eigenschaft für HyperLink, Literal und Label codiert jedoch keine HTML-Code, sodass Server.HtmlEncode () umbrochen wird. Alles, was für diese Eigenschaften festgelegt wird, ist ein Muss, wenn Sie verhindern möchten, dass
<script> window.location = "http://www.google.com"; </script>
es auf Ihrer Seite ausgegeben und anschließend ausgeführt wird.Experimentieren Sie ein wenig, um zu sehen, was codiert wird und was nicht.
quelle
Fügen Sie in der Datei web.config innerhalb der Tags das httpRuntime-Element mit dem Attribut requestValidationMode = "2.0" ein. Fügen Sie außerdem das Attribut validateRequest = "false" in das Seitenelement ein.
Beispiel:
quelle
Wenn Sie ValidateRequest nicht deaktivieren möchten, müssen Sie eine JavaScript-Funktion implementieren, um die Ausnahme zu vermeiden. Es ist nicht die beste Option, aber es funktioniert.
Fügen Sie dann im Code dahinter beim PageLoad-Ereignis das Attribut mit dem nächsten Code zu Ihrem Steuerelement hinzu:
quelle
Es scheint, dass noch niemand das Folgende erwähnt hat, 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 gibt, aber für mich hat das erstaunlich funktioniert.
quelle
Eine andere Lösung ist:
quelle
Wenn Sie Framework 4.0 verwenden, wird der Eintrag in der web.config (<pages validateRequest = "false" />)
Wenn Sie Framework 4.5 verwenden, wird der Eintrag in der web.config (requestValidationMode = "2.0")
Wenn Sie nur eine einzelne Seite möchten, sollten Sie in Ihrer Aspx-Datei die erste Zeile wie folgt einfügen:
Wenn Sie bereits so etwas wie <% @ Page haben, fügen Sie einfach den Rest hinzu =>
EnableEventValidation="false"
%>Ich empfehle es nicht zu tun.
quelle
In ASP.NET können Sie die Ausnahme abfangen und etwas dagegen tun, z. B. eine freundliche Nachricht anzeigen oder auf eine andere Seite umleiten. Außerdem besteht die Möglichkeit, dass Sie die Validierung selbst durchführen können.
Freundliche Nachricht anzeigen:
quelle
Ich denke, Sie könnten es in einem Modul tun; aber das lässt einige Fragen offen; Was ist, wenn Sie die Eingabe in einer Datenbank speichern möchten? Da Sie verschlüsselte Daten in der Datenbank speichern, vertrauen Sie plötzlich den Eingaben, was wahrscheinlich eine schlechte Idee ist. Idealerweise speichern Sie nicht codierte Rohdaten in der Datenbank und codieren sie jedes Mal.
Das Deaktivieren des Schutzes auf Seitenebene und das anschließende Codieren ist eine bessere Option.
Anstatt Server.HtmlEncode zu verwenden, sollten Sie sich die neuere, vollständigere Anti-XSS-Bibliothek des Microsoft ACE-Teams ansehen .
quelle
Ursache
ASP.NET überprüft standardmäßig alle Eingabesteuerelemente auf potenziell unsichere Inhalte, die zu Cross-Site-Scripting (XSS) und SQL-Injektionen führen können . Daher wird ein solcher Inhalt durch Auslösen der obigen Ausnahme nicht zugelassen. Standardmäßig wird empfohlen, diese Überprüfung bei jedem Postback zuzulassen.
Lösung
In vielen Fällen müssen Sie HTML-Inhalte über Rich TextBoxes oder Rich Text Editors an Ihre Seite senden. In diesem Fall können Sie diese Ausnahme vermeiden, indem Sie das ValidateRequest-Tag in der
@Page
Direktive auf false setzen.Dadurch wird die Validierung von Anforderungen 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 dies in Ihrer gesamten Webanwendung. Sie müssen es in Ihrem Abschnitt web.config <system.web> auf false setzen
Für .NET 4.0 oder höhere Frameworks müssen Sie außerdem die folgende Zeile im Abschnitt <system.web> hinzufügen, damit die oben genannten Funktionen ausgeführt werden.
Das ist es. Ich hoffe, dies hilft Ihnen dabei, das oben genannte Problem zu beseitigen.
Referenz von: ASP.Net Fehler: Ein möglicherweise gefährlicher Request.Form-Wert wurde vom Client erkannt
quelle
Ich habe eine Lösung gefunden, die JavaScript zum Codieren der Daten verwendet, die in .NET dekodiert ist (und keine jQuery erfordert).
Fügen Sie Ihrem Header die folgende JavaScript-Funktion hinzu.
Funktion boo () {targetText = document.getElementById ("HiddenField1"); sourceText = document.getElementById ("userbox"); targetText.value = Escape (sourceText.innerText); }}Fügen Sie in Ihren Textbereich eine Änderung ein, die boo () aufruft:
Verwenden Sie schließlich in .NET
Ich bin mir bewusst, dass dies eine Einbahnstraße ist - wenn Sie eine Einbahnstraße benötigen, müssen Sie kreativ werden, aber dies bietet eine Lösung, wenn Sie die web.config nicht bearbeiten können
Hier ist ein Beispiel, das ich (MC9000) über jQuery entwickelt habe:
Und das Markup:
Das funktioniert super. Wenn ein Hacker versucht, über die Umgehung von JavaScript zu posten, wird nur der Fehler angezeigt. Sie können alle diese in einer Datenbank verschlüsselten Daten auch speichern, sie dann (auf der Serverseite) entfernen und analysieren und nach Angriffen suchen, bevor Sie sie an anderer Stelle anzeigen.
quelle
escape(...)
kann lange dauern. In meinem Fall war das Markup eine vollständige (2 MB) XML-Datei. Sie könnten fragen: "Warum verwenden Sie nicht einfach<input type="file"...
und ... ich stimme Ihnen zu :)Die anderen Lösungen hier sind nett, aber es ist ein bisschen schmerzhaft, [AllowHtml] auf jede einzelne Modelleigenschaft anwenden zu müssen, insbesondere wenn Sie über 100 Modelle auf einer Site mit angemessener Größe haben.
Wenn Sie wie ich diese (meiner Meinung nach ziemlich sinnlose) Funktion außerhalb der Site deaktivieren möchten, können Sie die Execute () -Methode in Ihrem Basis-Controller überschreiben (wenn Sie noch keinen Basis-Controller haben, können Sie einen erstellen ziemlich nützlich für die Anwendung allgemeiner Funktionen).
Stellen Sie einfach sicher, dass Sie alles HTML-codieren, was in die Ansichten gepumpt wird, die aus Benutzereingaben stammen (dies ist ohnehin das Standardverhalten in ASP.NET MVC 3 mit Razor, es sei denn, Sie verwenden aus irgendeinem bizarren Grund Html.Raw () sollte diese Funktion nicht erfordern.
quelle
Ich habe auch diesen Fehler bekommen.
In meinem Fall hat ein Benutzer ein Akzentzeichen
á
in einen Rollennamen eingegeben (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 fehlgeschlagen ...Ich habe dies getan, um das Problem zu lösen:
Anstatt
Mach das
@Html.Raw
hat den Trick gemacht.Ich habe den Rollennamen als HTML-Wert erhalten
roleName="Cadastro bás"
. Dieser Wert mit HTML-Entitätá
wurde von ASP.NET MVC blockiert. Jetzt erhalte ich denroleName
Parameterwert so, wie er sein sollte:roleName="Cadastro Básico"
und die ASP.NET MVC-Engine blockiert die Anforderung nicht mehr.quelle
Deaktivieren Sie die Seite Validierung , wenn Sie wirklich die Sonderzeichen benötigen mögen,
>
,,<
usw. dann sicher , dass , wenn die Benutzereingabe angezeigt wird, die Daten HTML-codiert.Bei der Seitenüberprüfung liegt eine Sicherheitslücke vor, sodass diese umgangen werden kann. Auch auf die Seitenüberprüfung sollte nicht allein vertraut werden.
Siehe: http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf
quelle
Sie können auch die Escape- Funktion (Zeichenfolge) von JavaScript verwenden , um die Sonderzeichen zu ersetzen. Verwenden Sie dann serverseitig Server. URLDecode (Zeichenfolge) zum Zurückschalten.
Auf diese Weise müssen Sie die Eingabevalidierung nicht deaktivieren, und anderen Programmierern wird klarer, dass die Zeichenfolge möglicherweise HTML-Inhalt enthält.
quelle
Ich habe vor jedem Postback JavaScript verwendet, um nach den Zeichen zu suchen, die Sie nicht wollten, wie zum Beispiel:
Zugegeben, meine Seite besteht hauptsächlich aus Dateneingaben, und es gibt nur sehr wenige Elemente, die Postbacks durchführen, aber zumindest ihre Daten bleiben erhalten.
quelle
Sie können etwas verwenden wie:
Sollte später
nvc["yourKey"]
funktionieren.quelle
Solange es sich nur um "<" und ">" (und nicht um das doppelte Anführungszeichen selbst) handelt und Sie sie in einem Kontext wie <input value = " this " /> verwenden, sind Sie sicher (während für <textarea) > dieses </ textarea> wären Sie natürlich verwundbar). Das mag Ihre Situation vereinfachen, aber für alles andere verwenden Sie eine der anderen veröffentlichten Lösungen.
quelle
Wenn Sie Ihren Benutzern nur mitteilen möchten, dass <und> nicht verwendet werden soll, ABER Sie möchten nicht, dass das gesamte Formular zuvor verarbeitet / zurückgeschickt wird (und alle Eingaben verloren gehen), können Sie nicht einfach ein Formular eingeben Validator im Feld, um nach diesen (und möglicherweise anderen potenziell gefährlichen) Zeichen zu suchen?
quelle
Keiner der Vorschläge hat bei mir funktioniert. Ich wollte diese Funktion sowieso nicht für die gesamte Website deaktivieren, da ich zu 99% nicht möchte, dass meine Benutzer HTML in Webformulare einfügen. Ich habe gerade meine eigene Umgehungsmethode erstellt, da ich der einzige bin, der diese spezielle Anwendung verwendet. Ich konvertiere die Eingabe im Code dahinter in HTML und füge sie in meine Datenbank ein.
quelle