相关疑难解决方法(0)

.NET程序集插件安全性

我在许多应用程序中使用了以下代码来加载暴露插件的.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)

我头几个问题:

  1. 此函数读取整个目录,并不关心它加载的程序集,而只是加载所有程序集.有没有办法在使用Assembly.LoadFile()加载程序集之前检测程序集是否是有效的功能.NET程序集?
  2. 应该在函数中添加什么样的异常处理,以防止程序集初始化停止我的代码?
  3. 如果我想否认程序集有权执行以下操作:读/写文件,读/写注册表等,我该怎么做?

我应该担心还有其他安全问题吗?

编辑:请记住,我希望任何人能够编写插件,但我仍然希望是安全的.

c# security reflection plugins

11
推荐指数
1
解决办法
4167
查看次数

通过反射加载程序集的风险

这是我之前的问题的后续内容,我想在加载之前检查程序集的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)

c# security reflection

2
推荐指数
1
解决办法
222
查看次数

标签 统计

c# ×2

reflection ×2

security ×2

plugins ×1