Alkampfer's Place

Il blog di Gian Maria Ricci
posts - 659, comments - 871, trackbacks - 80

My Links

News

Gian Maria Ricci Mvp Logo CCSVI in Multiple Sclerosis

English Blog

Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

I miei siti

Siti utili

Validare gli input dell’utente seconda parte

Nel post precedente ho mostrato una rudimentale tecnica per validare I parametri (get e post) che un utente può passare ad una pagina web asp.net. La tecnica mostrata ha una pecca, è intrusiva perché obbliga a fare una pagina base da cui tutte le pagine ereditano. Questa tecnica è utile se la pagina deve determinare dinamicamente le regole per i parametri, ma se tali regole sono statiche per ogni pagina è preferibile un approccio meno invasivo, il primo passo è allora fare un proprio HttpModule che gestisca la validazione.

public class InputValidationModule : IHttpModule {
   #region IHttpModule Members
 
   
private WindsorContainer RuleContainer;
 
   
public void Dispose() {
      RuleContainer.Dispose();
   }
 
   
public void Init(HttpApplication context) {
      RuleContainer = 
new WindsorContainer(HttpContext.Current.Server.MapPath("Rules.xml"));
      context.BeginRequest += Application_BeginRequest;
   }
 
   #endregion
 
   
public void Application_BeginRequest(object sender, System.EventArgs args) {
      
String componentName = HttpContext.Current.Request.Path.ToLower();
      
if (RuleContainer.Kernel.HasComponent(componentName)) {
         
PageInputRules rules = RuleContainer.Resolve<PageInputRules>(componentName);
         
if (!rules.Validate(
            
HttpContext.Current.Request.QueryString,
            
HttpContext.Current.Request.Form)) {
            
throw new SecurityException("Input data is not valid!");
         }
      }
   }
}

Come si può vedere il modulo si basa su un container IOC di tipo Castle.Windsor.WindsorContainer, in questo modo io posso fare un file Xml di configurazione esterno dove per ogni pagina configuro uno specifico oggetto per la validazione. Ecco ad esempio il mio file Rule.xml

<?xml version="1.0" encoding="utf-8" ?>
<CastleWindsor>
 
   <components>
 
      <component
            id="mailaddr"
            service="FileDownload.Validation.IParamValidator, FileDownload"
            type="FileDownload.Validation.RegexInputValidator, FileDownload"
            lifestyle="singleton">
         <parameters>
            <regularExpression>[\w-]+@([\w-]+\.)+[\w-]+</regularExpression>
         </parameters>
      </component>
 
      <component
         id="/validator.aspx"
         service="FileDownload.Validation.PageInputRules, FileDownload"
         type="FileDownload.Validation.PageInputRules, FileDownload"
         lifestyle="singleton">
         <parameters>
            <Rules>
               <dictionary keyType="System.String, mscorlib" valueType="FileDownload.Validation.IParamValidator, FileDownload">
                  <entry key="mailaddr">${mailaddr}</entry>
               </dictionary>
            </Rules>
         </parameters>
      </component>
   </components>
</CastleWindsor>

L'eccellente configurabilità di Windsor mi permette di creare un oggetto PageInputRule singleton e configurare il suo dictionary di regole. Nel caso appena mostrato ho impostato che la pagina ammetta un solo parametro di tipo mailaddr il cui validatore è l'oggetto con id=mailaddr.

Alk.

Print | posted on mercoledì 10 ottobre 2007 17:03 | Filed Under [ Security ]

Feedback

Gravatar

# re: Validare gli input dell’utente seconda parte

Nonostante l'idea della validazione fatta con un modulo ASP.NET sia originale e stravagante non mi sembra una gran idea sinceramente, soprattutto perchè l'impatto sull'applicazione è superfluo. La validazione dei parametri della richiesta HTTP secondo me sono meglio gestiti a livello di singola pagina attraverso i validator delle WebForms o quant'altro.
12/10/2007 14:35 | Simone Busoli
Gravatar

# re: Validare gli input dell’utente seconda parte

Per quanto riguarda i parametri di post sicuramente i validatori ASP.NEt vanno bene. Per la querystring invece non ci sono validatori che tengano. La validazione fatta in questo modo serve principalmente per la security, mentre la validazione più funzionale è deputata alle singole pagine.
Ad esempio intercettando tutti i parametri di post puoi usare librerie di Anti Cross Site Scripting in maniera autonoma rispetto alle singole pagine.

Alk.
15/10/2007 10:30 | Gian Maria
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET