Protezione dei controlli standard
Aggiornamento: novembre 2007
I controlli ASP.NET standard sono un gruppo di controlli che consentono di creare form in cui gli utenti possono digitare o selezionare informazioni prima che venga eseguito il postback di una pagina al server. I controlli standard sono controlli server Web che ereditano dalla classe Control. Esempi di controlli server Web includono i controlli TextBox, Image e AdRotator. In questo argomento vengono descritte le procedure consigliate di configurazione e codifica che consentiranno di migliorare la protezione dei controlli standard.
Sebbene le procedure consigliate di configurazione e codifica riportate di seguito consentano di migliorare la protezione dell'applicazione, è comunque importante mantenere costantemente aggiornato il server applicazioni installando i più recenti aggiornamenti per la protezione di Microsoft Windows e Internet Information Services (IIS), nonché tutti gli aggiornamenti per la protezione di Microsoft SQL Server o altre origini dati.
Per informazioni più dettagliate sulle procedure consigliate per scrivere codice protetto e proteggere le applicazioni, consultare il testo "Writing Secure Code" di Michael Howard e David LeBlanc o leggere le istruzioni disponibili sul sito Web Microsoft Patterns and Practices (informazioni in lingua inglese).
Negli argomenti seguenti sono disponibili informazioni su speciali procedure di protezione per altri tipi di controlli:
Controllo AdRotator
Il controllo AdRotator consente di visualizzare annunci definiti in un file di annunci che, per impostazione predefinita, è un file XML. In alternativa, è possibile archiviare annunci in un database ed estrarli a livello di programmazione. Per garantire la protezione del controllo AdRotator, attenersi alle seguenti istruzioni:
Se si sta utilizzando un file XML per archiviare informazioni sugli annunci, posizionarlo nella cartella App_Data del sito Web, poiché il contenuto della cartella non verrà visualizzato in risposta alle richieste Web.
Per una maggiore protezione, non utilizzare l'estensione file xml nei file di annunci. Utilizzare invece un'estensione quale ads e quindi eseguirne il mapping ad ASP.NET in IIS e al gestore non consentito in ASP.NET utilizzando il seguente elemento nel file Web.config del sito:
<httpHandlers> <add verb="*" path="*.ads" type="System.Web.HttpForbiddenHandler" /> </httpHandlers>
Per informazioni sul mapping di un'estensione file ad ASP.NET in IIS, vedere Procedura: registrare gestori HTTP.
Impostare le autorizzazioni appropriate (in genere di sola lettura) per gli account utente che leggeranno il file degli annunci. Se il sito Web supporta l'accesso anonimo, questo corrisponde in genere all'account utente ASPNET locale o all'account NETWORK SERVICE.
Se il file degli annunci non è presente, il controllo AdRotator genera un errore in cui vengono visualizzati il percorso e il nome del file, ovvero informazioni potenzialmente riservate. Per evitare il problema, avvalersi di tecniche di gestione degli errori adeguate, impostando ad esempio l'elemento customErrors nel file di configurazione per il reindirizzamento a una pagina di errori personalizzata e la creazione di un gestore di errori globale che venga chiamato in caso di eccezione non gestita nell'applicazione. Per informazioni dettagliate, vedere Procedura: visualizzare messaggi di errore protetti.
Se si stanno leggendo informazioni sugli annunci da un database, seguire le istruzioni per la protezione dell'accesso al database. Per informazioni dettagliate, vedere Protezione dell'accesso ai dati.
Esaminare attentamente tutte le informazioni sugli annunci recuperate da un'origine non attendibile prima di utilizzarle con il controllo AdRotator. Poiché non esegue alcuna convalida o verifica delle informazioni lette dal file degli annunci, tale controllo esegue il rendering delle immagini e degli URL nella pagina Web esattamente come sono visualizzati nel file degli annunci o nel database.
BulletedList, CheckBoxList, RadioButtonList, DropDownList, ListBox
I controlli BulletedList, CheckBoxList, DropDownList, ListBox e RadioButtonList eseguono il rendering di diversi tipi di elementi HTML (ul, input e select) in base al contenuto degli insiemi o in base ai dati di un database. Per agevolare la protezione di questi controlli, attenersi alle seguenti istruzioni:
Se i controlli leggono informazioni da un database, seguire le istruzioni per la protezione dell'accesso al database. Per informazioni dettagliate, vedere Protezione dell'accesso ai dati.
Se non si è certi che le informazioni da visualizzare contengano script o altro markup, gestire l'evento DataBinding del controllo e codificare in HTML le informazioni prima di visualizzarle. Per informazioni dettagliate, vedere Procedura: proteggere da attacchi tramite script in un'applicazione Web applicando alle stringhe la codifica HTML.
Se il controllo BulletedList è configurato per visualizzare immagini o collegamenti ipertestuali, verificare che l'URL dell'immagine o del collegamento faccia riferimento a un percorso attendibile.
Controllo Calendar
Il controllo Calendar esegue il rendering dei controlli LinkButton per consentire lo spostamento nel calendario. I controlli LinkButton utilizzano script client per eseguire un postback. Se nel browser è stato disattivato lo script client per motivi di protezione, il controllo Calendar non supporterà lo spostamento.
È sempre possibile utilizzare il controllo Calendar per visualizzare date, anche se non lo si sta utilizzando per consentire lo spostamento tra date. Non presupporre che tutte le date selezionate in un controllo Calendar siano formattate correttamente. Quando si convertono le date del controllo Calendar in un formato DateTime interno, assicurarsi di utilizzare la procedura di gestione degli errori appropriata nel caso in cui il formato della data non sia corretto.
Controllo FileUpload
Il controllo FileUpload consente agli utenti di caricare un file dal proprio computer al computer server Web. Per garantire la protezione del controllo FileUpload, attenersi alle seguenti istruzioni:
Non considerare attendibili i file caricati dagli utenti, poiché utenti malintenzionati potrebbero tentare di caricare file eseguibili. Quando si salva un file caricato, controllarne l'estensione o assegnargli un'estensione personalizzata.
Non consentire agli utenti di specificare un percorso arbitrario per il salvataggio del file caricato. Verificare che il nome del file non contenga informazioni sul percorso aggiunte da altri utenti.
Non mostrare la struttura interna del sito Web agli utenti che caricano i file.
Sulla cartella o le cartelle in cui verranno salvati i file caricati impostare autorizzazioni di lettura/scrittura per gli account utente che eseguiranno l'applicazione. Se il sito Web supporta l'accesso anonimo, sarà in genere l'account utente ASPNET locale o l'account NETWORK SERVICE. Limitare tuttavia le autorizzazioni di lettura/scrittura solo alla cartella o alle cartelle in cui verranno archiviati i file caricati.
Proteggersi dagli attacchi Denial of Service impostando l'attributo maxRequestLength dell'elemento httpRuntime nel file di configurazione. Per impostazione predefinita, la lunghezza massima della richiesta è di 4 MB. Altre impostazioni di configurazione che possono influire sulla dimensione dei file caricati sono l'attributo requestLengthDiskThreshold dell'elemento httpRuntime e l'attributo memoryLimit dell'elemento processModel.
Stabilire la dimensione del file caricato eseguendo una query della proprietà ContentLength dell'oggetto HttpPostedFile restituito dal controllo e utilizzare tale dimensione per decidere se accettare o meno il file.
Controllo HiddenField
Il controllo HiddenField consente di impostare il contenuto degli elementi HTML <input type="hidden"> nel codice lato server. Per memorizzare nella pagina informazioni utili per l'elaborazione di questa ma che non devono essere visualizzate dagli utenti, vengono utilizzati campi nascosti. Per garantire la protezione del controllo HiddenField, attenersi alle seguenti istruzioni:
Non memorizzare informazioni riservate nei controlli HiddenField. Sebbene non siano visibili nel browser, tali informazioni sono infatti parte integrante della pagina e possono essere facilmente visualizzate dagli utenti nel codice sorgente di questa.
Non considerare attendibili le informazioni presenti nei campi nascosti. Utenti malintenzionati possono alterare il contenuto dei campi nascosti.
Hyperlink
Il controllo HyperLink esegue il rendering di un URL nel browser. Verificare che l'URL faccia riferimento a un percorso attendibile.
Controlli Image e ImageMap
Per visualizzare immagini, i controlli Image e ImageMap eseguono il rendering di un URL nel browser. Verificare che l'URL faccia riferimento a un percorso attendibile.
Controllo ImageButton
Il controllo ImageButton esegue il rendering di un'immagine (elemento img) che utilizza uno script client per eseguire un postback. Se nel browser è stato disattivato lo script client per motivi di protezione, il controllo non funzionerà.
Per visualizzare l'immagine, il controllo esegue il rendering di un URL nel browser. Verificare che l'URL faccia riferimento a un percorso attendibile.
Controlli Label e Literal
I controlli Label e Literal visualizzano testo sulla pagina passandolo al browser così com'è. Il controllo Label consente inoltre di specificare la formattazione. Se il testo contiene markup HTML, per impostazione predefinita questo verrà interpretato dal browser che provvederà quindi a eseguire il rendering del testo che potrebbe implicare l'esecuzione di script.
Se si sta utilizzando il controllo Label e non si è certi che il testo includa contenuto dannoso, utilizzare la codifica HTML per convertire il codice HTML nella relativa rappresentazione testuale. Per informazioni dettagliate, vedere Procedura: proteggere da attacchi tramite script in un'applicazione Web applicando alle stringhe la codifica HTML.
Se si sta utilizzando il controllo Literal e non si sa con certezza se il testo include contenuto dannoso, eseguire una delle operazioni descritte di seguito:
Impostare la proprietà LiteralMode del controllo su Encode, per codificare automaticamente il contenuto HTML.
Utilizzare la codifica HTML per convertire il codice HTML nella relativa rappresentazione testuale. Per informazioni dettagliate, vedere Procedura: proteggere da attacchi tramite script in un'applicazione Web applicando alle stringhe la codifica HTML.
Per ulteriori informazioni, vedere Procedura: proteggere da attacchi tramite script in un'applicazione Web applicando alle stringhe la codifica HTML.
Controllo LinkButton
Il controllo LinkButton esegue il rendering di un collegamento (elemento a) che utilizza uno script client per eseguire un postback. Se nel browser è stato disattivato lo script client per motivi di protezione, il controllo non funzionerà.
MultiView
Il controllo MultiView consente di aggiungere più controlli View e visualizzarli in base a determinate condizioni. Questo consente di creare pagine simili a form a più pagine.
Se per cambiare visualizzazione si utilizzano elementi facilmente alterabili, come una stringa di query dell'URL, gli utenti potrebbero essere in grado di accedere a una visualizzazione che non si intendeva rendere loro accessibile. Quindi, assicurarsi che i meccanismi per cambiare visualizzazione siano adeguatamente protetti. Per ulteriori informazioni, vedere la classe Cenni preliminari sulla gestione dello stato ASP.NET.
Controllo TextBox
Poiché il controllo TextBox consente agli utenti di immettere qualsiasi testo nella pagina, è necessario fare attenzione quando si accetta input utente con questo controllo. Per garantire la protezione del controllo TextBox, attenersi alle seguenti istruzioni:
Utilizzare controlli di convalida ogni volta che è possibile, per limitare l'input degli utenti a valori accettabili. Per informazioni dettagliate, vedere Introduzione ai controlli di convalida.
Verificare che la proprietà IsValid sia impostata su true prima di eseguire il codice lato server.
Utilizzare la convalida server ridondante. Questa indicazione è particolarmente valida per i controlli CustomValidator; non creare una logica di convalida esclusivamente per il lato client.
Impostare la proprietà MaxLength del controllo TextBox per limitare la quantità di testo che gli utenti possono immettere. Utenti malintenzionati possono compromettere le prestazioni dell'applicazione e causare errori del database inviando enormi quantità di informazioni in una casella di testo.
Codificare l'input dell'utente con il metodo HtmlEncode, che trasforma il documento HTML nella relativa rappresentazione testuale. Ad esempio, <b> diventa <b> e contribuisce a impedire che il documento HTML venga eseguito in un browser. Per informazioni dettagliate, vedere Procedura: proteggere da attacchi tramite script in un'applicazione Web applicando alle stringhe la codifica HTML.
Impostare la proprietà TextMode su Password per evitare che il contenuto della casella di testo venga visualizzato come testo in chiaro mediante la visualizzazione di punti in sostituzione di questo. Tenere presente che l'impostazione della proprietà TextMode su Password non fornisce ulteriore protezione. Il contenuto della casella di testo non viene crittografato né offuscato in altro modo e le informazioni vengono inviate al server come testo non crittografato. Pertanto, quando si utilizza Password, si consiglia di specificare altri metodi per garantire la protezione dei dati.
Se si stanno raccogliendo informazioni riservate, come una password o un numero di carta di credito, utilizzare SSL (Secure Sockets Layer) per proteggere le comunicazioni tra il client e il server. Questa procedura è valida per qualsiasi utilizzo dei controlli TextBox, inclusi quelli che incorporano i controlli TextBox, come il controllo CreateUserWizard.
Procedura guidata
Il controllo Wizard consente di creare form di immissione in più passaggi. Quando si utilizza il controllo Wizard, tenere presenti le seguenti considerazioni sulla protezione:
Il controllo Wizard non prevede alcun meccanismo intrinseco di protezione delle informazioni riservate. Se si stanno raccogliendo dati riservati nella procedura guidata, utilizzare SSL per proteggere le comunicazioni tra il client e il server per la pagina contenente il controllo Wizard.
Per supportarne la funzionalità, il controllo Wizard include diversi controlli non visibili. Un utente potrebbe modificare questi controlli e i relativi valori per alterare l'ordine di visualizzazione dei passaggi della procedura o per visualizzare passaggi destinati solo ad alcuni utenti. Per impedire che ciò avvenga, verificare che i passaggi della procedura vengano visualizzati nell'ordine corretto e che i passaggi contenenti informazioni riservate non vengano visualizzati, a meno che non si verifichino le condizioni adeguate.
Controllo XML
Il controllo Xml visualizza il contenuto di un file XML o una stringa contenente codice XML su una pagina, eventualmente applicando una trasformazione XML. Per garantire la protezione del controllo Xml, attenersi alle seguenti istruzioni:
Quando si visualizza il contenuto di un file XML, se possibile, posizionare il file XML nella cartella App_Data del sito, poiché il contenuto della cartella non verrà visualizzato in risposta alle richieste Web.
Visualizzare codice XML solo da origini attendibili.
Utilizzare solo trasformazioni da origini attendibili.