C# 如何在加载外部.net dll程序集时控制.net api的可访问性?

C# 如何在加载外部.net dll程序集时控制.net api的可访问性?,c#,asp.net-core,.net-core,asp.net-core-2.0,system.reflection,C#,Asp.net Core,.net Core,Asp.net Core 2.0,System.reflection,我需要允许一些用户上传一些将在服务器上运行的插件dll(基于asp.net内核)作为一些自定义脚本(我不想使用javascript或任何其他语言来限制api的可访问性)。 如何防止用户DLL访问System.IO等.net API以避免我的服务器上出现潜在的安全问题?。net Core不提供任何代码沙盒、隔离和代码安全功能,就像以前版本的.net Framework在AppDomains和信任设置中所做的那样。这些特性被发现是不安全的,并且从一开始就从.NET核心中被忽略 但是,如果您仍然希望从

我需要允许一些用户上传一些将在服务器上运行的插件dll(基于asp.net内核)作为一些自定义脚本(我不想使用javascript或任何其他语言来限制api的可访问性)。
如何防止用户DLL访问System.IO等.net API以避免我的服务器上出现潜在的安全问题?

。net Core不提供任何代码沙盒、隔离和代码安全功能,就像以前版本的.net Framework在AppDomains和信任设置中所做的那样。这些特性被发现是不安全的,并且从一开始就从.NET核心中被忽略

但是,如果您仍然希望从外部源运行代码(.NET Core与否),则有几个选项

  • 创建自己的DSL。这就是Salesforce对Apex所做的。如果该语言为开发人员提供了他们所需要的一切,并限制了他们的能力,那么这是一个可靠的选择。JavaScript将是一个很好的选择,因为如果使用.NET JavaScript解释器,您可以定义可以对.NET端进行哪些调用,而不必重新发明轮子。Node.js可以工作,但您会发现它有一个丰富的API用于访问“外部世界”

  • 使用Docker。Docker容器是真正孤立的,未经您允许,不能直接接触外部世界。这就是.NET示例的运行方式。除非您允许他们这样做,否则他们不能损坏主机


每当您将代码加载到流程中时,您都在为他们打开大门,让他们做流程可以做的任何事情。

您不能限制.net中运行的代码。net core没有信任级别,这被发现已被破坏。必须有一些解决方案来限制,但我不知道如何做到这一点。看@Daniel A.White你可以在docker容器中运行它。这将是更孤立的没有它实际上没有解决问题的外部dll也将能够影响当前的服务@Daniel A.Whiteno-定义一个dll必须实现的契约。将其设置为控制台应用程序或web应用程序。但要求消费者将其写入docker容器中。针对该服务运行-您可以跳过容器,也可以不跳过应用程序的容器