Я не знаю, является ли это лучшим способом, но когда вы вызываете LoadFile для недопустимой сборки, вы получите исключение BadImageFOrmatException, поскольку сборка не имеет манифеста.
То, как ваш код написан в настоящее время, вы довольно широко открыты для Атака управления процессом . Любой, кто может получить доступ к каталогу и выпустить сборку, которая реализует ваш интерфейс, может выполнить эту атаку. Им даже не нужно очень хорошо реализовывать интерфейс, они могут просто предоставить конструктор по умолчанию и нанести ему весь ущерб. Это позволяет злоумышленнику выполнять код под привилегией вашего приложения, что всегда плохо.
Таким образом, ваша единственная текущая защита - это защита доступа к каталогу на уровне ОС. Это может сработать для вас, но это только один уровень защиты, и вы зависите от состояния безопасности, которое не можете контролировать.
Вот две вещи, на которые вы можете посмотреть:
- Сильное наименование сборки и требование, чтобы сборка была зарегистрирована в GAC, скорее всего, самый безопасный способ сделать это. Если вы можете сделать это, вам нужно найти способ предоставить полное имя Assembly вашему приложению и загрузить его с помощью Assembly.Load ().
Однако я сомневаюсь, что вы хотите установить эти плагины в GAC, чтобы вы могли сделать это следующим образом:
- В вашем приложении предоставьте пользователям возможность зарегистрировать плагин, по сути, мини-GAC. Когда они хранятся, вы сохраняете местоположение и название сборки, а также открытый ключ. Это требует, чтобы Ассамблея носила строгое имя.
Таким образом, вы будете загружать только сборки, которые предоставил кто-то с правами на ваше приложение, скорее всего, тот, у кого есть права на добавление плагина. Перед загрузкой сборки вы можете проверить, соответствует ли открытый ключ тому, что было предоставлено при регистрации сборки, чтобы не дать злоумышленнику просто заменить сборку. Этот код довольно прост:
private bool DoPublicKeysCompare(Assembly assembly, byte[] expectedPublicKey)
{
byte[] assemblyKey = assembly.GetName().GetPublicKey();
return expectedPublicKey.SequenceEqual(assemblyKey);
}
Так что теперь, чтобы выполнить атаку на вас, я должен каким-то образом получить привилегию изменить значение PublicToken и получить доступ к каталогу и изменить файл.