Pourquoi ValidateInput (False) ne fonctionne-t-il pas?
je suis en train de convertir une application que j'ai créée en utilisant des formulaires Web en asp.net MVC framework using vb.net. J'ai un problème avec une de mes opinions. Je reçois l'écran jaune de la mort disant " une requête potentiellement dangereuse.La valeur du formulaire a été détectée par le client" lorsque je soumets mon formulaire. J'utilise tinymce comme IRT. J'ai mis sur la vue elle-même
ValidateRequest= "false"
je sais que dans MVC il ne respecte pas sur la vue de ce que j'ai lu jusqu'à présent. Donc je l'ai mis sur l'action du contrôleur. J'ai essayé différentes configurations:
<ValidateInput(False), AcceptVerbs(HttpVerbs.Post)> _
...et...
<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
...et comme cette...
<ValidateInput(False)> _
<AcceptVerbs(HttpVerbs.Post)> _
Juste pour voir si cela fait une différence, mais j'ai toujours l'écran jaune de la mort. Je veux seulement mettre pour ce point de vue et l'action spécifique dans mon contrôleur que mon post concerne. Ai-je raté quelque chose?
7 réponses
êtes-vous sûr que l'action du contrôleur est celle pour laquelle vous avez les attributs?
avec asp.net 4, vous aurez besoin de configurer le mode validation dans le web.config.
définit ce qui suit comme un enfant de l'élément <system.web>
:
<system.Web>
...
<httpRuntime requestValidationMode="2.0"/>
Asp.Net 4 définit le mode requestValidationMode à 4.0
par défaut, ce qui indique au système d'effectuer la validation de la requête avant la phase de BeginRequst de la requête HTTP. La validation aura lieu avant que le système atteigne l'attribut action lui disant de ne pas valider la demande, rendant ainsi l'attribut inutile. Définir requestValidationMode= "2.0" reviendra à la asp.net 2.0 request validation behavior, permettant à l'attribut ValidateInput
de fonctionner comme prévu.
lorsque vous utilisez vos propres classeurs de modèles qui implémentent l'interface IModelBinder , vous remarquerez que ces classeurs de modèles personnalisés valident toujours les données, quels que soient les attributs. Vous pouvez ajouter quelques lignes de code pour faire respecter le ValidateInput filtre des actions:
// First check if request validation is required
var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;
// Get value
var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
if (valueProviderResult != null)
{
var theValue = valueProviderResult.AttemptedValue;
// etc...
}
Ceci est très bien expliqué par Martijn Boland ici: http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation /
vous pouvez essayer d'accéder au champ comme HttpContext.Demande.Non validés.Form ["FieldName"]
veuillez noter que ces suggestions ne corrigeront pas les problèmes causés par un bogue qui se produit lorsque vous devez utiliser [ValidateInput(false)] en combinaison avec une FormCollection.
voir: ASP.NET MVC 3 ValidateRequest (false) ne fonctionne pas avec FormCollection
si vous utilisez un modèle d'entrée et utilisez un AllowHtml sur la propriété que vous voulez, vous serez débloqué.
public class InputModel
{
[AllowHtml]
public string HtmlInput { get; set; }
}
...
[ValidateInput(false)]
public async Task<ActionResult> ControllerMethod(InputModel model)
{
}
ajouter la ligne de code suivante:
GlobalFilters.Filters.Add(new ValidateInputAttribute(false));
à la méthode Application_Start ().