Comment puis-je autoriser un utilisateur à saisir du code HTML dans un champ particulier à l'aide d'ASP.net MVC.
J'ai un formulaire long avec de nombreux champs qui sont mappés à cet objet complexe dans le contrôleur.
Je voudrais faire en sorte qu'un champ (la description) autorise le HTML sur lequel je préformerai mon propre assainissement plus tard.
Réponses:
Ajoutez l'attribut suivant l'action (post) dans le contrôleur pour lequel vous souhaitez autoriser le HTML:
Edit: Selon les commentaires de Charlino :
Dans votre web.config, définissez le mode de validation utilisé. Voir MSDN :
Edit septembre 2014: selon sprinter252 commentaires:
Vous devez maintenant utiliser l'
[AllowHtml]
attribut. Voir ci-dessous à partir de MSDN :la source
<httpRuntime requestValidationMode="2.0" />
dans votre fichier web.config.Qu'en est-il de l'
[AllowHtml]
attribut au-dessus de la propriété?la source
MetadataTypeAttribute
et est préférable car elle n'autorise le HTML que sur les champs individuels plutôt que sur l'objet entier.Ajouter au modèle:
Et à votre propriété
Ce code de mon point de vue le meilleur moyen d'éviter cette erreur. Si vous utilisez l'éditeur HTML, vous n'aurez pas de problèmes de sécurité car il est déjà restreint.
la source
L'ajout
[AllowHtml]
de 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 de ce contrôleur à exécuter.
Cependant, cela dépend de votre code, de vos filtres, etc., de la manière dont la réponse est générée et de l'existence d'une validation supplémentaire susceptible de déclencher une autre erreur similaire.
Dans tous les cas, l'ajout d'un
[AllowHtml]
attribut est la bonne réponse, car il permet de désérialiser le html dans le contrôleur. Exemple dans votre viewmodel:la source
J'ai rencontré le même problème bien que j'aie ajouté
[System.Web.Mvc.AllowHtml]
à la propriété concernant comme décrit dans certaines réponses.Dans mon cas, j'ai une
UnhandledExceptionFilter
classe qui accède à l'objet Request avant la validation MVC (et donc AllowHtml n'a pas d'effet) et cet accès déclenche un[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client
.Cela signifie que l'accès à certaines propriétés d'un objet Request déclenche implicitement la validation (dans mon cas, c'est la
Params
propriété).Une solution pour empêcher la validation est documentée sur MSDN
Par conséquent, si vous avez un code comme celui-ci
changez-le en
ou utilisez simplement la
Form
propriété qui ne semble pas déclencher la validationla source
Si vous devez autoriser l'entrée html pour le paramètre de méthode d' action (par opposition à "propriété du modèle"), il n'y a pas de moyen intégré de le faire, mais vous pouvez facilement y parvenir en utilisant un classeur de modèle personnalisé:
Le code AllowHtmlBinder:
Trouvez le code source complet et l'explication dans mon article de blog: https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/
la source
L'encodage d'URL des données fonctionne aussi bien pour moi
Par exemple
var data = '<b> Bonjour </b>'
Dans le navigateur, appelez encodeURIComponent (données) avant de publier
Sur le serveur, appelez HttpUtility.UrlDecode (receive_data) pour décoder
De cette façon, vous pouvez contrôler exactement la zone de champs autorisée à avoir du HTML
la source
J'ai rencontré ce problème lors du développement d'un site E-Commerce utilisant NopCommerce, j'ai obtenu cette solution de 3 manières différentes comme les réponses précédentes. Mais selon la structure NopCommerce, je n'ai pas trouvé ces trois à la fois. Je viens de voir que là-bas, ils utilisent juste
[AllowHtml]
et ça marche bien sauf aucun problème. Comme question précédemment poséePersonnellement, je ne préfère pas
[ValidateInput(false)]
parce que je saute la vérification totale de l'entité du modèle, ce qui n'est pas sûr. Mais si quelqu'un vient d'écrire, regarde icialors il ne fait qu'ignorer une seule propriété, et n'autorise qu'une propriété particulière et ne vérifie presque pas toutes les autres entités. Par conséquent, il semble préférable envers le mien.
la source
Dans mon cas, l'attribut AllowHtml ne fonctionnait pas lorsqu'il était combiné avec le filtre d'action OutputCache. Cette réponse a résolu le problème pour moi. J'espère que cela aide quelqu'un.
la source
Vous pouvez utiliser
[AllowHtml]
pour votre projet par exemplePour utiliser ce code dans la bibliothèque de classes, vous installez ce package
Après utilisation
using
la source
Aucune des réponses ici n'a fonctionné pour moi malheureusement.
J'ai fini par utiliser la liaison de modèle personnalisée et j'ai utilisé un désinfectant tiers.
Voir ma question auto-répondue ici .
la source