Procedura: visualizzare messaggi di errore protetti
Aggiornamento: novembre 2007
È opportuno che i messaggi di errore visualizzati dall'applicazione non forniscano informazioni che possano essere utilizzate da un utente intenzionato a violare il sistema. Se, ad esempio, l'applicazione non riesce ad eseguire l'accesso a un database, il nome utente da essa utilizzato non dovrà essere indicato nel messaggio di errore visualizzato.
È possibile controllare i messaggi di errore in numerosi modi, tra cui:
Configurare l'applicazione in modo che non visualizzi messaggi di errore dettagliati agli utenti remoti. Gli utenti remoti sono coloro che non richiedono le pagine mentre lavorano sul computer che funge da server Web. È anche possibile reindirizzare gli errori a una pagina dell'applicazione.
Quando possibile e opportuno, utilizzare la gestione degli errori e generare messaggi di errore propri. Nel gestore errori è possibile definire un comportamento diverso per il caso in cui l'utente sia locale.
Creare un gestore errori globale a livello di pagina o di applicazione che intercetti tutte le eccezioni non gestire e le instradi verso una pagina di errore generica. In tal modo anche se non si è potuto prevedere un determinato problema, almeno gli utenti non vedranno una pagina di eccezione.
Per configurare l'applicazione in modo da disattivare la visualizzazione degli errori per gli utenti remoti
Nel file Web.config dell'applicazione apportare le seguenti modifiche all'elemento customErrors:
Impostare l'attributo mode su RemoteOnly (viene fatta la distinzione tra maiuscole e minuscole). L'applicazione verrà così configurata in modo da visualizzare il dettaglio degli errori solo agli utenti locali, cioè allo sviluppatore.
In alternativa, includere un attributo defaultRedirect che rimandi a una pagina di errore a livello di applicazione.
È anche possibile includere elementi <error> che rimandino a pagine specifiche a seconda dell'errore. Nel caso in cui si verifichi un errore 404 standard (pagina non trovata) è ad esempio possibile eseguire un reindirizzamento alla pagina principale dell'applicazione.
Nell'esempio di codice riportato di seguito viene illustrato un tipico blocco customErrors nel file Web.config.
<customErrors mode="RemoteOnly" defaultRedirect="AppErrors.aspx"> <error statusCode="404" redirect="NoSuchPage.aspx"/> <error statusCode="403" redirect="NoAccessAllowed.aspx"/> </customErrors>
Per includere la gestione degli errori
Utilizzare un blocco try-catch intorno alle istruzioni che potrebbero generare errori.
È anche possibile verificare se si tratta di un utente locale mediante la proprietà IsLocal e modificare la gestione degli errori di conseguenza. Il valore 127.0.0.1 è equivalente a localhost e indica che il browser risiede sullo stesso computer del server Web.
Nell'esempio di codice riportato di seguito viene illustrato un blocco di gestione degli errori. Se si verifica un errore, il dettaglio del messaggio viene caricato in una variabile di stato Session e l'applicazione visualizza una pagina in grado di accedere alla variabile Session e visualizzare l'errore. L'errore verrà riportato in modo da non fornire dettagli utili a utenti che intendano violare il sistema. Se l'utente è locale, verrà visualizzato un dettaglio diverso. Nel blocco finally viene rilasciata una risorsa aperta.
Try SqlConnection1.Open() SqlDataAdapter1.Fill(Me.DsPubs1) Catch ex As Exception If Request.IsLocal Then Session("CurrentError") = ex.Message Else Session("CurrentError") = "Error processing page." End If Server.Transfer("ApplicationError.aspx") Finally SqlConnection1.Close() End Try
try { sqlConnection1.Open(); sqlDataAdapter1.Fill(dsCustomers1); } catch (Exception ex) { if(Request.IsLocal) { Session["CurrentError"] = ex.Message; } else { Session["CurrentError"] = "Error processing page."; } Server.Transfer("ApplicationError.aspx"); } finally { this.sqlConnection1.Close(); }
Creazione di un gestore errori globale
È anche possibile creare un gestore degli errori che intercetti tutte le eccezioni non gestite a livello di pagina o di applicazione.
Per creare un gestore errori globale
Per creare un gestore errori globale in una pagina, creare un gestore per l'evento TemplateControl.Error. Per creare un gestore errori a livello dell'applicazione, aggiungere codice all'evento HttpApplication.Error nel file Global.asax. Questi metodi vengono chiamati quando si verifica un'eccezione non gestita in qualunque punto, rispettivamente, della pagina o dell'applicazione. È possibile ottenere informazioni sull'errore più recente tramite il metodo GetLastError.
Nota: Se si definisce un gestore errori globale, avrà la precedenza sulla gestione degli errori specificata nell'attributo defaultRedirect dell'elemento di configurazione customErrors.
Nell'esempio di codice riportato di seguito viene illustrato un gestore che recupera informazioni sull'errore corrente e le inserisce in una variabile Session, quindi viene chiamata una pagina di gestione errori generica in grado di estrarre e visualizzare le informazioni.
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) Session("CurrentError") = "Global: " & _ Server.GetLastError.Message Server.Transfer("lasterr.aspx") End Sub
protected void Application_Error(Object sender, EventArgs e) { Session["CurrentError"] = "Global: " + Server.GetLastError().Message; Server.Transfer("lasterr.aspx"); }