Я использовал следующий код в ряде приложений для загрузки сборников .DLL, которые выставляют плагины.
Однако раньше я всегда был связан с функциональностью, а не с безопасностью.
Теперь я планирую использовать этот метод в веб-приложении, которое может использоваться группами, отличными от меня, и я хотел бы удостовериться, что безопасность этой функции является актуальной.
private void LoadPlugins(string pluginsDirectory)
{
List<IPluginFactory> factories = new List<IPluginFactory>();
foreach (string path in Directory.GetFiles(pluginsDirectory, "*.dll"))
{
Assembly assembly = Assembly.LoadFile(path);
foreach (Type type in assembly.GetTypes())
{
IPluginEnumerator instance = null;
if (type.GetInterface("IPluginEnumerator") != null)
instance = (IPluginEnumerator)Activator.CreateInstance(type);
if (instance != null)
{
factories.AddRange(instance.EnumerateFactories());
}
}
}
// Here, I would usually collate the plugins into List<ISpecificPlugin>, etc.
}
Первые мои проблемы:
- Эта функция считывает весь каталог и не заботится о том, какие сборки он загружает, а вместо этого просто загружает все из них. Есть ли способ определить, является ли сборка действительной функциональной сборкой .NET перед ее загрузкой с помощью Assembly.LoadFile()?
- Какую обработку исключений следует добавить к функции, чтобы предотвратить инициализацию сборки от остановки моего кода?
- Если я хочу запретить сборке право делать следующее: читать/записывать файлы, читать/записывать реестр и т.д., как бы я это сделал?
Есть ли другие проблемы безопасности, о которых я должен беспокоиться?
РЕДАКТИРОВАТЬ: Имейте в виду, что я хочу, чтобы кто-нибудь мог написать плагин, но я все еще хочу быть в безопасности.