ValidateRequest = "false" funktioniert in Asp.Net 4 nicht

156

Ich habe ein Formular, in dem ich ckeditor verwende. Dieses Formular hat in Asp.Net 2.0 und 3.5 gut funktioniert, aber jetzt funktioniert es in Asp.Net 4+ nicht mehr. Ich habe die Anweisung ValidateRequest = "false". Irgendwelche Vorschläge?

HasanG
quelle
Es gibt einen kurzen Artikel über das korrekte Rendern von Validierungssteuerelementen, wenn es jemanden interessiert: Fehlervalidierung in .NET 4
Ian
Kann mir bitte jemand mitteilen, welche Nachteile die Verwendung von ValidationRequest = false hat?
fc123

Antworten:

194

Lösung auf der Fehlerseite gefunden. Nur erforderlich, um requestValidationMode = "2.0" hinzuzufügen

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>

MSDN-Informationen: HttpRuntimeSection.RequestValidationMode-Eigenschaft

HasanG
quelle
1
Das ist großartig, aber kennt jemand eine Möglichkeit, dies pro Seite festzulegen? Wie füge ich dies in web.config ein, damit es weiterhin mit .NET 2 funktioniert?
MK.
1
@MK: Ich glaube nicht, dass es für diese Einstellung eine Seitenanweisung gibt. Sie können es nicht auf .net 2 laufen lassen. Ich denke nicht, dass das notwendig wäre. Weil Sie einfach eine Web-App erstellen können, die nur auf eine Framework-Version abzielt. Kopieren Sie einfach diese Zeile in .net 4 web.config, die es benötigt ...
HasanG
2
Aber was hat sich an der Validierung für .net 4 geändert? Gibt es eine Möglichkeit, dies zu tun, ohne den Validierungsmodus zu ändern?
Sly
4
@Sly: Sie können Antwort hier finden: asp.net/learn/whitepapers/aspnet4/…
HasanG
Kann mir jemand bitte mitteilen, warum in einer asp.net 4.0-Anwendung die Verwendung von requestValidationMode = "2.0" eine gute Idee ist?
fc123
102

Es gibt eine Möglichkeit, die Validierung für eine Seite auf 2.0 zurückzusetzen. Fügen Sie einfach den folgenden Code zu Ihrer web.config hinzu:

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>
Ben Hoffman
quelle
Der Speicherort ist ein beliebiger Pfad und basiert auf einem beliebigen Knoten unterhalb des Ordners, den Sie in der Baumstruktur angegeben haben.
DFTR
7
Dies ist eine bessere Lösung als die akzeptierte Antwort, da sie nicht anwendungsweit ist, sondern sich auf den spezifischen Bereich beschränkt, den Sie im Standortpfad definieren
Charles Wesley,
5
Die obige <location ..> -Deklaration sollte in die <configuration> -Deklaration eingefügt, aber nicht weiter verschachtelt werden.
Rbassett
1
Die Einstellung pro Seite scheint für Projekte, die auf .NET 4.6.1 abzielen, nicht zu funktionieren.
Dennis T - Reinstate Monica -
56

Ich weiß, dass dies eine alte Frage ist, aber wenn Sie in MVC 3 auf dieses Problem stoßen, können Sie Ihre ActionMethodmit dekorieren [ValidateInput(false)]und einfach die Anforderungsvalidierung für eine einzelne deaktivieren ActionMethod, was praktisch ist. Außerdem müssen Sie keine Änderungen an der web.configDatei vornehmen , sodass Sie die .NET 4-Anforderungsüberprüfung weiterhin überall verwenden können.

z.B

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}
Tom Chantler
quelle
1
@ RossCooper dies ist nur für asp.net MVC
mxmissile
28

Dies funktioniert ohne Änderung des Validierungsmodus.

Sie müssen einen System.Web.Helpers.Validation.UnvalidatedHelfer von verwenden System.Web.WebPages.dll. Es wird ein UnvalidatedRequestValuesObjekt zurückgegeben, mit dem ohne Validierung auf das Formular und QueryString zugegriffen werden kann.

Beispielsweise,

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

Funktioniert bei mir für MVC3 und .NET 4.

Attentäter
quelle
1
Können Sie bitte ein Beispiel für das Abrufen eines queryString mit dieser Methode angeben? Ich erhalte immer wieder die Meldung "Nicht validiert ist kein Mitglied von ..." für alle Objekte, an die ich sie anhängen möchte. Ich denke, ich könnte ein Include
vermissen
3
var queryValue = Server.UrlDecode (Request.Unvalidated ("MyQueryKey"));
Sfuqua
1
Dies sollte definitiv die akzeptierte Antwort sein. Erhält die Sicherheit und ist äußerst flexibel, da Sie sie selektiv verwenden können.
cmartin
Für Web - Formulare müssen Sie Eintrag in Abfrage - Zeichenfolge - Sammlung zu vermeiden Validierung ersetzen fehlern siehe A potenziell gefährlicher Request.QueryString Wert vom Client erkannt wurde , als HTML - Markup von jquery Post Aufruf asp.net Seite zu senden
Michael Freidgeim
15

Beachten Sie, dass ein anderer Ansatz darin besteht, das 4.0-Validierungsverhalten beizubehalten, aber Ihre eigene Klasse zu definieren, die von Folgendem abgeleitet RequestValidatorund festgelegt wird:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(Wo YourNamespace.YourValidatorist gut, sollten Sie raten können ...)

Auf diese Weise behalten Sie die Vorteile des 4.0-Verhaltens bei (insbesondere, dass die Validierung früher in der Verarbeitung erfolgt) und lassen gleichzeitig die Anforderungen zu, die Sie durchlassen müssen.

Jon Hanna
quelle
7
Das ist gut zu wissen. Ich denke jedoch immer noch, dass die gesamte Funktion zur Validierung von Anforderungen von ASP.Net falsch ist. Die Eingabe selbst ist nicht das Problem, sondern das, was Sie damit machen . Es kann durchaus gültig sein, SQL-, HTML- oder JavaScript-Code als Eingabe für Ihre App zu akzeptieren, solange Sie ihn ordnungsgemäß codieren / maskieren, bevor Sie ihn ausgeben oder in Ihrer Datenbank speichern.
Jordan Rieger
2
@ JordanRieger Ich stimme teilweise zu. OOTB, es hat zumindest den Vorteil, standardmäßig zu sichern (denken Sie nicht über die Dinge nach und Sie erhalten Fehler, anstatt 0wned), aber es ist ein bisschen lästig und das Verhalten vor 4.0 ist sehr alles oder nichts. Die Fähigkeit, eine Validierungsschicht zu haben, die vor jeder anderen Verarbeitung verwendet wird, wie bei einem benutzerdefinierten requestValidationType, hat etwas zu bieten, aber viele Validierungen müssen stärker mit anderen Verarbeitungen verknüpft werden. Insgesamt denke ich, dass es mehr dazu beiträgt, Menschen mit schlechten Gewohnheiten vor einigen (aber nicht allen) Spaltungen zu schützen, als gute Gewohnheiten zu fördern.
Jon Hanna