#c_sharp #net
В доменах приложений есть такая штука, как политики, которые позволяют ограничить домен в правах. Например, запретить доступ к файловой системе. Однако, работает ли это на практике? Разве, когда делается Unwarp, то сборка из домена не загружается в основной домен? => если сборка вредоносная, то можно запихать в статический конструктор какую-то гадость, например format c => безопасность рушится, даже если домен был ограничен в правах. Или не все так просто, или с доменами работают по другому?
Ответы
Ответ 1
Да, Unwrap загрузит сборку и в основной домен тоже. Поэтому правильно делается по-другому: создается в основной, доверенной, сборке класс-наследник MarshalByRefObject; экземпляр этого класса загружается в новом домене, и ему (доверенному экземпляру) делается Unwrap; все дальнейшее взаимодействие с объектами в новом домене делается через этот объект. Для ситуации плагинов имеет смысл для каждого интерфейса, который может быть плагином реализован, подготовить свой кросс-доменный прокси для загрузки в домене плагина. В простейшем случае такой прокси будет просто делегировать все вызовы: class FooCrossDomainProxy: MarshalByRefObject, IFoo { private readonly IFoo target; public void FooCrossDomainProxy(IFoo target) { this.target = target; } public void Bar() => target.Bar(); } В более сложном случае этому прокси можно поручить адаптацию интерфейса к кросс-доменному взаимодействию. К примеру, поскольку вызовы между доменами медленные - имеет смысл снижать их число путем объединения методов: class FooCrossDomainProxy: MarshalByRefObject { private readonly IFoo target; public void FooCrossDomainProxy(IFoo target) { this.target = target; } public bool TryBar() { if (!target.CanBar) return false; target.Bar(); return true; } }
Комментариев нет:
Отправить комментарий