Подтвердить что ты не робот

Как отрицать отражение с помощью ReflectionPermission

Я пытаюсь добавить аддоны в свое приложение, но я не хочу, чтобы аддон использовал отражение вообще, аддон-код может быть в виде песочницы с помощью Application Domain.

Я нашел AppDomain в MSDN, но не имеет ссылок на ReflectionPermision, а также атрибут безопасности Deny обесценивается, многие атрибуты амортизируются, как мне остановить отражение?

4b9b3361

Ответ 1

Чтобы использовать AppDomain.CreateDomain для создания изолированного appdomain, вы должны передать PermissionSet, который содержит только разрешения, которые вы хотите предоставить изолированным сборкам. Если вы не хотите предоставлять ReflectionPermission, вы просто не должны добавлять его в набор разрешений.

Тем не менее ReflectionPermission далека от единственного "опасного" разрешения, которое обычно должно быть отказано в надстройках общего источника. Если вы хотите быть очень строгим, вам может потребоваться предоставить только SecurityPermission\Execution. например:.

PermissionSet permissionSet = new PermissionSet(PermissionState.None);
permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

Если вы хотите включить дополнительные "безопасные" разрешения, вы можете просто добавить их в набор разрешений, используя дополнительные вызовы AddPermission. Если вы хотите включить все разрешения, которые считались достаточно безопасными для предоставления интернет-кода, находящегося под дефинированной системой политики CAS, вы можете извлечь их, передав доказательства интернет-зоны в статический метод SecurityManager.GetStandardSandbox. например:.

Evidence evidence = new Evidence();
evidence.AddHostEvidence(new Zone(SecurityZone.Internet));

PermissionSet permissionSet = SecurityManager.GetStandardSandbox(evidence);

N.B.: Оба этих подхода описаны в статье MSDN, на которую вы ссылались в своем вопросе.

Ответ 2

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