Considerazione sulla sicurezza di System.Xml
Nelle sezioni seguenti vengono illustrati i tipi di problemi di sicurezza che possono verificarsi quando si utilizzano componenti System.Xml e le misure per limitare tali rischi.
Nota |
---|
I componenti System.Xml utilizzano il sistema di sicurezza di Microsoft .NET Framework.In questo argomento viene fatto riferimento solo ai problemi di sicurezza gestiti in modo specifico dalle classi XML.Per ulteriori informazioni, vedere Sicurezza in .NET Framework. |
Classe XmlResolver
Classi XmlReader e XmlReaderSettings
Classe XmlTextReader
Classe XslCompiledTransform
Document Object Model
Classe XmlResolver
La classe XmlResolver viene utilizzata per risolvere le risorse.Viene utilizzata per caricare i documenti XML e per risolvere le risorse esterne ad esempio DTD o schemi e importare o includere le direttive.In .NET Framework sono incluse due implementazioni della classe XmlResolver.
La classe XmlUrlResolver corrisponde al sistema di risoluzione predefinito per tutte le classi dello spazio dei nomi System.Xml.Supporta i protocolli file:// e http:// e le richieste dalla classe WebRequest.In molti casi, se non si specifica un oggetto XmlResolver che dovrà essere utilizzato dall'applicazione, verrà utilizzato un oggetto XmlUrlResolver senza credenziali utente per accedere alle risorse XML.
La classe XmlSecureResolver consente di proteggere un altro oggetto XmlResolver includendo l'oggetto XmlResolver e imponendo limitazioni sulle risorse accessibili all'oggetto XmlResolver sottostante.Ad esempio, la classe XmlSecureResolver consente di proibire l'accesso a specifici siti Internet o a zone particolari.
Quando si utilizza la classe XmlResolver, è necessario considerare i seguenti elementi.
Gli oggetti XmlResolver possono contenere informazioni sensibili, ad esempio credenziali utente che possono essere utilizzate per accedere ai dati o per recuperarli.È necessario prestare attenzione quando si memorizzano nella cache oggetti XmlResolverXmlResolverXmlResolver ed evitare di passarli a un componente non attendibile, poiché questo potrebbe utilizzarli insieme alle relative credenziali utente per accedere ai dati.
Se si progetta una proprietà della classe in cui viene utilizzata la classe XmlResolver, è necessario definire tale proprietà come proprietà di sola scrittura.La proprietà può essere specificata in modo tale che venga utilizzata dal tipo XmlResolver, tuttavia non può essere utilizzata per restituire un oggetto XmlResolver.Ciò consente a un componente non attendibile di utilizzare la classe ma non di recuperare e utilizzare in modo diretto l'oggetto XmlResolver.
Se nell'applicazione vengono accettati oggetti XmlResolver provenienti da codice non attendibile, si può presupporre che l'URI passato al metodo GetEntity sia uguale a quello restituito dal metodo ResolveUri.Le classi derivate dalla classe XmlResolver consentono di ignorare il metodo GetEntity e di restituire dati diversi da quelli contenuti nell'URI originale.
L'applicazione è in grado di limitare i rischi da attacchi di tipo DoS (Denial of Service) della memoria al metodo GetEntity tramite l'implementazione IStream in cui è stato implementato il ritorno a capo che consente di limitare il numero di byte letti.Ciò consente di evitare situazioni in cui del codice dannoso tenta di passare un flusso infinito di byte al metodo GetEntity.
Classi XmlReader e XmlReaderSettings
Di fatto tutti i componenti System.Xml sono creati in base al concetto di analisi XML.Ad esempio, nella classe XmlDocument viene utilizzata la classe XmlReader per analizzare un documento e creare una rappresentazione in memoria del documento XML.
Per creare oggetti XmlReader, si consiglia di utilizzare il metodo Create.La classe XmlReaderSettings consente di specificare il set di funzionalità da attivare per l'oggetto XmlReader.
Limitazione delle dimensioni relative all'espansione di documenti e entità
L'utilizzo della memoria di un'applicazione che usa XmlReader può essere correlato alle dimensioni del documento XML analizzato.Quando per l'analisi vengono inviati documenti XML di dimensioni eccessive, si verifica un attacco di tipo DoS.
Quando si utilizza XmlReader, è possibile limitare le dimensioni del documento che è possibile analizzare impostando la proprietà MaxCharactersInDocument.Per limitare il numero di caratteri risultanti dall'espansione di entità, impostare la proprietà MaxCharactersFromEntities.Per gli esempi relativi all'impostazione di queste proprietà, vedere gli argomenti di riferimento appropriati.
Elaborazione DTD
L'elaborazione DTD può comportare una condizione di tipo Denial of Service.Ad esempio, è possibile che la DTD contenga entità annidate o modelli di contenuto complesso la cui elaborazione può richiedere parecchio tempo.
Per impostazione predefinita, l'elaborazione della DTD è disabilitata.Se il tipo XmlReader rileva i dati della DTD, verrà generato un tipo XmlException.
Elaborazione dello schema
Per impostazione predefinita, i flag di convalida ProcessInlineSchema e ProcessSchemaLocation dell'oggetto XmlReaderSettings non sono impostati.Ciò consente di proteggere il tipo XmlReader da attacchi basati sullo schema durante l'elaborazione dei dati XML da un'origine non attendibile.Se questi flag sono impostati, verrà utilizzata la proprietà XmlResolver dell'oggetto XmlReaderSettings per risolvere i percorsi dello schema rilevati nel documento di istanza nel tipo XmlReader.Se la proprietà XmlResolver è impostata su null, i percorsi dello schema non verranno risolti anche se sono impostati i flag di convalida ProcessInlineSchema e ProcessSchemaLocation.
Gli schemi aggiunti durante la convalida aggiungono nuovi tipi e possono alterare l'esito della convalida del documento in esame.Di conseguenza, gli schemi esterni devono essere risolti solo da origini attendibili.
Si consiglia di disabilitare il flag ProcessIdentityConstraints, che è attivato per impostazione predefinita, quando si esegue la convalida di documenti XML non attendibili di grandi dimensioni in scenari a elevata disponibilità in base a uno schema con vincoli di identità su una vasta parte del documento.
Risorse esterne
È possibile che i dati XML includano riferimenti a risorse esterne quali, ad esempio, un file dello schema.Per impostazione predefinita, le risorse esterne vengono risolte utilizzando un oggetto XmlUrlResolver senza credenziali utente.Ciò significa che, per impostazione predefinita, è possibile accedere a qualsiasi percorso che non richieda credenziali.È possibile migliorare i livelli di sicurezza mediante una delle seguenti operazioni:
Limitando le risorse a cui la classe XmlReader può accedere impostando la proprietà XmlReaderSettings.XmlResolver su un oggetto XmlSecureResolver.
Non consentire al tipo XmlReader di aprire alcuna risorsa esterna impostando la proprietà XmlReaderSettings.XmlResolver su null.
Condivisione di oggetti XmlReaderSettings
Gli oggetti XmlReaderSettings possono contenere informazioni sensibili quali le credenziali utente.L'oggetto XmlReaderSettings e le relative credenziali utente potrebbero essere utilizzate da un componente non attendibile per creare oggetti XmlReader che consentano di leggere i dati.È necessario prestare attenzione quando si memorizzano nella cache oggetti XmlReaderSettings o quando si passa l'oggetto XmlReaderSettings da un componente a un altro.
Componenti di supporto
- Non accettare componenti di supporto, ad esempio oggetti NameTable, XmlNamespaceManager e XmlResolver da un'origine non attendibile.
Elaborazione dei dati
I dati XML possono contenere un numero elevato di attributi, dichiarazione dello spazio dei nomi, elementi nidificati e così via, la cui elaborazione richiede una notevole quantità di tempo.
È possibile creare un'implementazione IStream personalizzata che limiti la dimensione dell'input utilizzato e lo fornisca alla classe XmlReader.
Utilizzare il metodo ReadValueChunk per gestire flussi di dati di grandi dimensioni.Questo metodo consente di leggere un numero ridotto di caratteri alla volta invece di allocare una singola stringa per l'intero valore.
Classe XmlTextReader
La classe XmlTextReader rappresenta un'implementazione legacy della classe XmlReader.
Elaborazione DTD
Per impostazione predefinita, l'elaborazione della DTD è attivata.Per disabilitare l'elaborazione della DTD, impostare la proprietà DtdProcessing su Prohibit.
Gestione delle entità
Per impostazione predefinita, le entità generali non vengono espanse.Per eseguire questa operazione, è necessario chiamare il metodo ResolveEntity.
Risorse esterne
È possibile che i dati XML includano riferimenti a risorse esterne quali, ad esempio, riferimenti a DTD.Per impostazione predefinita, le risorse esterne vengono risolte utilizzando un oggetto XmlUrlResolver senza credenziali utente.
È possibile migliorare i livelli di sicurezza mediante una delle seguenti operazioni:
Limitando le risorse a cui la classe XmlTextReader può accedere impostando la proprietà XmlResolver su un oggetto XmlSecureResolver.
Non consentire al tipo XmlTextReader di aprire alcuna risorsa esterna impostando la proprietà XmlResolver su null.
Classe XslCompiledTransform
La classe XslCompiledTransform è un processore XSLT che supporta la sintassi XSLT 1.0.Ciò consente di trasformare i dati XML utilizzando un foglio di stile XSLT.
Risorse esterne
I fogli di stile possono includere riferimenti a risorse esterne, ad esempio a elementi xsl:import o xsl:include oppure alla funzione document().
Per impostazione predefinita, la classe XslCompiledTransform supporta gli elementi xsl:import o xsl:include.Per impostazione predefinita, nella classe XslCompiledTransform il supporto per la funzione document() è disabilitato.Per attivare la funzione document(), viene utilizzata classe XsltSettings.
I metodi Load e Transform includono overload che accettano un oggetto XmlResolver come argomento.Se non viene specificato alcun tipo XmlResolver, viene utilizzato un tipo predefinito XmlUrlResolver senza credenziali.
È possibile controllare l'accesso alle risorse esterne eseguendo una delle seguenti operazioni:
Limitare le risorse accessibili al processo XSLT utilizzando un oggetto XmlSecureResolver.
Non consentire al processo XSLT di aprire alcuna risorsa esterna passando null all'argomento XmlResolver.
Blocchi di script
Per impostazione predefinita, la classe XslCompiledTransform non supporta i blocchi di script.Questi vengono attivati utilizzando la classe XsltSettings.Lo script con XSLT deve essere abilitato solo se è necessario il supporto per gli script e solo all'interno di un ambiente completamente attendibile.
Oggetti di estensione
Gli oggetti di estensione consentono di aggiungere funzionalità di programmazione alle trasformazioni XSLT.Per impostazione predefinita questa funzionalità è attivata.Se gli oggetti di estensione vengono passati al metodo Transform, verranno utilizzati nella trasformazione XSLT.
Modello a oggetti di documenti (Document Object Model, DOM)
Dal momento che il DOM consente di memorizzare tutti i dati nella cache, se si utilizzano dati non attendibili e si temono attacchi di tipo DoS (Denial of Service), non si consiglia di eseguire le operazioni del DOM, ad esempio le operazioni di query, modifica, spostamento di sottostrutture tra documenti e salvataggio di oggetti DOM.In alternativa, è possibile impostare un limite per la quantità di dati da leggere nel DOM.A questo scopo, è possibile creare un'implementazione di flusso personalizzata che limiti la dimensione dell'input utilizzato e la utilizzi per caricare l'oggetto DOM.
Gli oggetti XmlDocument possono contenere informazioni sensibili quali le credenziali utente nell'oggetto XmlResolver incorporato.Se la proprietà XmlDocument.XmlResolver è impostata su un oggetto XmlResolver con le credenziali utente, è necessario non memorizzare l'oggetto XmlDocument nella cache né passarlo a un componente non attendibile.L'oggetto DOM e le credenziali utente XmlResolver incorporate potrebbero essere utilizzati da un componente non attendibile per accedere e caricare i dati.