2010-11-23 14 views
1

Um zu verhindern, dass meine Anwendung mit dem Fehler "Eine potenziell gefährliche Anforderung.Formwert wurde gefunden ..." abstürzte, habe ich die Gültigkeitsprüfung der Seite gerade deaktiviert. Ich möchte das noch einmal überprüfen und es richtig lösen.Strategie zum automatischen Kodieren von Texteingaben?

Gibt es dafür eine gute Strategie? Wenn Leute '<' und '>' eingeben, denke ich, dass die einzige Möglichkeit, ihre Daten zu speichern, darin besteht, sie über JavaScript zu verschlüsseln. Ich habe versucht, es im Code-Behind einzufangen, aber es wird zu spät. Ich denke daran, das Textfeld zu erben und die Eingabe mit Client-Skripts automatisch zu codieren/dekodieren. Ich muss auch an alle spitzen Klammern denken, die bereits in meiner Datenbank gespeichert sind.

Irgendwelche Vorschläge oder Erfahrungen damit?

Antwort

0

sein können Sie gefährliche Zeichen entkommen, bevor die Daten zu veröffentlichen. Wie folgt aus:

string = escape(string); 

und dann auf der Serverseite:

var stringVal = Server.UrlDecode(Request["string"]); 

So ähnlich.

0

Haben Sie mit in Betracht gezogen,

Server.HtmlEncode(input) 

Es gibt keine wirkliche Notwendigkeit, es in der Client-Seite mit Hilfe von Javascript zu tun ist. Sie können es leicht auf der Serverseite unter Verwendung der obigen Technik tun.

Und möglicherweise ein Duplikat this Frage /BB

+1

In welchem ​​Teil des Lebenszyklus würden Sie dies tun, egal wo ich versuche, bekomme ich die "potenziell gefährlich ..." geworfen. Ich denke, die Client-Seite ist die einzige Möglichkeit, dies zu handhaben (?) – TruMan1

+0

Dies kann nur durchgeführt werden, wenn Sie Ihre Seitenvalidierung ausgeschaltet haben. @Bumble Bee schlägt tatsächlich vor, dass Sie es ausgeschaltet lassen, und verwenden Sie Server.HtmlEncode, um die Werte zu überprüfen, die Sie von Ihrem Benutzer erhalten haben. – Gidon

+1

Die Codierung der Eingabe sieht für mich wie eine schlechte Architektur aus. Sie müssen den Ausgang codieren. Einige View Engines (wie Razor) machen das automatisch. – CodesInChaos

1

Ich bekomme von Ihrer Antwort, dass Sie nicht möchten, dass Ihr Client Ihnen "gefährlichen" Inhalt sendet, also ist es wünschenswert, die Seitenvalidierung als letzte Verteidigungslinie eingeschaltet zu lassen, anstatt sie abzuschalten und zu benutzen Server.HtmlEncode auf jeden Benutzereingabewert (Sie könnten einen vermissen und es ist eine Menge Arbeit).

Ich würde für eine Javascript-Lösung gehen, zum Beispiel könnten Sie eine Bibliothek wie jQuery verwenden, und haken Sie in die Sendeereignisse der Formulare, und die Eingabe vor dem Senden aufräumen. Viel sauberer als das Erstellen eines eigenen abgeleiteten Textfelds.

Für die Benutzer ohne Javascript, oder die versuchen, Ihr kleines Skript zu "hacken", sC#! W ihnen, sie werden Ihre letzte Verteidigungslinie erreichen, und erhalten einen Fehler.

1

Am besten ist die integrierte Seitenvalidierung als Sicherheitsvorrichtung zu betrachten, die nicht in allen Fällen anwendbar ist. Es gibt mehr als ein paar Mal, wenn es völlig unmöglich ist, damit etwas zu tun. In diesen Fällen schalten wir es ab und kümmern uns selbst um die Validierung.

Der offensichtlichste Fall ist, dass wir manchmal große HTML-Stücke an den Server senden wollen. Natürlich muss das noch sicher gemacht werden, aber "Oh, das sieht nach einem großen Stück HTML aus! Wirf eine Sicherheitsausnahme!" Offensichtlich ist das nicht der richtige Weg.

In diesen Fällen ist es also sinnvoll, die Seitenprüfung zu deaktivieren und eine eigene Serverseite hinzuzufügen. Es bedeutet, dass Sie darüber nachdenken müssen, wie dieser Input mit etwas mehr Kontrolle als zuvor verwendet wird. Befolgen Sie den Pfad jeder Dateneingabe (nicht nur die Zeichen, bei denen Sie Zeichen wie < sehen möchten, und stellen Sie sicher, dass sie entweder nicht an den Client zurückgesendet oder zur Gewährleistung der Sicherheit gründlich geprüft werden.

Verwandte Themen