Поделиться через


Автоматическая десериализация при удаленном взаимодействии .NET Framework.

Этот раздел относится к технологии прежних версий, которая сохраняется для обеспечения обратной совместимости с существующими приложениями и не рекомендуется для разработки новых приложений. Сейчас распределенные приложения следует создавать с помощью  Windows Communication Foundation (WCF).

Системы удаленного взаимодействия, которые применяют только проверку типов во время выполнения, должны десериализовать удаленный поток, чтобы начать его использование, а неавторизованный клиент может попытаться воспользоваться моментом десериализации. Для защиты от атак этого типа в системе удаленного взаимодействия .NET Framework имеется два уровня автоматической десериализации: Low и Full. При установке уровня Low (по умолчанию) защита от атак десериализации обеспечивается за счет того, что десериализация выполняется только для типов, связанных с самыми базовыми функциями удаленного взаимодействия, например автоматическая десериализация типов инфраструктуры удаленного взаимодействия, ограниченного набора типов, реализуемых системой, и базового набора пользовательский типов. Уровень десериализации Full поддерживает автоматическую десериализацию всех типов, которые поддерживаются удаленным взаимодействием во всех ситуациях.

5dxse167.Caution(ru-ru,VS.100).gifВнимание!
Не следует считать, что управление десериализацией является единственным средством обеспечения безопасности, необходимым приложению. В распределенных приложениях даже высокий уровень контроля над сериализацией не может предохранить от перехвата данных неавторизованными клиентами и их использования в каких бы то ни было целях, самой безобидной из которых является передача данных другим лицам. Поэтому, несмотря на то что уровень десериализации Low обеспечивает некоторую защиту от атак определенных типов, основанных на автоматической десериализации, необходимо еще раз оценить целесообразность защиты данных с помощью проверки подлинности и шифрования. Дополнительные сведения см. в разделе Безопасность.

В следующем списке описаны уровни десериализации при удаленном взаимодействии с использованием платформы .NET Framework.

  • Low (уровень по умолчанию)

    Уровень десериализации при удаленном взаимодействии .NET Framework по умолчанию поддерживает десериализацию следующих типов:

    • объекты инфраструктуры удаленного взаимодействия. Это типы, необходимые для обеспечения базовых функций удаленного взаимодействия;

    • примитивные типы, а также ссылочные типы и типы значений, состоящие из примитивных типов;

    • ссылочные типы и типы значений, которые отмечены атрибутом SerializableAttribute, но не реализуют интерфейс ISerializable;

    • предоставляемые системой типы, которые реализуют интерфейс ISerializable и не предъявляют дополнительных требований, не связанных с сериализацией;

    • пользовательские типы, имеющие строгие имена и определенные в сборках, не отмеченных атрибутом AllowPartiallyTrustedCallersAttribute;

    • пользовательские типы, которые реализуют интерфейс ISerializable и не предъявляют дополнительных требований, не связанных с сериализацией;

    • типы, которые реализуют интерфейс ILeaseи не являются объектами MarshalByRefObject;

    • объекты ObjRef, которые используются для активации (с целью поддержки объектов, активируемых клиентом); это значит, что клиент может десериализовать возвращаемый объект ObjRef, а сервер не может.

  • Full

    Уровень десериализации Full при удаленном взаимодействии .NET Framework поддерживает все остальные случаи, включая десериализацию следующих дополнительных типов:

    • объекты ObjRef, передаваемые в качестве параметров;

    • объекты, реализующие интерфейс ISponsor;

    • объекты, помещаемые между прокси и клиентским конвейером с помощью интерфейса IContributeEnvoySink;

    • типы делегатов, передаваемые в качестве параметров;

    • объекты, наследующие объектам MarshalByRefObject, которые передаются в качестве параметров;

    • типы ISerializable, передаваемые в качестве параметров;

    • типы, хранящиеся в глобальном кэше сборок и не отмеченные атрибутом AllowPartiallyTrustedCallersAttribute.

    Если приложение требует использования функций удаленного взаимодействия, которые доступные только на уровне десериализации Full, необходимо обеспечить тип проверки подлинности и уровень шифрования, необходимые для защиты всех ресурсов, которые могут подвергнуться риску при использовании этих дополнительных функций удаленного взаимодействия.

Уровень десериализации можно задать программным образом или с помощью файла конфигурации приложения.

Задание уровня десериализации программным образом

Чтобы задать уровень десериализации программным образом, передайте следующее свойство объекту SoapServerFormatterSinkProvider или BinaryServerFormatterSinkProvider при создании. После этого система удаленного взаимодействия задаст значение в модуле форматирования при его вставке в цепочку приемников. В следующем примере кода показано, как задать уровень десериализации Full в домене ведущего приложения.

// 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)

Задание уровня десериализации с помощью файла конфигурации приложения

Чтобы задать уровень десериализации с помощью файла конфигурации, необходимо явным образом указать атрибут typeFilterLevel в элементе <formatter>. Хотя эта операция обычно выполняется на стороне сервера, необходимо также указать этот атрибут, чтобы управлять уровнем десериализации для всех зарегистрированных каналов клиента, ожидающих передачи данных обратного вызова. В следующем примере для уровня десериализации явным образом устанавливается значение Low для объектов SoapFormatter и BinaryFormatter в домене приложения.

<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>

См. также

Справочник

RemotingConfiguration
BinaryServerFormatterSinkProvider.TypeFilterLevel
BinaryFormatter.FilterLevel

Основные понятия

Конфигурация удаленных приложений