Соображения о безопасности для отражения
Обновлен: Ноябрь 2007
Отражение предоставляет возможность получения сведений от типах и элементах, а также получения доступа к элементам. Получение доступа к закрытым элементам может привести к возникновению угроз безопасности. Поэтому код, который получает доступ к закрытым элементам, нуждается в разрешении ReflectionPermission с соответствующими флагами. Кроме того, разрешение SecurityPermission необходимо для некоторых задач, таких как предоставление свидетельства, выполнение неуправляемого кода и сериализация объектов.
При выполнении перечисленных ниже задач в коде допускается использование отражения даже в отсутствие специальных разрешений:
Перечислите типы и элемента и изучите их метаданные.
Перечислите и просмотрите сборки и модули.
Получите доступ к открытым элементам.
Получите доступ к элементам protected базовых классов вызывающего кода. (В отражении это называется доступом на уровне семьи.)
Получите доступ к элементам internal (элементы Friend в Visual Basic) в сборке вызывающего кода. (В отражении это называется доступом на уровне сборки.)
Доступ к закрытым элементам
Чтобы использовать отражение для вызова элементов, к которым нельзя получить доступ в соответствии с правилами доступа среды CLR, коду необходимо предоставить два разрешения:
Чтобы разрешить коду вызывать любые закрытые элементы: ReflectionPermission с флагом ReflectionPermissionFlag.MemberAccess.
Примечание. По умолчанию политика безопасности запрещает использование этого разрешения кодом, который происходит из сети Интернет. Это разрешение никогда не должно предоставляться коду, исходящему из Интернета.
Чтобы разрешить коду вызывать любой закрытый элемент, если только набор правил сборки, содержащей вызываемый элемент, такой же, как и набор правил сборки, содержащий вызываемый код, или является его поднабором: ReflectionPermission с флагом ReflectionPermissionFlag.RestrictedMemberAccess.
Предположим, домену приложения были предоставлены интернет-разрешения и разрешение ReflectionPermission с ReflectionPermissionFlag.RestrictedMemberAccess, а затем было запущено интернет-приложение с двумя сборками, A и B.
Сборка A может использовать отражение для доступа к закрытым элементам сборки B, потому что набор правил сборки B не содержит таких разрешений, которые были предоставлены сборке A.
Сборка A не может использовать отражение для доступа к закрытым элементам сборок .NET Framework, таких как mscorlib.dll, потому что mscorlib.dll имеет полное доверие и поэтому содержит разрешения, которые не были предоставлены сборке A. Исключение MemberAccessException создается, если управление доступом для кода проходит по стеку во время выполнения.
Пример изолированного домена приложения, который предоставляет разрешение ReflectionPermission с флагом ReflectionPermissionFlag.RestrictedMemberAccess см. в разделе Пошаговое руководство. Выпуск кода в сценариях частичного доверия.
Сериализация
Для сериализации разрешение SecurityPermission с флагом SecurityPermissionAttribute.SerializationFormatter предоставляет возможность получать и задавать элементы сериализуемых типов независимо от уровня доступа. Это разрешение позволяет программному коду получать и изменять закрытые сведения о состоянии экземпляра. (Помимо наличия соответствующих разрешений, необходимо, чтобы тип был помечен в метаданных как сериализуемый.)
Проверки запросов компоновки
Если метод или делегат содержит LinkDemand для разрешения P, среда выполнения будет выполнять проверку запроса компоновки в объекте, вызывающем метод или делегат, для проверки предоставления вызывающему объекту разрешения P. Эта проверка запроса компоновки происходит как для обнаружения сведений типа, так и для вызова.
Избегайте создания параметров типа MethodInfo
Избегайте записи открытых интерфейсов API, которые принимают параметры MethodInfo, особенно для кода с высоким уровнем доверия. Такие интерфейсы API могут оказаться более уязвимыми для вредоносного кода. Например, рассмотрим открытый интерфейс API в доверенном коде, принимающий параметр MethodInfo. Предположим, что открытый интерфейс API косвенным путем вызывает метод Invoke для передаваемого параметра. Если открытый интерфейс API не выполняет необходимую проверку разрешений, вызов метода Invoke всегда будет успешным, поскольку система безопасности определит, что вызывающий код является полностью доверенным. Даже если вредоносный код не имеет разрешения на непосредственный вызов метода, он все равно сможет сделать это косвенным путем, вызвав открытый интерфейс API.
Сведения о версии
Флаг ReflectionPermissionFlag.RestrictedMemberAccess представлен в .NET Framework версия 2.0, с пакетом обновления 1. Более ранние версии .NET Framework нуждаются во флаге ReflectionPermissionFlag.MemberAccess для кода , использующего отражение в целях доступа к закрытым элементам. Это разрешение, которое никогда не должно предоставляться коду с частичным доверием.
Примечание. |
---|
Чтобы использовать флаг ReflectionPermissionFlag.RestrictedMemberAccess, приложение должно работать с .NET Framework, версия 3.5. Дополнительные сведения см. в разделе .Архитектура платформы .NET Framework версии 3.5. |
Начиная с .NET Framework 2.0, использование отражения для получения сведений о закрытых типах и элементах не требует никаких разрешений. В более ранних версиях требовался разрешение ReflectionPermission с флагом ReflectionPermissionFlag.TypeInformation.
См. также
Основные понятия
Вопросы безопасности в порождаемом отражении
Доступ к пользовательским атрибутам