web-dev-qa-db-fra.com

ValidateRequest = "false" ne fonctionne pas dans Asp.Net 4

J'ai un formulaire où j'utilise ckeditor. Ce formulaire fonctionnait bien sous Asp.Net 2.0 et 3.5, mais il ne fonctionne plus dans Asp.Net 4+. J'ai ValidateRequest = "false" directive. Aucune suggestion?

154
HasanG

Solution trouvée à la page d'erreur. Il suffit juste d'ajouter requestValidationMode = "2.0"

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

Informations MSDN: propriété HttpRuntimeSection.RequestValidationMode

192
HasanG

Il existe un moyen de ramener la validation à 2.0 pour une page. Ajoutez simplement le code ci-dessous à votre web.config:

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

    ...
    the rest of your configuration
    ...

</configuration>
99
Ben Hoffman

Je sais que c’est une vieille question, mais si vous rencontrez ce problème dans MVC 3, vous pouvez décorer votre ActionMethod avec [ValidateInput(false)] et simplement désactiver la validation de la demande pour un seul ActionMethod, c’est-à-dire pratique. De plus, vous n'avez pas besoin de modifier le fichier web.config, vous pouvez donc toujours utiliser la validation de la demande .NET 4 partout ailleurs.

par exemple.

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}
56
Tom Chantler

Cela fonctionne sans changer le mode de validation.

Vous devez utiliser un assistant System.Web.Helpers.Validation.Unvalidated à partir de System.Web.WebPages.dll. Il va retourner un objet UnvalidatedRequestValues qui permet d'accéder au formulaire et à QueryString sans validation.

Par exemple,

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

Fonctionne pour moi pour MVC3 et .NET 4.

28
Assassin

Notez qu'une autre approche consiste à conserver le comportement de validation 4.0, mais à définir votre propre classe qui dérive de RequestValidator et à définir:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(où YourNamespace.YourValidator est bien, vous devriez pouvoir le deviner ...)

Ainsi, vous conservez les avantages du comportement de la version 4.0 (en particulier, le fait que la validation a lieu plus tôt dans le traitement), tout en permettant aux demandes que vous devez laisser passer.

15
Jon Hanna