Condividi tramite


Richiedere la convalida - Prevenzione degli attacchi tramite script

Questo documento descrive la funzionalità di convalida della richiesta di ASP.NET in cui, per impostazione predefinita, l'applicazione non consente di elaborare il contenuto HTML non codificato inviato al server. Questa funzionalità di convalida delle richieste può essere disabilitata quando l'applicazione è stata progettata per elaborare in modo sicuro i dati HTML.

Si applica a ASP.NET 1.1 e ASP.NET 2.0.

La convalida della richiesta, una funzionalità di ASP.NET sin dalla versione 1.1, impedisce al server di accettare contenuti che includono HTML non codificato. Questa funzionalità è progettata per impedire alcuni attacchi script injection in cui il codice script client o HTML può essere inconsapevolmente inviato a un server, archiviato e quindi presentato ad altri utenti. È tuttavia vivamente consigliabile convalidare tutti i dati di input e codificarli con HTML, se appropriato.

Ad esempio, si crea una pagina Web che richiede l'indirizzo di posta elettronica di un utente e quindi archivia l'indirizzo di posta elettronica in un database. Se l'utente immette <l'avviso SCRIPT>("hello from script")</SCRIPT> anziché un indirizzo di posta elettronica valido, quando i dati vengono presentati, questo script può essere eseguito se il contenuto non è stato codificato correttamente. La funzionalità di convalida della richiesta di ASP.NET impedisce l'esecuzione di questa operazione.

Perché questa funzionalità è utile

Molti siti non sono consapevoli che sono aperti a semplici attacchi di inserimento di script. Se lo scopo di questi attacchi consiste nel defacere il sito visualizzando HTML o per eseguire potenzialmente lo script client per reindirizzare l'utente al sito di un hacker, gli attacchi di inserimento di script sono un problema che gli sviluppatori Web devono affrontare.

Gli attacchi di inserimento di script sono una preoccupazione per tutti gli sviluppatori Web, indipendentemente dal fatto che usino ASP.NET, ASP o altre tecnologie di sviluppo Web.

La funzionalità di convalida delle richieste di ASP.NET impedisce in modo proattivo questi attacchi non consentendo l'elaborazione del contenuto HTML non codificato dal server, a meno che lo sviluppatore non decida di consentire tale contenuto.

Cosa aspettarsi: Pagina errori

La schermata seguente mostra alcuni esempi di codice ASP.NET:

Screenshot che mostra un esempio di codice ASP.NET.

L'esecuzione di questo codice comporta una semplice pagina che consente di immettere un testo nella casella di testo, fare clic sul pulsante e visualizzare il testo nel controllo etichetta:

Screenshot che mostra l'esecuzione di questo codice in una semplice pagina che consente di immettere un testo nella casella di testo, fare clic sul pulsante e visualizzare il testo nel controllo etichetta.

Tuttavia, javaScript, ad esempio <script>alert("hello!")</script> per essere immessi e inviati, si otterrebbe un'eccezione:

Se JavaScript viene immesso e inviato, si otterrà un'eccezione.

Il messaggio di errore indica che è stato rilevato un valore request.form potenzialmente pericoloso e fornisce altri dettagli nella descrizione come esattamente ciò che si è verificato e come modificare il comportamento. Ad esempio:

La convalida della richiesta ha rilevato un valore di input client potenzialmente pericoloso e l'elaborazione della richiesta è stata interrotta. Questo valore può indicare un tentativo di compromettere la sicurezza dell'applicazione, ad esempio un attacco di scripting tra siti. È possibile disabilitare la convalida della richiesta impostando validateRequest=false la direttiva Pagina o nella sezione di configurazione. Tuttavia, è consigliabile che l'applicazione controlli in modo esplicito tutti gli input in questo caso.

Disabilitazione della convalida della richiesta in una pagina

Per disabilitare la convalida della richiesta in una pagina, è necessario impostare l'attributo validateRequest della direttiva Page su false:

<%@ Page validateRequest="false" %>

Attenzione

Quando la convalida della richiesta è disabilitata, il contenuto può essere inviato a una pagina; è responsabilità dello sviluppatore di pagine assicurarsi che il contenuto sia codificato o elaborato correttamente.

Disabilitazione della convalida della richiesta per l'applicazione

Per disabilitare la convalida della richiesta per l'applicazione, è necessario modificare o creare un file Web.config per l'applicazione e impostare l'attributo validateRequest della <pages /> sezione su false:

<configuration>
   <system.web>
      <pages validateRequest="false" />
   </system.web>
</configuration>

Se si desidera disabilitare la convalida della richiesta per tutte le applicazioni nel server, è possibile apportare questa modifica al file di Machine.config.

Attenzione

Quando la convalida della richiesta è disabilitata, il contenuto può essere inviato all'applicazione; è responsabilità dello sviluppatore dell'applicazione assicurarsi che il contenuto sia codificato o elaborato correttamente.

Il codice seguente viene modificato per disattivare la convalida della richiesta:

Screenshot che mostra il codice seguente viene modificato per disattivare la convalida della richiesta.

Ora, se nella casella <script>alert("hello!")</script> di testo è stato immesso il codice JavaScript seguente, il risultato sarà:

Screenshot che mostra se JavaScript è stato immesso nella casella di testo: il risultato sarebbe un pulsante

Per evitare che questo accada, con la convalida della richiesta disattivata, è necessario codificare html il contenuto.

Come codifica HTML contenuto

Se è stata disabilitata la convalida della richiesta, è consigliabile archiviare contenuto con codifica HTML per un uso futuro. La codifica HTML sostituirà automaticamente qualsiasi '' o '<>' (insieme a diversi altri simboli) con la relativa rappresentazione codificata HTML corrispondente. Ad esempio, '' viene sostituito da '<<' e '' sostituito da '>>'. I browser usano questi codici speciali per visualizzare '' o '<>' nel browser.

Il contenuto può essere facilmente codificato HTML nel server usando l'API Server.HtmlEncode(string) . Il contenuto può anche essere facilmente decodificato HTML, ovvero ripristinato in HTML standard usando il Server.HtmlDecode(string) metodo .

Screenshot che mostra il contenuto può essere facilmente codificato HTML nel server usando l'API Server.HtmlEncode(string). Il contenuto può anche essere facilmente decodificato HTML, ovvero ripristinato in HTML standard usando il metodo Server.HtmlDecode(string).

Risultato:

Screenshot che mostra un pulsante