【问题标题】:How to control the accessibility of .net api while loading external .net dll assembly?如何在加载外部 .net dll 程序集时控制 .net api 的可访问性?
【发布时间】:2018-03-27 01:48:42
【问题描述】:

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

【问题讨论】:

  • 您不能限制在 .net 中运行的代码。 .net 核心没有信任级别,并且被发现已被破坏。
  • 必须有一些解决方案来限制,但我不知道该怎么做。见the official online code tester@Daniel A. White
  • 你可以在 docker 容器中运行它。那会更加孤立
  • 不,它实际上并没有解决问题,因为外部 dll 也会影响当前服务@Daniel A. White
  • 否 - 定义 dll 必须实现的合约。使其成为控制台应用程序或 Web 应用程序。但要求消费者将其写在 docker 容器中。针对该服务运行 - 您可以跳过容器或不为您的应用程序

标签: c# asp.net-core .net-core asp.net-core-2.0 system.reflection


【解决方案1】:

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

但是,如果您仍想从外部源运行代码(无论是否为 .NET Core),则有多种选择。

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

  • 使用 Docker。 Docker 容器确实是隔离的,未经你的许可不能直接接触外界。这就是 .NET 示例的运行方式。除非您允许他们这样做,否则他们不会对主机造成损害。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多