2009-02-06 10 views
2

J'ai un contrôle que j'écris où je veux désactiver la validation de requête intégrée de .NET qui empêche les attaques XSS et les types de saletés similaires.Désactiver la validation de la demande par programme

Le contrôle permet au propriétaire d'un site Web d'ajuster le contenu de cette page. Ils peuvent potentiellement entrer un balisage s'ils le souhaitent. Puisque c'est leur site à éditer, ils doivent être capables de coller ce qu'ils veulent là-bas.

Je me demande s'il est possible de désactiver cette validation par programme?

La seule façon de le faire est de fermer complètement la validation de la requête dans web.config ou en utilisant une directive page. Pour diverses raisons, je ne peux pas avoir ce contrôle sur une autre page - donc cette option est désactivée.

Répondre

2

Dans le System.Web.Configuration

PagesSection pageSection = new PagesSection(); 
pageSection.ValidateRequest = false; 

Reference

+1

n'avez-vous pas besoin de la section de configuration actuelle? J'avais besoin de faire ceci pour lire la valeur, sinon j'ai juste la valeur par défaut. Peut-être différent pour l'écriture si (?). var pagesSection = System.Configuration.ConfigurationManager.GetSection ("system.web/pages") en tant que PagesSection; – misteraidan

1

m'a conduit dans @ Chris la bonne direction. Ce que j'ai fait était de désactiver le paramètre dans le web.config et utilisé un module HTTP pour faire la validation de la demande pour toutes les demandes où l'utilisateur n'est pas en mode EditMode.

Dans .NET 2.0, il existe une méthode sur la classe Request appelée: ValidateInput. Cela effectuera la validation même si elle est désactivée dans le fichier web.config.

3

Aucune des réponses décrites ici ne va assez loin. Les éléments de configuration étant en lecture seule, vous devez d'abord les modifier pour pouvoir les écrire. De plus, depuis la publication de .NET 4, vous devez également modifier la propriété HttpRuntime.RequestValidationMode avant que cette propriété Pages.ValidateRequest ne soit reconnue.

public void ModifiyValidation(bool validate) { 

    var pagesSection = System.Configuration.ConfigurationManager.GetSection("system.web/pages") as PagesSection; 
    var httpRuntime = System.Configuration.ConfigurationManager.GetSection("system.web/httpRuntime") as HttpRuntimeSection; 

    if (pagesSection != null && httpRuntime != null && pagesSection.ValidateRequest != validate) 
    { 
     var fi = typeof (ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 
     fi.SetValue(pagesSection, false); 
     fi.SetValue(httpRuntime, false); 
     pagesSection.ValidateRequest = validate; 
     httpRuntime.RequestValidationMode = new Version(validate ? "4.0" : "2.0"); 
     fi.SetValue(pagesSection, true); 
     fi.SetValue(httpRuntime, true); 
    } 
} 

Vous devez également savoir que le seul sera activé sur le suivant demande.

Questions connexes