Suggerimenti di base sulla sicurezza delle applicazioni Web ASP.NET

Anche se si dispone di esperienze e conoscenze limitate riguardo alla sicurezza delle applicazioni, vi sono misure di base da prendere comunque per proteggere le applicazioni Web. Nelle sezioni dell'argomento riportate di seguito sono descritte le precauzioni di sicurezza minime da adottare in tutte le applicazioni Web. Per informazioni più dettagliate sulle procedure consigliate per scrivere codice sicuro e proteggere le applicazioni, consultare il testo "Writing Secure Code" di Michael Howard e David LeBlanc e leggere le istruzioni disponibili sul sito Web Microsoft Patterns and Practices.

  • Suggerimenti generali per la protezione delle applicazioni Web

  • Eseguire le applicazioni con i minimi privilegi

  • Conoscere gli utenti

  • Proteggersi dagli input utente dannosi

  • Accedere ai database secondo logiche di protezione

  • Creare messaggi di errore sicuri

  • Proteggere le informazioni riservate

  • Utilizzare i cookie secondo logiche di protezione

  • Proteggersi dagli attacchi denial of service

Suggerimenti generali per la sicurezza delle applicazioni Web

Tuttavia, anche la più elaborata sicurezza di un'applicazione può fallire se un utente malintenzionato può accedere ai computer con facilità. I suggerimenti generali per la sicurezza delle applicazioni Web comprendono:

  • Eseguire spesso i backup dei dati e conservarli in un luogo fisicamente sicuro.

  • Collocare il server Web in un luogo fisicamente sicuro affinché utenti non autorizzati non possano accedervi, spegnerlo, rubarlo e così via.

  • Utilizzare il file system Windows NTFS, non FAT32. NTFS offre una sicurezza di gran lunga superiore a quella offerta da FAT32. Per informazioni dettagliate, vedere la documentazione della Guida di Windows.

  • Proteggere il server Web e tutti i computer della stessa rete con password sicure.

  • Seguire le procedure consigliate per la sicurezza di Internet Information Services (IIS). Per ulteriori dettagli, vedere Windows Server TechCenter for IIS.

  • Chiudere le porte non utilizzate e arrestare i servizi non utilizzati.

  • Eseguire un controllo antivirus che esegua il monitoraggio del traffico del sito.

  • Utilizzare un firewall. Per ulteriori suggerimenti, vedere Microsoft Firewall Guidelines nel sito Web Microsoft per la sicurezza.

  • Conoscere e installare i più recenti aggiornamenti per la sicurezza diffusi da Microsoft e da altri produttori.

  • Utilizzare le funzionalità di log eventi di Windows ed esaminare frequentemente i log per individuare eventuali attività sospette. Tali attività includono tentativi ripetuti di effettuare l'accesso al sistema e un'impennata delle richieste pervenute al server Web.

Eseguire le applicazioni con i minimi privilegi

Le applicazioni vengono eseguite all'interno di un contesto che dispone di privilegi specifici sul computer locale e, potenzialmente, sui computer remoti. Per informazioni sulla configurazione delle applicazioni relative all'identità, vedere Configurazione dell'identità dei processi ASP.NET.

Per l'esecuzione con il numero minimo di privilegi, attenersi alle indicazioni riportate di seguito:

  • Non eseguire l'applicazione con l'identità di un utente di sistema (amministratore).

  • Eseguire l'applicazione nel contesto di un utente che dispone dei minimi privilegi possibili.

  • Negli elenchi di controllo di accesso (ACL, Access Control List) impostare le autorizzazioni su tutte le risorse utilizzate dall'applicazione. Utilizzare le impostazioni più restrittive. Se l'applicazione lo consente, impostare ad esempio i file come di sola lettura. Per un elenco delle autorizzazioni ACL minime richieste per l'identità dell'applicazione ASP.NET, vedere Elenchi di controllo di accesso (ACL, Access Control List) ASP.NET necessari.

  • Tenere i file dell'applicazione Web in una sottocartella della cartella principale dell'applicazione. Non consentire agli utenti dell'applicazione di accedere ai file specificandone il percorso. In tal modo si riducono le probabilità che un utente riesca ad accedere alla cartella principale del server.

Conoscere gli utenti

In molte applicazioni, gli utenti possono accedere al sito senza fornire credenziali. In tal caso, l'applicazione viene eseguita nel contesto di un utente predefinito e accede alle risorse di conseguenza. Per impostazione predefinita, tale contesto è quello dell'utente locale ASPNET (Windows 2000 o Windows XP) o dell'utente NETWORK SERVICE (Windows Server 2003) del server Web.

Per limitare l'accesso agli utenti autenticati, attenersi alle seguenti indicazioni:

  • Se l'applicazione è un'applicazione Intranet, configurarla in modo che utilizzi la sicurezza integrata di Windows. In tal modo, le credenziali di accesso dell'utente potranno essere utilizzate per l'accesso alle risorse.

  • Per acquisire le credenziali degli utenti, utilizzare una delle strategie di autenticazione previste da ASP.NET. Per un esempio, vedere Cenni preliminari sull'autenticazione basata su form ASP.NET.

Proteggersi dagli input utente dannosi

Come regola generale, non dare mai per scontato che l'input ricevuto da un utente sia sicuro. Gli utenti malintenzionati possono facilmente inviare informazioni potenzialmente dannose dal client all'applicazione. Per proteggersi da input dannosi, attenersi alle seguenti indicazioni:

  • Nei form, filtrare l'input degli utenti per individuarvi eventuali tag HTML, che potrebbero contenere script. Per informazioni dettagliate, vedere Procedura: proteggere da attacchi tramite script in un'applicazione Web applicando alle stringhe la codifica HTML.

  • Non visualizzare mai input utente non filtrato. Prima di visualizzare informazioni non attendibili, codificare l'HTML per convertire in semplici stringhe gli script potenzialmente dannosi.

  • Allo stesso modo, non memorizzare mai input utente non filtrato in un database.

  • Se si desidera accettare tag HTML da un utente, filtrare l'input manualmente. Nel filtro definire esplicitamente cosa verrà accettato. Non creare un filtro che tenta di rimuovere gli input dannosi. È molto difficile prevedere tutti i possibili input dannosi.

  • Non dare per scontato che le informazioni ricevute nell'intestazione (solitamente tramite l'oggetto Request) siano sicure. Usare cautela con le stringhe di query, i cookie e così via. Nel caso abbiano particolare rilevanza per l'applicazione, si tenga conto del fatto che le informazioni riportate dal browser al server (informazioni di agente utente) sono soggette a spoofing.

  • Se possibile, non memorizzare informazioni riservate in un luogo accessibile al browser, ad esempio i campi nascosti o i cookie. Ad esempio, non memorizzare una password in un cookie.

    Nota

    Lo stato di visualizzazione viene memorizzato in un campo nascosto in forma codificata. Per impostazione predefinita, lo stato di visualizzazione include un codice di autenticazione messaggi (MAC, Message Authentication Code) che consente alla pagina di verificare che non sia stato alterato.

Accedere ai database secondo logiche di sicurezza

I database dispongono solitamente di un proprio sistema di sicurezza. Un'importante aspetto della sicurezza di un'applicazione Web consiste nella corretta progettazione del modo in cui l'applicazione accederà al database. Attenersi alle seguenti indicazioni:

  • Utilizzare la sicurezza intrinseca del database per definire chi può accedere alle risorse del database. La strategia esatta dipende dall'applicazione e dal database utilizzati.

    • Se l'applicazione lo consente, impostare la sicurezza integrata Windows, in modo che soltanto gli utenti autenticati da Windows possano accedere al database. La sicurezza integrata è più sicura rispetto all'utilizzo della sicurezza standard del server SQL.

    • Se nell'applicazione sono utilizzati accessi anonimi, creare un utente singolo con autorizzazioni estremamente limitate ed effettuare le query eseguendo il collegamento con le credenziali di tale utente.

  • Non creare istruzioni SQL concatenando stringhe contenenti input utente. Creare invece query con parametri e utilizzare l'input utente per impostare i valori dei parametri.

  • Se occorre memorizzare un nome utente e una password da utilizzare come credenziali per l'accesso al database, memorizzarli in modo sicuro. Se possibile, crittografarli o inizializzarli. Per informazioni dettagliate, vedere Crittografia e decrittografia di dati.

Per ulteriori informazioni sull'accesso ai dati in modo sicuro, vedere Protezione di applicazioni ADO.NET.

Creare messaggi di errore sicuri

Se non si presta la dovuta attenzione, un utente malintenzionato potrebbe ricavare importanti informazioni dai messaggi di errore visualizzati dall'applicazione. Attenersi alle seguenti indicazioni:

  • Non scrivere messaggi di errore che visualizzano informazioni, come un nome utente, che potrebbero essere utilizzate da utente malintenzionati.

  • Configurare l'applicazione in modo che non visualizzi messaggi di errore dettagliati agli utenti. Se si desidera visualizzare messaggi di errore dettagliati per il debug, verificare prima che l'utente connesso sia un utente locale del server Web. Per informazioni dettagliate, vedere Procedura: visualizzare messaggi di errore protetti.

  • Utilizzare l'elemento di configurazione customErrors per controllare la visualizzazione da parte di estranei delle eccezioni dal server.

  • Per le situazioni facilmente soggette ad errori, come gli accessi al database, creare soluzioni di gestione degli errori personalizzate.

Proteggere le informazioni riservate

Informazioni riservate sono le informazioni che devono essere tenute segrete. Una tipica informazione riservata è una password o una chiave di crittografia. Se un utente non autorizzato entra in possesso delle informazioni riservate, i dati coperti dal segreto saranno compromessi. Attenersi alle seguenti indicazioni:

  • Se nell'applicazione sono trasmesse informazioni riservate tra il browser e il server, si consideri l'utilizzo di Secure Sockets Layer (SSL). Per ulteriori dettagli su come crittografare un sito con SSL, vedere l'articolo Q307267, "Procedura: Proteggere i servizi Web XML con Secure Socket Layer in Windows 2000" nella Microsoft Knowledge Base.

  • Utilizzare la configurazione protetta per proteggere le informazioni riservate in file di configurazione, quali i file Web.config o Machine.config. Per ulteriori informazioni, vedere Crittografia delle informazioni di configurazione utilizzando la configurazione protetta.

  • Se si rende necessario memorizzare informazioni riservate, non farlo in una pagina Web, nemmeno in una forma ritenuta non visualizzabile agli utenti, ad esempio in codice server.

  • Utilizzare gli algoritmi di crittografia avanzata forniti nello spazio dei nomi System.Security.Cryptography.

L'utilizzo dei cookie consente di memorizzare in modo semplice e pratico informazioni relative all'utente. Poiché vengono inviati al computer del browser, sono però esposti allo spoofing o ad altri impieghi dannosi. Attenersi alle seguenti indicazioni:

  • Non memorizzare informazioni riservate nei cookie. Non memorizzare ad esempio la password di un utente in un cookie, neanche temporaneamente. Come regola generale, non memorizzare le informazioni riservate in un cookie. Memorizzare invece nel cookie un riferimento alla posizione sul server in cui sono memorizzate le informazioni.

  • Impostare le date di scadenza dei cookie quanto più prossime possibile. Se è possibile, evitare l'uso di cookie permanenti.

  • Si consideri la possibilità di crittografare le informazioni contenute nei cookie.

  • Si consideri la possibilità di impostare le proprietà Secure e HttpOnly nei cookie su true.

Proteggersi dagli attacchi denial of service

Un modo indiretto di compromettere un'applicazione consiste nel renderla non più disponibile. Un utente malintenzionato può impegnare l'applicazione fino al punto di impedire che serva altri utenti oppure può provocarne l'arresto anomalo. Attenersi alle seguenti indicazioni:

  • Chiudere o rilasciare ogni risorsa utilizzata. Chiudere sempre, ad esempio, le connessioni dati e i lettori dati e chiudere sempre i file dopo averli utilizzati.

  • Utilizzare la gestione degli errori (ad esempio, i blocchi try/catch). Includere un blocco finally in cui si rilasciano le risorse in caso di errore.

  • Configurare IIS in modo da utilizzare la limitazione ed evitare che in un'applicazione sia utilizzata la CPU in modo sproporzionato.

  • Verificare che l'input utente rispetti i limiti di dimensioni prima di utilizzarlo o memorizzarlo.

  • Impostare le protezioni sulla dimensione delle query al database per proteggersi dall'utilizzo, da parte di query di grandi dimensioni, delle risorse di sistema.

  • Porre un limite di dimensioni al caricamento di file, nel caso questo sia previsto dall'applicazione. È possibile impostare un limite nel file Web.config utilizzando una sintassi simile all'esempio di codice riportato di seguito, in cui il valore maxRequestLength è espresso in kilobyte:

    <configuration>
        <system.web>
            <httpRuntime maxRequestLength="4096" />
        </system.web>
    </configuration>
    

Inoltre, è possibile utilizzare la proprietà RequestLengthDiskThreshold per ridurre il sovraccarico della memoria di upload di grandi dimensioni e di invii di form.

Vedere anche

Concetti

Cenni preliminari sui rischi di sicurezza a cui sono esposte le applicazioni Web

Protezione delle applicazioni Web ASP.NET

Bibliografia sulla protezione