gpt4 book ai didi

.net - 在 .NET Web 应用程序中实现不受信任的插件

转载 作者:行者123 更新时间:2023-12-02 13:21:36 24 4
gpt4 key购买 nike

我想开发一个接受来自用户社区的插件的应用程序,类似于 Chrome 或 Firefox 的做法。这将是一个 Web 应用程序,因此各个用户的应用程序的每个“实例”将运行不同的插件(插件将作为单例实例加载,但仅对某些用户“事件”)。我计划在 .NET 中实现该应用程序,并尝试为插件模型提出一个架构。

这是我想要的属性:

  • 插件完全在我的核心应用程序之外构建,作为单独的程序集。
  • 插件在自己的“锁定”、低信任环境中运行。可能是一个单独的AppDomain。
  • 插件只能通过我提供的 API 进行操作。例如。我将向它们传递某种外观作为接口(interface),它们只能调用该外观,而不能调用任何其他程序集。我不能拥有可以在网络服务器上任意执行操作的插件,例如影响文件系统。
  • 插件中的致命崩溃不会影响核心应用程序的稳定性。

似乎 System.AddIn 是我最好的选择,但我不清楚如何强制加载的插件仅通过我提供的 API 工作,而不加载任何其他程序集。 System.AddIn 提供该功能吗?另外,System.AddIn 可以与 ASP.NET/IIS 一起使用吗?

除了 System.Addin 之外,我还有哪些其他选项?

最佳答案

看来您最关心的是隔离(为了安全性和鲁棒性)。

因此,您最好的选择是在单独的 AppDomain 中激活您的插件。在此域中,您可以控制允许加载哪些程序集(请参阅 AppDomainSetup 类)。

您的主代码也将受到保护,免受插件内发生的任何意外情况的影响:所有插件方法都必须使用核心对象的副本(除非您传递的对象是从 MarshalByRefObject 继承的,在这种情况下,所有的赌注都是离开)。插件方法中的异常可以通过将所有调用包装在 try except 中或通过 AppDomain 的 UnhandledExcption 事件来处理。

请记住,跨越 AppDomain 边界会带来性能损失。该调用本质上是远程调用。

另一个潜在的问题是您计划如何管理 AppDomain。我从未尝试在一个进程中创建多个 AppDomain,但我预计这里会遇到麻烦。在单个域中组合多个用户的插件会对您尝试构建的保护提出挑战

回应@RationalGeek问题 - UnhandledException event允许这样做 - 有点。您可以在核心域和插件域中订阅此事件,但这样做存在很多不确定性 - 请参阅我引用的文章以获取更多详细信息。可能更好的选择是将每次对 API 的调用包装在 try/except 中

关于.net - 在 .NET Web 应用程序中实现不受信任的插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15743452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com