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.
Approfondimenti
Short-circuiting della Pipeline in ASP.NET Core
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Migrare una service connection a workload identity federation in Azure DevOps
Implementare il throttling in ASP.NET Core
Load test di ASP.NET Core con k6
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Evitare (o ridurre) il repo-jacking sulle GitHub Actions