Deserializzazione automatica in .NET Remoting

Nei sistemi remoti in cui viene utilizzata la convalida dei tipi in fase di esecuzione è necessario che i flussi remoti siano deserializzati per essere utilizzati e un client non autorizzato potrebbe tentare di sfruttare il momento della deserializzazione. Come protezione da attacchi di questo tipo, .NET Remoting fornisce due livelli di deserializzazione automatica: Low e Full. Il valore predefinito Low consente la protezione da tali attacchi mediante la deserializzazione dei soli tipi associati alle funzionalità remote essenziali, ad esempio i tipi di infrastruttura remota, un insieme circoscritto di tipi implementati dal sistema e alcuni dei principali tipi personalizzati. Il livello di deserializzazione Full supporta la deserializzazione automatica di tutti i tipi supportati dalla comunicazione remota in tutte le situazioni.

Attenzione   Il controllo della deserializzazione non deve essere considerato una protezione sufficiente per le applicazioni. Nelle applicazioni distribuite persino un livello elevato di controllo non impedirà a client non autorizzati di intercettare la comunicazione e utilizzarla in qualche modo, anche se solo per visualizzare i dati ad altri soggetti. Pertanto, sebbene il livello di deserializzazione Low fornisca una certa protezione contro i tipi di attacchi basati sulla deserializzazione automatica, è comunque necessario valutare l'opportunità di utilizzare autenticazione e crittografia per proteggere completamente i dati. Per informazioni dettagliate, vedere Protezione.

Negli elenchi riportati di seguito vengono descritti i livelli di deserializzazione di .NET Remoting:

  • Low (livello predefinito)

    Il livello di deserializzazione predefinito di .NET Remoting supporta la deserializzazione dei seguenti tipi:

    • Oggetti di infrastruttura remota. Si tratta dei tipi necessari per il funzionamento di base della comunicazione remota.
    • Tipi primitivi e tipi di riferimento e di valore composti da tipi primitivi.
    • Tipi di riferimento e di valore contrassegnati con l'attributo SerializableAttribute ma che non implementano l'interfaccia ISerializable.
    • Tipi forniti dal sistema che implementano ISerializable e non generano altre pretese al di fuori della serializzazione.
    • Tipi forniti dal sistema che implementano ISerializable o sono contrassegnati con l'attributo SerializableAttribute e risiedono in un assembly non contrassegnato con l'attributo AllowPartiallyTrustedCallersAttribute.
    • Tipi personalizzati con nomi sicuri e residenti in un assembly non contrassegnato con l'attributo AllowPartiallyTrustedCallersAttribute.
    • Tipi personalizzati che implementano ISerializable e non generano altre pretese al di fuori della serializzazione.
    • Tipi che implementano l'interfaccia ILease e non sono oggetti MarshalByRefObject.
    • Oggetti ObjRef utilizzati per l'attivazione, per supportare oggetti attivati da client; vale a dire che l'oggetto ObjRef restituito può essere deserializzato dal client, ma non dal server.
  • Full

    Il livello di deserializzazione Full in .NET Remoting supporta tutti gli altri scenari, inclusa la deserializzazione dei seguenti tipi aggiuntivi:

    • Oggetti ObjRef passati come parametri.
    • Oggetti che implementano l'interfaccia ISponsor.
    • Oggetti inseriti tra la pipeline del proxy e del client mediante l'interfaccia IContributeEnvoySink.

    Se nell'applicazione dovranno essere utilizzate le funzionalità remote disponibili solo al livello di deserializzazione Full, occorrerà impostare il tipo di autenticazione e il livello di crittografia necessari per proteggere le risorse potenzialmente a rischio utilizzando tali funzionalità avanzate negli scenari remoti.

Il livello di deserializzazione può essere impostato a livello di codice o mediante un file di configurazione di un'applicazione.

Impostazione del livello di deserializzazione a livello di codice

Per impostare la deserializzazione a livello di codice, passare la proprietà riportata di seguito all'oggetto SoapServerFormatterSinkProvider o all'oggetto BinaryServerFormatterSinkProvider al momento della creazione. Dal sistema remoto verrà quindi impostato il valore sul formattatore quando verrà inserito nella catena di sink. Nell'esempio di codice che segue viene dimostrato come impostare il livello di deserializzazione su Full in un dominio applicazione host.

[C#]

// Creating a custom formatter for a TcpChannel sink chain.

BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();

provider.TypeFilterLevel = TypeFilterLevel.Full;

// Creating the IDictionary to set the port on the channel instance.

IDictionary props = new Hashtable();

props["port"] = 8085;

// Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)

TcpChannel chan = new TcpChannel(props, null, provider);

[Visual Basic]

' Creating a custom formatter for your TcpChannel sink chain.

Dim provider As New BinaryServerFormatterSinkProvider()

provider.TypeFilterLevel = TypeFilterLevel.Full

' Creating the IDictionary to set the port on the channel instance.

IDictionary props = new Hashtable()

props("port") = 8085

' Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)

Dim chan As New TcpChannel(props, null, provider)

Impostazione del livello di deserializzazione mediante un file di configurazione dell'applicazione

Per impostare il livello di deserializzazione utilizzando un file di configurazione, è necessario specificare in modo esplicito l'attributo typeFilterLevel dell'elemento <formatter>. Sebbene tale operazione venga eseguita di solito sul lato server, occorre specificare l'attributo per controllare il livello di deserializzazione per qualsiasi canale sul client registrato per attendere un callback. Nell'esempio di codice che segue il livello di deserializzazione viene impostato in modo esplicito su Low sia per SoapFormatter che per BinaryFormatter nel dominio applicazione.

<configuration>

<system.runtime.remoting>

<application>

<service>

<wellknown

type="ServiceType, common"

objectUri="ServiceType.soap"

mode="Singleton"

/>

</service>

<channels>

<channel ref="http">

<serverProviders>

<provider ref="wsdl" />

<formatter ref="soap" typeFilterLevel="Low" />

<formatter ref="binary" typeFilterLevel="Low" />

</serverProviders>

</channel>

</channels>

</application>

</configuration>

Vedere anche

Configurazione | RemotingConfiguration | BinaryServerFormatterSinkProvider.TypeFilterLevel | BinaryFormatter.FilterLevel