Безопасность и сериализация
Обновлен: Ноябрь 2007
Так как использование сериализации может дать возможность другому коду просмотреть или изменить данные экземпляра объекта, которые в ином случае являются недоступными, коду, выполняющему сериализацию, требуется специальное разрешение: SecurityPermission с установленным флагом SerializationFormatter. В случае использования политики безопасности, принятой по умолчанию, такое разрешение не предоставляется коду, загруженному из Интернета или интрасети, оно дается только коду на локальном компьютере.
Обычно сериализуются все поля экземпляра объекта, это означает, что все данные рассматриваемого экземпляра отображаются как серийные данные. Существует возможность того, что коду известен формат сериализованных данных и он способен восстановить по ним исходные данные некоторого члена, независимо от его доступности. Аналогично десериализация извлекает данные из их сериализованной формы и прямым образом задает состояние объекта, опять же независимо от каких-либо правил доступа.
Для любого объекта, содержащего важные для обеспечения безопасности данные, следует, если это возможно, запретить сериализацию. Если же для данного объекта сериализация необходима, следует попытаться отключить сериализацию полей, содержащих эти данные. В случае невозможности этого, учтите, что важные данные будут предоставлены любому коду, имеющему разрешение на сериализацию, и убедитесь, что никакой злонамеренный код не сможет получить такого разрешения.
Интерфейс ISerializable предназначен для использования только инфраструктурой сериализации. Тем не менее, если он не защищен должным образом, существует возможность потери через него важной информации. Если пользовательская сериализация обеспечивается реализацией ISerializable, убедитесь, что вы приняли следующие меры предосторожности.
Метод GetObjectData должен быть явным образом защищен либо затребованием разрешения SecurityPermission с указанием разрешения SerializationFormatter, либо проверкой того, что выходные данные метода не раскрывают важную информацию. Например:
Public Overrides<SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter := True)> _ Sub GetObjectData(info As SerializationInfo, context As StreamingContext) End Sub
[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter =true)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { }
Специальный конструктор, используемый для сериализации, должен также осуществлять тщательную проверку входных данных и являться либо защищенным, либо закрытым, чтобы исключить неправильное его использование вредоносным кодом. Следует производить такие же проверки безопасности и наличия необходимых разрешений при попытках получить экземпляр подобного класса любыми другими методами, такими как явное создание класса или неявное создание класса с помощью каких-либо механизмов.