34 votes

Pourquoi ValidateInput(False) ne fonctionne-t-il pas ?

Je suis en train de convertir une application que j'ai créée en utilisant WebForms vers le framework ASP.NET MVC en utilisant vb.net. J'ai un problème avec l'une de mes vues. J'obtiens l'écran jaune de la mort disant "Une valeur Request.Form potentiellement dangereuse a été détectée chez le client" lorsque je soumets mon formulaire. J'utilise tinymce comme mon RTE. J'ai défini sur la vue elle-même

ValidateRequest="false"

Je sais qu'en MVC cela ne le respecte pas sur la vue d'après ce que j'ai lu jusqu'à présent. Donc je l'ai mis aussi sur l'action du contrôleur. J'ai essayé différentes configurations :

 _

...et...

 _

...et comme ceci aussi...

 _
 _

Juste pour voir si cela faisait une différence, pourtant j'obtiens toujours l'écran jaune de la mort. Je veux seulement le définir pour cette vue et l'action spécifique dans mon contrôleur à laquelle mon post se rapporte. Est-ce que j'ai raté quelque chose ?

133voto

Jim Geurts Points 8199

Avec asp.net 4, vous devrez également configurer le mode de validation dans le fichier web.config.

Configurer ce qui suit comme enfant de l'élément :

  ...

Asp.Net 4 définit le requestValidationMode par défaut à 4.0, ce qui indique au système d'effectuer la validation de la requête avant la phase BeginRequst de la requête HTTP. La validation aura lieu avant que le système n'atteigne l'attribut d'action lui indiquant de ne pas valider la requête, rendant ainsi l'attribut inutile. En définissant requestValidationMode="2.0", vous revenez au comportement de validation de la requête asp.net 2.0, ce qui permet à l'attribut ValidateInput de fonctionner comme prévu.

17voto

Chad Moran Points 8560

Êtes-vous sûr que l'action du contrôleur à laquelle vous envoyez la requête est celle qui possède les attributs requis ?

3voto

Rahat Points 382

Lorsque vous utilisez vos propres liants de modèles qui implémentent l'interface IModelBinder, vous remarquerez que ces liants de modèles personnalisés valident toujours les données, indépendamment des attributs. Vous pouvez ajouter quelques lignes de code pour que les liants de modèles personnalisés respectent le filtre ValidateInput des actions :

// Vérifie d'abord si la validation de la requête est nécessaire
var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;

// Obtenir la valeur
var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
if (valueProviderResult != null)
{
    var theValue = valueProviderResult.AttemptedValue;

    // etc...
}

Ceci est expliqué très clairement par Martijn Boland ici : http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/

1voto

Frank van Eykelen Points 515

Veuillez noter que ces suggestions ne résoudront pas les problèmes causés par un bogue qui se produit lorsque vous devez utiliser [ValidateInput(false)] en combinaison avec un FormCollection.

Voir: ASP.NET MVC 3 ValidateRequest(false) ne fonctionne pas avec FormCollection

-1voto

Vishnu Vikraman Points 346

Ajoutez la ligne de code suivante :

GlobalFilters.Filters.Add(new ValidateInputAttribute(false));

dans la méthode Application_Start(). Hehe bien

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X