122 votes

Autoriser l'utilisateur à saisir du HTML dans ASP.NET MVC - ValidateInput ou AllowHtml

Comment puis-je permettre à un utilisateur d'entrer du HTML dans un champ particulier en utilisant ASP.net MVC.

J'ai un long formulaire avec de nombreux champs qui sont mappés à cet objet complexe dans le contrôleur.

J'aimerais rendre un champ (la description) autoriser le HTML que je nettoierai moi-même à un moment ultérieur.

3 votes

Pour les futurs visiteurs : À mon avis, les réponses de Chris J ou Eugene Bosikov sont meilleures que celle acceptée pour les versions ultérieures d'ASP.NET MVC, surtout si vous ne souhaitez autoriser le HTML que dans un champ.

165voto

Kelsey Points 26456

Ajoutez l'attribut suivant à l'action (post) dans le contrôleur pour autoriser le HTML :

[ValidateInput(false)] 

Modifier : Conformément aux commentaires de Charlino :

Dans votre fichier web.config, définissez le mode de validation utilisé. Voir MSDN :

Modifier Sept 2014 : Conformément aux commentaires de sprinter252 :

Vous devriez maintenant utiliser l'attribut [AllowHtml]. Voir ci-dessous sur MSDN :

Pour les applications ASP.NET MVC 3, lorsque vous devez envoyer du HTML à votre modèle, ne utilisez pas ValidateInput(false) pour désactiver la validation de la requête. Il suffit d'ajouter [AllowHtml] à la propriété de votre modèle, comme ceci :

public class BlogEntry {
    public int UserId {get;set;}
    [AllowHtml] 
    public string BlogText {get;set;}
 }

1 votes

Si vous utilisez .NET 4, vous devrez également définir dans votre fichier web.config.

0 votes

@Charlino bon point... Je vais modifier ma réponse pour inclure cela et quelques informations supplémentaires.

0 votes

Mais est-ce que cela ne m'empêchera pas d'être capable d'utiliser la validation sur le reste de mon Modèle? J'ai un grand modèle pour cette page en particulier, sans compter tous les autres modèles édités par ce contrôleur sur lesquels je comptais beaucoup utiliser le ModelState et la Validation déclarative à travers les attributs

131voto

cryss Points 974

Que dire de l'attribut [AllowHtml] au-dessus de la propriété ?

5 votes

Cela me semble être une bien meilleure façon, évitant de modifier tout comportement global. Je viens de résoudre mon problème en ajoutant cet attribut à une propriété de mon modèle.

2 votes

Je suis totalement d'accord avec la solution de Chris ici, il n'y a aucune raison de désactiver la validation HTML pour toute l'application si vous avez juste besoin qu'une propriété dans un modèle puisse accepter une entrée HTML. Supprimer la validation dans le web.config ouvrira une grosse faille de sécurité dans votre application.

1 votes

Malheureusement, cela ne fonctionne pas si vous utilisez MetadataTypeAttribute

42voto

Eugene Bosikov Points 216

Ajouter au modèle :

using System.Web.Mvc;

Et à votre propriété

        [AllowHtml]
        [Display(Name = "Body")]
        public String Body { get; set; }

Ce code, de mon point de vue, est la meilleure façon d'éviter cette erreur. Si vous utilisez un éditeur HTML, vous n'aurez pas de problèmes de sécurité car il est déjà restreint.

9voto

reala valoro Points 148

Ajouter [AllowHtml] sur la propriété spécifique est la solution recommandée, car de nombreux blogs et commentaires suggèrent de diminuer le niveau de sécurité, ce qui devrait être inacceptable.

En ajoutant cela, le framework MVC permettra au contrôleur d'être atteint et le code dans ce contrôleur d'être exécuté.

Cependant, cela dépend de votre code, filtres, etc., comment la réponse est générée et s'il y a une autre validation qui pourrait déclencher une erreur similaire.

En tout cas, ajouter l'attribut [AllowHtml] est la bonne réponse, car il permet à HTML d'être désérialisé dans le contrôleur. Exemple dans votre viewmodel:

[AllowHtml]
public string MessageWithHtml {get; set;}

8voto

ViRuSTriNiTy Points 3631

J'ai rencontré le même problème même si j'ai ajouté [System.Web.Mvc.AllowHtml] à la propriété concernée comme décrit dans certaines réponses.

Dans mon cas, j'ai une classe UnhandledExceptionFilter qui accède à l'objet Request avant la validation MVC (et donc AllowHtml n'a pas d'effet) et cet accès déclenche une [HttpRequestValidationException] Une valeur Request.Form potentiellement dangereuse a été détectée depuis le client.

Cela signifie que l'accès à certaines propriétés d'un objet Request déclenche implicitement la validation (dans mon cas, il s'agit de la propriété Params).

Une solution pour empêcher la validation est documentée sur MSDN

Pour désactiver la validation de requête pour un champ spécifique dans une requête (par exemple, pour un élément d'entrée ou une valeur de chaîne de requête), appelez la méthode Request.Unvalidated lorsque vous obtenez l'élément, comme indiqué dans l'exemple suivant

Par conséquent, si vous avez du code comme celui-ci

var lParams = aRequestContext.HttpContext.Request.Params;
if (lParams.Count > 0)
{
  ...

changez-le en

var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;

var lForm = lUnvalidatedRequest.Form;
if (lForm.Count > 0)
{
  ...

ou utilisez simplement la propriété Form qui ne semble pas déclencher de validation

var lForm = aRequestContext.HttpContext.Request.Form;
if (lForm.Count > 0)
{
  ...

1 votes

Merci! Request.Unvalidated a été la seule solution qui a fonctionné pour moi.

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