2009-05-05 4 views
3

Die berüchtigte A potentially dangerous Request.Form value was detected from the client Frage :)automatisch sanieren Einträge auf Httprequestvalidationexception

Hier ist mein Anwendungsfall: Ich habe eine FCKEditor Kontrolle auf einer Webseite, die Benutzer HTML eingeben kann. Bei dieser präzisen Webseite ist die Validierung deaktiviert, damit sie verwendet werden kann, aber meine Masterpage hat Linkbuttons, die Postbacks auf anderen Seiten auslösen können.

Ich möchte natürlich nicht überflüssig Validierung auf jeder Seite meiner Website deaktivieren, aber ich möchte in der Lage sein, die Eingabe 'stillschweigend' (entweder durch Entfernen der fehlerhaften Feld aus dem Antragsformular, oder indem es es bestätigt).

Ich sehe, dass OnInit oder ProcessRequest auf der Seite überschrieben werden kann, aber ich möchte das auf der Masterseite tun, wenn es möglich ist. (Ich bin nicht einmal sicher, ob ich von einem HttpRequestValidationException wiederherstellen kann)

Irgendeine Idee, wie ich das tun könnte?

Bearbeiten: Ich habe mit PageError gespielt, die erfolgreich den Fehler abfängt, aber ich kann nicht finden, wie die Verarbeitung fortzusetzen, nachdem ich die Anfrage überprüft hatte, war in der Tat legitim.

Antwort

5

Validierung ausschalten, weil es an der falsch Stufe in dem Verfahren validiert.

Eingangsvalidierung ist inhärent fehlerhaft; Sie brauchen tatsächlich Ausgabe Validierung. Dies bedeutet, dass Sie alle Daten aufnehmen, aber vor dem Drucken für den relevanten Kontext, in dem sie angezeigt werden, codieren. Für das direkte Schreiben auf eine HTML-Seite verwenden Sie HttpUtility.HtmlEncode und andere solche Codierungstechniken je nach Kontext.

+0

Leider ist dies nicht wirklich eine Option, ohne die gesamte Anwendung neu zu schreiben :) – Luk

+1

Nun, auch dann müssen Sie akzeptieren, dass Sie Anwendung ist nicht ideal sicher. In diesem Fall gelten die gleichen Regeln. Sie deaktivieren die Anforderungsüberprüfung (weil sie immer noch falsch ist) und validieren sie, wenn Sie sie erhalten, und stellen sicher, dass Sie sie nur im richtigen Kontext verwenden. –

0

Wenn Sie die Ausnahme in einer bestimmten Weise behandeln und die Anforderung während dieses Prozesses überprüfen möchten, sollten Sie die globale Ausnahmebehandlung in Betracht ziehen. Es gibt einen kurzen Artikel hier darauf:

http://www.developer.com/net/asp/article.php/961301

Hoffnung, das hilft.

+0

Leider, sobald ich in Application_Error bin, gibt es keinen Weg zurück: Die Anfrage ist fehlgeschlagen und ich kann nicht wiederherstellen. (Wenn ich mich nicht irre) – Luk

1

Ich glaube, Sie sollten in der Lage sein, die globale Ausnahme verwendet Umgang dass Richard erwähnt, kann aber einen Anruf zu ClearError hinzufügen muß, um loszuwerden, die Httprequestvalidationexception und mit der Bitte weiter. So etwas wie dies könnte den Trick tun:

protected void Application_Error(object sender, EventArgs e) { 
    Exception ex = Server.GetLastError().GetBaseException(); 
    if (ex.Message.StartsWith("A potentially dangerous Request.Form value was detected")) { 
     Server.ClearError(); 
    } 
} 

Es könnte die Request.Url Überprüfung und/oder die Request.UrlReferer wert sein, um sicherzustellen, dass die Anfrage stammt aus dem FCKEditor Seite als auch.

Hoffe, das hilft.

+1

Ich würde den String-Vergleich vermeiden (nimmt ein englisches Betriebssystem an) und verwende stattdessen "if (ex ist HttpRequestValidationException)". – devstuff

+0

Klingt ein sehr guter Plan, aber in diesem Fall wird die Seite anscheinend nicht verarbeitet: Ich lande mit einer leeren Seite – Luk

0

Müssen Ihre Verknüpfungsschaltflächen Schaltflächen sein (Post) oder können Sie sie in tatsächliche Verknüpfungen umwandeln (get)? Wenn Sie keine Daten zurückgeben und Sie nicht wissen müssen, auf welche Schaltfläche geklickt wurde, würde ich Ihnen vorschlagen, einfach die Links zu verwenden. Eine Get-Anforderung enthält keine der Formulardaten auf der Seite, sodass Sie den Fehler auf den anderen Seiten nicht erhalten. Verwenden Sie CSS-Stile für den Link, um bei Bedarf eine Schaltfläche anzuzeigen.

+0

Ja leider – Luk

0

Edit: Ich habe mit Page_Error gespielt, die erfolgreich den Fehler fängt aber ich kann nicht finden, wie die Verarbeitung wieder aufnehmen, nachdem ich die Anfrage in der Tat echt geprüft wurde: nicht

protected void Page_Error(object sender, EventArgs e) 
    { 
     if (Server.GetLastError() is HttpRequestValidationException) 
     { 
      Server.ClearError(); 
      //CreateChildControls(); 
      base.OnPreInit(e); //yeah, ugly as hell 
     } 
    } 

funktioniert