Condividi tramite


Deserializzazione automatica in .NET Framework Remoting

Questo argomento è specifico di una tecnologia legacy mantenuta per una questione di compatibilità con le applicazioni esistenti di versioni precedenti e non è consigliato per il nuovo sviluppo. Le applicazioni distribuite devono ora essere sviluppate utilizzando  Windows Communication Foundation (WCF).

I sistemi .NET Remoting che si basano sulla convalida del tipo runtime devono deserializzare un flusso remoto per cominciare a utilizzarlo e un client non autorizzato potrebbe tentare di sfruttare il momento della deserializzazione. Per proteggersi da questo tipo di attacchi, .NET Framework Remoting fornisce due livelli di deserializzazione automatica, Low e Full. Low, il valore predefinito, protegge contro attacchi di deserializzazione deserializzando solo i tipi associati alla funzionalità .NET Remoting di base, come ad esempio la deserializzazione automatica di tipi di infrastruttura .NET Remoting, un set limitato di tipi implementati dal sistema e un set di base di tipi personalizzati. Il livello di deserializzazione Full supporta la deserializzazione automatica di tutti i tipi che i servizi remoti supportano in tutte le situazioni.

5dxse167.Caution(it-it,VS.100).gifAttenzione:
Il controllo della deserializzazione non deve essere considerato l'unica sicurezza necessaria a un'applicazione. Nelle applicazioni distribuite anche l'utilizzo di un livello elevato di controllo sulla serializzazione non consente di impedire l'intercettazione e l'utilizzo non autorizzati di comunicazioni, anche se si tratta della sola visualizzazione dei dati. Ne deriva che, sebbene il livello di deserializzazione Low offra una qualche protezione contro specifici tipi di attacchi basati sulla deserializzazione automatica, rimane importante valutare se utilizzare l'autenticazione e la crittografia per proteggere i propri dati. Per ulteriori informazioni, vedere Sicurezza.

Negli elenchi seguenti sono descritti i livelli di deserializzazione di .NET Framework Remoting:

  • Low (livello predefinito)

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

    • Oggetti dell'infrastruttura .NET Remoting. Questi sono i tipi necessari per il funzionamento delle operazioni di .NET Remoting di livello base.

    • Tipi primitivi e tipi per valore e riferimento composti da tipi primitivi.

    • Tipi per riferimento e per valore contrassegnati con l'attributo SerializableAttribute ma che non implementano l'interfaccia ISerializable.

    • Tipi forniti dal sistema che implementano ISerializable e non fanno altre richieste al di fuori della serializzazione.

    • Tipi personalizzati che hanno nomi sicuri e vivono in un assembly non è contrassegnato con l'attributo AllowPartiallyTrustedCallersAttribute.

    • Tipi personalizzati che implementano ISerializable e non fanno altre richieste al di fuori della serializzazione.

    • Tipi che implementano l'interfaccia ILease e non sono oggetti MarshalByRefObject.

    • Oggetti ObjRef utilizzati per l'attivazione (per il supporto di oggetti attivati dal client); ovvero, il client può deserializzare l'elemento ObjRef restituiro, ma il server non può.

  • Full

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

    • Oggetti ObjRef passati come parametri.

    • Oggetti che implementano l'interfaccia ISponsor.

    • Oggetti inseriti tra il proxy e la pipeline del client dall'interfaccia IContributeEnvoySink.

    • Tipi delegati passati come parametri.

    • Oggetti che ereditano da MarshalByRefObject passati come parametri.

    • Tipi ISerializable passati come parametri.

    • Tipi archiviati in GAC e non contrassegnati con l'attributo AllowPartiallyTrustedCallersAttribute.

    Se l'applicazione richiede l'utilizzo di funzionalità .NET Remoting che sono disponibili solo al livello di deserializzazione Full, sarà necessario fornire il tipo di autenticazione e il livello di crittografia necessari a proteggere qualsiasi risorsa che potrebbe essere a rischio utilizzando queste funzionalità avanzate in scenari remoti.

È possibile impostare il livello di deserializzazione a livello di codice oppure utilizzando un file di configurazione dell'applicazione.

Impostazione a livello di codice del livello di deserializzazione

Per impostare il livello di deserializzazione a livello di codice, passare la proprietà seguente all'oggetto SoapServerFormatterSinkProvider o all'oggetto BinaryServerFormatterSinkProvider durante la creazione. Il sistema .NET Remoting imposta quindi il valore sul formattatore quando viene inserito nella catena di sink. Nell'esempio seguente viene illustrato come impostare il livello di deserializzazione a Full in un dominio dell'applicazione host.

// 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);
' 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.
Dim props As IDictionary = 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, DBNull.Value, provider)

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

Per utilizzare un file di configurazione per impostare il livello di deserializzazione si deve specificare in modo esplicito l'attributo typeFilterLevel dell'elemento <formatter>. Anche se questa operazione viene generalmente eseguita sul lato server, si deve specificare anche questo attributo per controllare il livello di deserializzazione di qualsiasi canale sul client registrato per attendere un callback. Nell'esempio seguente viene impostato in modo esplicito il livello di deserializzazione a Low per SoapFormatter e BinaryFormatter nel dominio dell'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>
</system.runtime.remoting>
</configuration>

Vedere anche

Riferimento

RemotingConfiguration
BinaryServerFormatterSinkProvider.TypeFilterLevel
BinaryFormatter.FilterLevel

Concetti

Configurazione di applicazioni remote