Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过反射加载程序集的风险_C#_Security_Reflection - Fatal编程技术网

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

C# 通过反射加载程序集的风险,c#,security,reflection,C#,Security,Reflection,这是我的后续工作,我想在加载程序集之前检查程序集的strong名称(通过硬盘上的文件或字节数据)。以确保它是由我创建的 使用< 程序集> LoadFrom < /代码>或组件>加载时,是否可以通过将其加载到这些变量中来执行恶意代码?我应该考虑在AppDead中加载这些程序集来读取它们吗? 以下是我的其余代码: Assembly dll = Assembly.LoadFrom("UnauthorisedPlugin.dll"); byte[] thisDllKey = Assembly.

这是我的后续工作,我想在加载程序集之前检查程序集的strong名称(通过硬盘上的文件或字节数据)。以确保它是由我创建的

<>使用< <代码>程序集> LoadFrom < /代码>或<代码>组件>加载<代码>时,是否可以通过将其加载到这些变量中来执行恶意代码?我应该考虑在AppDead中加载这些程序集来读取它们吗?

以下是我的其余代码:

  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();

您可以通过以仅反射模式加载程序集来缓解其中的一些问题:

仅反射加载上下文允许您检查程序集 为其他平台或.NET的其他版本编译 框架只能检查加载到此上下文中的代码;信息技术 无法执行。这意味着无法创建对象,因为 无法执行构造函数

可以使用
Assembly.ReflectionOnlyLoad()
Assembly.ReflectionOnlyLoadFrom()
执行此操作


有关更多信息,请参见此处-

可以将修改后的插件写入插件目录的攻击者很可能也能够写入应用程序目录本身(因为存储插件目录的最安全位置位于应用程序目录内)。由于攻击者可以写入该位置,因此它还可以使用删除安全检查的exe替换您的.exe


换句话说,检查程序集的SNK并没有那么有用。

只加载反射怎么样@劳埃德:看起来这正是我想要的——非常感谢!