web-dev-qa-db-fra.com

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

Je suis en train de convertir une application que j'ai créée à l'aide de formulaires Web au cadre asp.net mvc à l'aide de vb.net. J'ai un problème avec l'un de mes points de vue. L'écran jaune de la mort m'indique "Une valeur Request.Form potentiellement dangereuse a été détectée par le client" lorsque je soumets mon formulaire. J'utilise tinymce comme RTE. J'ai mis sur la vue elle-même 

ValidateRequest = "false"

Je sais que dans MVC, ce que je lis jusqu'à présent ne la respecte pas. Donc, je le mets sur l'action du contrôleur aussi. J'ai essayé différentes configurations:

<ValidateInput(False), AcceptVerbs(HttpVerbs.Post)> _

...et...

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _

... et comme ça aussi ...

<ValidateInput(False)> _
<AcceptVerbs(HttpVerbs.Post)> _

Juste pour voir si cela a fait une différence, pourtant je reçois toujours l'écran jaune de la mort. Je souhaite uniquement le définir pour cette vue et l'action spécifique dans mon contrôleur qui concerne mon message. Est-ce que je manque quelque chose?

33
Dekryptid

Etes-vous sûr que l'action du contrôleur enregistrée est celle sur laquelle vous avez les attributs?

17
Chad Moran

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

Définissez les éléments suivants en tant qu'enfant de l'élément <system.web>:

<system.Web>
  ...
  <httpRuntime requestValidationMode="2.0"/>     

Asp.Net 4 définit le paramètre requestValidationMode sur 4.0 par défaut, ce qui indique au système d'effectuer la validation de la demande avant la phase BeginRequst de la demande HTTP. La validation aura lieu avant que le système n'atteigne l'attribut d'action lui indiquant de ne pas valider la demande, rendant ainsi l'attribut inutile. La définition de requestValidationMode = "2.0" rétablira le comportement de validation de la demande asp.net 2.0, permettant ainsi à l'attribut ValidateInput de fonctionner comme prévu.

130
Jim Geurts

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. respectez le filtre ValidateInput 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 expliqué très bien par Martijn Boland ici: http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/

3
Rahatur

Vous pouvez essayer d'accéder au champ comme HttpContext.Request.Unvalidated.Form ["FieldName"]

1
Chitta

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

0
Frank van Eykelen

Si vous utilisez un modèle d'entrée et utilisez un AllowHtml sur la propriété souhaitée, vous serez débloqué.

public class InputModel
{
    [AllowHtml]
    public string HtmlInput { get; set; }
}

...
[ValidateInput(false)]
public async Task<ActionResult> ControllerMethod(InputModel model)
{
}
0
Tarek Ayna