2010-01-13 17 views
4

Je tente de trouver la méthode optimale de protection contre Cross Site Scripting dans mon application ASP.NET MVC. Je prévoyais d'utiliser la bibliothèque AntiXSS de Microsoft et de protéger essentiellement deux niveaux: 1) Protéger les zones de texte régulières (c'est-à-dire celles qui ne devraient contenir que du texte brut) et 2) Protéger les zones de texte riches qui peuvent générer du HTML. La bibliothèque elle-même est très simple mais j'ai de la difficulté à décider où placer la validation. J'utilise des helpers HTML fortement typés et je lie mes models/viewmodels directement et je voudrais éviter d'appliquer AntiXSS individuellement dans chaque méthode d'action. En outre, je ne souhaite définitivement pas désactiver validateinput sur mes actions de publication, ce qui est une exigence si je transmets du HTML dans l'une des propriétés de mon model/viewmodel.Suggestions pour savoir où placer les appels AntiXSS dans ASP.NET MVC

Existe-t-il quelque part que AntiXSS peut être injecté dans ASP.NET MVC afin qu'il soit appliqué avant de rendre la vue (décoder) et avant d'entrer dans le filtre d'action (encoder)?

Merci à l'avance

Répondre

2

Vous pourriez remplacer la méthode OnActionExecuting de System.Web.Mvc.Controller et utiliser le ActionDescriptor propery sur l'argument ActionExecutingContext de OnActionExecuting pour déterminer quelle action est en cours d'exécution. Vous pourriez alors (je pense) modifier le ActionParameters sur le ActionExecutingContext pour faire l'encodage.

Comptez-vous uniquement utiliser cette fonction pour vérifier le contenu malveillant (AntiXss.GetSafeHtml) ou prévoyez-vous le codage (AntiXss.HtmlEncode)? Si c'est le dernier, j'y penserais car il limite votre format de sortie au HTML seulement, ce qui est probablement correct pour le moment mais pourrait être limitant si ces données doivent être utilisées ailleurs.

+1

Une meilleure solution serait de créer un 'ActionFilterAttribute' qui ferait le même filtrage. Ensuite, vous n'auriez pas à distinguer l'action en utilisant 'ActionDescriptor', mais vous pourriez simplement mettre l'attribut sur les actions du contrôleur qui en ont besoin. – jeffesp