Prevenire (e curare) attacchi di script injection con ASP.NET

di Daniele Bochicchio, in ASP.NET, C#, global.asax,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi