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.