我在许多应用程序中使用了以下代码来加载暴露插件的.DLL程序集.
但是,我以前总是关注功能而不是安全性.
我现在计划在Web应用程序上使用此方法,该应用程序可供我以外的组使用,并且我希望确保该功能的安全性是最好的.
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.
}
Run Code Online (Sandbox Code Playgroud)
我头几个问题:
我应该担心还有其他安全问题吗?
编辑:请记住,我希望任何人能够编写插件,但我仍然希望是安全的.
这是我之前的问题的后续内容,我想在加载之前检查程序集的StrongName(通过硬盘上的文件或通过字节数据).确保它是由我创造的.
使用时是否存在安全风险,Assembly.LoadFrom或者Assembly.Load通过将恶意代码加载到这些变量中来执行恶意代码?我应该考虑在AppDomain中加载这些程序集来读取它们吗?
这是我的其余代码:
Assembly dll = Assembly.LoadFrom("UnauthorisedPlugin.dll");
byte[] thisDllKey = Assembly.GetExecutingAssembly().GetName().GetPublicKey();
byte[] dllKey = dll.GetName().GetPublicKey();
if (Enumerable.SequenceEqual(thisDllKey, dllKey))
{
Type pluginType = dll.GetTypes().Single();
IPlugin unauthPlugin = (IPlugin)Activator.CreateInstance(pluginType);
Console.WriteLine(unauthPlugin.Run());
}
else
{
Console.WriteLine("The DLL is not authorised");
}
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)