2013-03-12 4 views
5

Wenn ich HTML-Zeichen in mein Formular einfüge, z. B. <br />, löst ASP.NET eine interne 500-Ausnahme wie beschrieben here.Wenn ich HTML-Zeichen in meinem Formular einreiche, warum wirft ASP.NET einen internen Server (500) -Fehler?

A potentially dangerous Request.Form value was detected from the client (Name="<br />").

Ok, so dass es mich beschützt von nicht codierten Zeichen, die für bösartige Gründen verwendet werden könnten.

Das Problem ist, und das ist nirgendwo in meiner langen Suche beantwortet, was ist zu tun. I.e. Meine Anwendung sollte nicht nur einen generischen internen Serverfehler auslösen, wenn ein Benutzer schlechte Zeichen eingibt (was ist, wenn sie einen Pfeil wie < - zeichnen).

Was wäre besser ist, einfach auf die Seite mit einem ModelState Fehler zurück, der sagt "Bitte verwenden Sie keine HTML-Zeichen" oder etwas Sinnvolles.

Aber wie soll das erreicht werden? Der Fehler wird weit geworfen, bevor er zu meinem Code gelangt. Außerdem möchte ich es nicht einfach über validateRequest="false" abschalten und dann jedes einzelne Formular in meiner Anwendung auf HTML-Zeichen überprüfen und einen Fehler zurückgeben.

Gibt es eine Möglichkeit, diese Art der Validierung aktiviert zu lassen, aber nur anders zu behandeln?

-Code zur Klarstellung:

Model

Public Class SomeModel 
    Public Property SomeField As String 
End Class 

Controller

<HttpPost> 
Function SomeController(ByVal model As SomeModel) 
    ' model.SomeField contains some HTML characters :O 
    ' but it doesn't matter, since an internal error has occured :(
End Function 
+0

Mein Problem aktualisiert, um etwas Code für den Kontext aufzunehmen. –

Antwort

2

Es ist definitiv möglich, Ihre eigene Fehlerseite mit der Nachricht anzuzeigen, die Sie für richtig halten.
Sie verwenden hierfür customError-Seiten.

Sie können diese Fehlerseiten so konfigurieren, dass sie für den entsprechenden Fehlercode angezeigt werden.

<configuration> 
    <system.web> 
     <customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" 
        defaultRedirect="GenericError.htm"> 
     <error statusCode="500" redirect="InternalError.aspx"/> 
     </customErrors> 
    </system.web> 
</configuration> 

Displaying a Custom Error Page

Auf Ihre Fehlerseite können Sie den letzten Fehler mit Server.GetLastError() erkennen und verwenden sie eine entsprechende Meldung anzeigen, wenn Sie diesen Fall von HTML-Daten wollen anders behandelt werden.

+0

Idealerweise würde ich lieber auf dieselbe Seite (Formular) zurückkehren als auf eine komplett andere Seite mit einem generischen "HTML-Zeichen erkannt". Ist das möglich? –

+0

Der 'redirectMode =" ResponseRewrite "' behält die URL gleich. Wenn der Benutzer senden würde, ohne die fehlerhaften Daten zu senden, würde die richtige Seite geöffnet werden. – nunespascal

2

Haben Sie versucht, Hinzufügen der AllowHtml Attribut auf das Eigentum Ihrer Viewmodel?

+0

Ja, und das funktioniert, aber die Leute sagen, dass Sie dann alles selbst validieren müssen. Wenn die einzige Alternative überall ist, warum validiert ASP.NET irgendetwas überhaupt? Meine Hauptfrage ist, warum und was ist der beste (Standard) Weg, dies zu lösen? –

+1

Ich verstehe. Wahrscheinlich sollten Sie das AllowHtml-Attribut nicht überall verwenden. Nur in den Eigenschaften, die möglicherweise HTML enthalten könnten. Nun, wenn Sie den Fehler nur anders behandeln möchten, können Sie einen HandleError-Aktionsfilter hinzufügen und die Ausnahme als System.Web.HttpRequestValidationException angeben. Das sollte Sie anpassen, wie der Fehler behandelt wird. Wenn Sie die Art der internen Validierung tatsächlich ändern möchten, müssen Sie möglicherweise den Standardmodellbinder erweitern. –

0

Um eine eingeschränkte Eingabe im Modell zu ermöglichen, verwenden Sie das Attribut AllowHtmlAttribute für die Modelleigenschaft. Das ist der erste Schritt.

Erstellen Sie dann einen benutzerdefinierten Validator oder verwenden Sie das RegularExpressionAttribute, um die Eingabe für Ihre Spezifikation zu überprüfen.

Oder, wenn Sie zulassen möchten, dass der Benutzer eingeschränkte Zeichen eingeben kann, verwenden Sie HttpUtility.HtmlEncode, um den Wert zu codieren.

+0

Idealerweise würde ich mit einem hinzugefügten ModelState.Error zur selben Seite (Formular) zurückkehren. Aber das bedeutet, dass Sie auf jedes Feld anwenden und dann die Validierung für jedes Feld verwenden (d. H. Ein Validierungsattribut). Was für Kopfschmerzen :(Ich denke, es gibt keine schnelle Lösung für diese. –

1

Es klingt wie, was Sie wollen, ist es global ausgeschaltet zu haben.

Ihr Anliegen, jeden einzelnen Eingang in Ihrer Anwendung zu validieren, ist weniger ein Problem als es früher sowohl mit Rasierer als auch mit der Syntax automatisch HTML-Codierungsausgabe war. Die einzigen Felder Ihrer Anwendung, die Sie manuell überprüfen müssen, um sicherzustellen, dass sie kein HTML enthalten, sind Felder, die als unverschlüsselter Rohtext angezeigt werden.

+0

Ja, einverstanden. Ich habe festgestellt, dass alles sehr sicher ist, also warum ASP.NET diesen Fehler an erster Stelle? Versuchen Sie Folgendes: Gehen Sie zu einem MVC-Web Anwendung, die Sie sich vorstellen können, gehen Sie zu einem Formular (z. B. Login) und geben Sie
in einem Feld und senden. Wenn Sie einen Fehler erhalten, haben diese Web-Admins dies auch nicht berücksichtigt: P –

Verwandte Themen