A partire dalla versione 1.1 di ASP.NET, per prevenire attacchi di tipo SQL e script injection, è stato introdotto un nuovo controllo per evitare questo genere di attacchi, che puntano ad inserire codice esterno all'interno delle nostre pagine.
E' sufficiente inserire (anche se è attivo di default) la proprietà ValidateRequest (con valore true) nella direttiva Page per abilitare una routine particolare.
Il confronto non è fatto attraverso una Regular Expression, ma passando per una serie di controlli, che si possono riassumere in questo modo:
- il carattere "<" seguito da un carattere alfanumerico, oppure da "!" (per i commenti)
- la sequenza "" per prevenire l'inserimento di codici particolari
- la parola "script", seguita da spazi o virgole.
- la parola "expression", per evitare injection come style="a:expression(javascript)"
- la parola "on" preceduta da spazi, seguita da caratteri alfanumeri, seguita da spazi, seguita da =, per prevenire injection di codice come "onClick="
Viene fatto su qualsiasi cosa sia passato a Request.Form, Request.Querystring e Request.Cookies.
E' dunque un primo livello per verificare l'esattezza dell'input inviato dall'utente e deve essere sempre associato a controlli successivi, come l'uso di HtmlEncode per prevenire la visualizzazione a video del codice inserito dall'utente.
In caso di invio di codice considerato malizioso, dunque, viene generata un'eccezione di tipo HttpRequestValidationException.
L'inconveniente è che non è considerata come un'eccezione particolare, ma è gestita come una qualsiasi eccezione a livello di pagina.
Ci sono dunque diversi modi per visualizzare un avviso che non sia quello di default o comunque quello personalizzato.
La via più semplice è gestire l'errore all'interno del global.asax, con un codice come questo:
<%@ Import Namespace="System" %> <%@ Import Namespace="System.Web" %> <SCRIPT LANGUAGE="C#" RUNAT="SERVER"> void Application_Error (Object s, EventArgs e ) { // verifica tipo di errore Exception ex = Server.GetLastError(); if (ex.GetType().ToString() == "System.Web.HttpRequestValidationException") { Response.Redirect("/errori/injection.aspx"); } } </SCRIPT>
In questo modo potremo mostrare una pagina che spieghi all'utente il perchè dell'errore ed eventualmente avvisarlo dei limiti riguardanti l'invio di dati.
E' sempre possibile intercettare l'errore a livello di pagina, con l'evento Page_Error, o creando un HttpModule.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.